Repository: rrs301/AI-Resume-Builder Branch: main Commit: 4d8d1129190f Files: 49 Total size: 97.8 KB Directory structure: gitextract_vnaeaso2/ ├── .eslintrc.cjs ├── .gitignore ├── README.md ├── components.json ├── index.html ├── jsconfig.json ├── package.json ├── postcss.config.js ├── service/ │ ├── AIModal.js │ └── GlobalApi.js ├── src/ │ ├── App.css │ ├── App.jsx │ ├── auth/ │ │ └── sign-in/ │ │ └── index.jsx │ ├── components/ │ │ ├── custom/ │ │ │ └── Header.jsx │ │ └── ui/ │ │ ├── alert-dialog.jsx │ │ ├── button.jsx │ │ ├── dialog.jsx │ │ ├── dropdown-menu.jsx │ │ ├── input.jsx │ │ ├── popover.jsx │ │ ├── sonner.jsx │ │ └── textarea.jsx │ ├── context/ │ │ └── ResumeInfoContext.jsx │ ├── dashboard/ │ │ ├── components/ │ │ │ ├── AddResume.jsx │ │ │ └── ResumeCardItem.jsx │ │ ├── index.jsx │ │ └── resume/ │ │ ├── [resumeId]/ │ │ │ └── edit/ │ │ │ └── index.jsx │ │ └── components/ │ │ ├── FormSection.jsx │ │ ├── ResumePreview.jsx │ │ ├── RichTextEditor.jsx │ │ ├── ThemeColor.jsx │ │ ├── forms/ │ │ │ ├── Education.jsx │ │ │ ├── Experience.jsx │ │ │ ├── PersonalDetail.jsx │ │ │ ├── Skills.jsx │ │ │ └── Summery.jsx │ │ └── preview/ │ │ ├── EducationalPreview.jsx │ │ ├── ExperiencePreview.jsx │ │ ├── PersonalDetailPreview.jsx │ │ ├── SkillsPreview.jsx │ │ └── SummeryPreview.jsx │ ├── data/ │ │ └── dummy.jsx │ ├── home/ │ │ └── index.jsx │ ├── index.css │ ├── lib/ │ │ └── utils.js │ ├── main.jsx │ └── my-resume/ │ └── [resumeId]/ │ └── view/ │ └── index.jsx ├── tailwind.config.js └── vite.config.js ================================================ FILE CONTENTS ================================================ ================================================ FILE: .eslintrc.cjs ================================================ module.exports = { root: true, env: { browser: true, es2020: true }, extends: [ 'eslint:recommended', 'plugin:react/recommended', 'plugin:react/jsx-runtime', 'plugin:react-hooks/recommended', ], ignorePatterns: ['dist', '.eslintrc.cjs'], parserOptions: { ecmaVersion: 'latest', sourceType: 'module' }, settings: { react: { version: '18.2' } }, plugins: ['react-refresh'], rules: { 'react/jsx-no-target-blank': 'off', 'react-refresh/only-export-components': [ 'warn', { allowConstantExport: true }, ], }, } ================================================ FILE: .gitignore ================================================ # Logs logs *.log npm-debug.log* yarn-debug.log* yarn-error.log* pnpm-debug.log* lerna-debug.log* node_modules dist dist-ssr *.local .env*.local .env # Editor directories and files .vscode/* !.vscode/extensions.json .idea .DS_Store *.suo *.ntvs* *.njsproj *.sln *.sw? ================================================ FILE: README.md ================================================ ![React AI Resume Builder](https://github.com/rrs301/AI-Resume-Builder/assets/20216436/0a78231c-754e-4f2e-94b0-ae9474cbf613) # React + Vite This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules. Currently, two official plugins are available: - [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/README.md) uses [Babel](https://babeljs.io/) for Fast Refresh - [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh ================================================ FILE: components.json ================================================ { "$schema": "https://ui.shadcn.com/schema.json", "style": "default", "rsc": false, "tsx": false, "tailwind": { "config": "tailwind.config.js", "css": "src/index.css", "baseColor": "neutral", "cssVariables": true, "prefix": "" }, "aliases": { "components": "@/components", "utils": "@/lib/utils" } } ================================================ FILE: index.html ================================================ AI Resume Builder
================================================ FILE: jsconfig.json ================================================ { "compilerOptions": { // ... "baseUrl": ".", "paths": { "@/*": [ "./src/*" ] } // ... } } ================================================ FILE: package.json ================================================ { "name": "ai-resume-builder", "private": true, "version": "0.0.0", "type": "module", "scripts": { "dev": "vite", "build": "vite build", "lint": "eslint . --ext js,jsx --report-unused-disable-directives --max-warnings 0", "preview": "vite preview" }, "dependencies": { "@clerk/clerk-react": "^5.2.4", "@google/generative-ai": "^0.12.0", "@radix-ui/react-alert-dialog": "^1.0.5", "@radix-ui/react-dialog": "^1.0.5", "@radix-ui/react-dropdown-menu": "^2.0.6", "@radix-ui/react-popover": "^1.0.7", "@radix-ui/react-slot": "^1.0.2", "@smastrom/react-rating": "^1.5.0", "axios": "^1.7.2", "class-variance-authority": "^0.7.0", "clsx": "^2.1.1", "lucide-react": "^0.394.0", "next-themes": "^0.3.0", "react": "^18.2.0", "react-dom": "^18.2.0", "react-router-dom": "^6.23.1", "react-simple-wysiwyg": "^3.0.2", "react-to-pdf": "^1.0.1", "react-web-share": "^2.0.2", "sonner": "^1.5.0", "tailwind-merge": "^2.3.0", "tailwindcss-animate": "^1.0.7", "uuid": "^10.0.0" }, "devDependencies": { "@types/node": "^20.14.2", "@types/react": "^18.2.66", "@types/react-dom": "^18.2.22", "@vitejs/plugin-react": "^4.2.1", "autoprefixer": "^10.4.19", "eslint": "^8.57.0", "eslint-plugin-react": "^7.34.1", "eslint-plugin-react-hooks": "^4.6.0", "eslint-plugin-react-refresh": "^0.4.6", "postcss": "^8.4.38", "tailwindcss": "^3.4.4", "vite": "^5.2.0" } } ================================================ FILE: postcss.config.js ================================================ export default { plugins: { tailwindcss: {}, autoprefixer: {}, }, } ================================================ FILE: service/AIModal.js ================================================ // const { // GoogleGenerativeAI, // HarmCategory, // HarmBlockThreshold, // } = require("@google/generative-ai"); import { GoogleGenerativeAI } from "@google/generative-ai"; const apiKey =import.meta.env.VITE_GOOGLE_AI_API_KEY; const genAI = new GoogleGenerativeAI(apiKey); const model = genAI.getGenerativeModel({ model: "gemini-1.5-flash", }); const generationConfig = { temperature: 1, topP: 0.95, topK: 64, maxOutputTokens: 8192, responseMimeType: "application/json", }; export const AIChatSession = model.startChat({ generationConfig, // safetySettings: Adjust safety settings // See https://ai.google.dev/gemini-api/docs/safety-settings history: [ ], }); ================================================ FILE: service/GlobalApi.js ================================================ import axios from "axios"; const API_KEY=import.meta.env.VITE_STRAPI_API_KEY; const axiosClient=axios.create({ baseURL:import.meta.env.VITE_API_BASE_URL+"/api/", headers:{ 'Content-Type':'application/json', 'Authorization':`Bearer ${API_KEY}` } }) const CreateNewResume=(data)=>axiosClient.post('/user-resumes',data); const GetUserResumes=(userEmail)=>axiosClient.get('/user-resumes?filters[userEmail][$eq]='+userEmail); const UpdateResumeDetail=(id,data)=>axiosClient.put('/user-resumes/'+id,data) const GetResumeById=(id)=>axiosClient.get('/user-resumes/'+id+"?populate=*") const DeleteResumeById=(id)=>axiosClient.delete('/user-resumes/'+id) export default{ CreateNewResume, GetUserResumes, UpdateResumeDetail, GetResumeById, DeleteResumeById } ================================================ FILE: src/App.css ================================================ #root { } .logo { height: 6em; padding: 1.5em; will-change: filter; transition: filter 300ms; } .logo:hover { filter: drop-shadow(0 0 2em #646cffaa); } .logo.react:hover { filter: drop-shadow(0 0 2em #61dafbaa); } @keyframes logo-spin { from { transform: rotate(0deg); } to { transform: rotate(360deg); } } @media (prefers-reduced-motion: no-preference) { a:nth-of-type(2) .logo { animation: logo-spin infinite 20s linear; } } .card { padding: 2em; } .read-the-docs { color: #888; } ================================================ FILE: src/App.jsx ================================================ import { useState } from 'react' import reactLogo from './assets/react.svg' import viteLogo from '/vite.svg' import './App.css' import { Button } from './components/ui/button' import { Navigate, Outlet } from 'react-router-dom' import { useUser } from '@clerk/clerk-react' import Header from './components/custom/Header' import { Toaster } from './components/ui/sonner' function App() { const [count, setCount] = useState(0) const {user,isLoaded,isSignedIn}=useUser(); if(!isSignedIn&&isLoaded) { return } return ( <>
) } export default App ================================================ FILE: src/auth/sign-in/index.jsx ================================================ import { SignIn } from '@clerk/clerk-react' import React from 'react' function SignInPage() { return (
) } export default SignInPage ================================================ FILE: src/components/custom/Header.jsx ================================================ import React from 'react' import { Button } from '../ui/button' import { Link } from 'react-router-dom' import { UserButton, useUser } from '@clerk/clerk-react' function Header() { const { user, isSignedIn } = useUser(); return (
{isSignedIn ?
: }
) } export default Header ================================================ FILE: src/components/ui/alert-dialog.jsx ================================================ import * as React from "react" import * as AlertDialogPrimitive from "@radix-ui/react-alert-dialog" import { cn } from "@/lib/utils" import { buttonVariants } from "@/components/ui/button" const AlertDialog = AlertDialogPrimitive.Root const AlertDialogTrigger = AlertDialogPrimitive.Trigger const AlertDialogPortal = AlertDialogPrimitive.Portal const AlertDialogOverlay = React.forwardRef(({ className, ...props }, ref) => ( )) AlertDialogOverlay.displayName = AlertDialogPrimitive.Overlay.displayName const AlertDialogContent = React.forwardRef(({ className, ...props }, ref) => ( )) AlertDialogContent.displayName = AlertDialogPrimitive.Content.displayName const AlertDialogHeader = ({ className, ...props }) => (
) AlertDialogHeader.displayName = "AlertDialogHeader" const AlertDialogFooter = ({ className, ...props }) => (
) AlertDialogFooter.displayName = "AlertDialogFooter" const AlertDialogTitle = React.forwardRef(({ className, ...props }, ref) => ( )) AlertDialogTitle.displayName = AlertDialogPrimitive.Title.displayName const AlertDialogDescription = React.forwardRef(({ className, ...props }, ref) => ( )) AlertDialogDescription.displayName = AlertDialogPrimitive.Description.displayName const AlertDialogAction = React.forwardRef(({ className, ...props }, ref) => ( )) AlertDialogAction.displayName = AlertDialogPrimitive.Action.displayName const AlertDialogCancel = React.forwardRef(({ className, ...props }, ref) => ( )) AlertDialogCancel.displayName = AlertDialogPrimitive.Cancel.displayName export { AlertDialog, AlertDialogPortal, AlertDialogOverlay, AlertDialogTrigger, AlertDialogContent, AlertDialogHeader, AlertDialogFooter, AlertDialogTitle, AlertDialogDescription, AlertDialogAction, AlertDialogCancel, } ================================================ FILE: src/components/ui/button.jsx ================================================ import * as React from "react" import { Slot } from "@radix-ui/react-slot" import { cva } from "class-variance-authority"; import { cn } from "@/lib/utils" const buttonVariants = cva( "inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50", { variants: { variant: { default: "bg-primary text-primary-foreground hover:bg-primary/90", destructive: "bg-destructive text-destructive-foreground hover:bg-destructive/90", outline: "border border-input bg-background hover:bg-accent hover:text-accent-foreground", secondary: "bg-secondary text-secondary-foreground hover:bg-secondary/80", ghost: "hover:bg-accent hover:text-accent-foreground", link: "text-primary underline-offset-4 hover:underline", }, size: { default: "h-10 px-4 py-2", sm: "h-9 rounded-md px-3", lg: "h-11 rounded-md px-8", icon: "h-10 w-10", }, }, defaultVariants: { variant: "default", size: "default", }, } ) const Button = React.forwardRef(({ className, variant, size, asChild = false, ...props }, ref) => { const Comp = asChild ? Slot : "button" return ( () ); }) Button.displayName = "Button" export { Button, buttonVariants } ================================================ FILE: src/components/ui/dialog.jsx ================================================ import * as React from "react" import * as DialogPrimitive from "@radix-ui/react-dialog" import { X } from "lucide-react" import { cn } from "@/lib/utils" const Dialog = DialogPrimitive.Root const DialogTrigger = DialogPrimitive.Trigger const DialogPortal = DialogPrimitive.Portal const DialogClose = DialogPrimitive.Close const DialogOverlay = React.forwardRef(({ className, ...props }, ref) => ( )) DialogOverlay.displayName = DialogPrimitive.Overlay.displayName const DialogContent = React.forwardRef(({ className, children, ...props }, ref) => ( {children} Close )) DialogContent.displayName = DialogPrimitive.Content.displayName const DialogHeader = ({ className, ...props }) => (
) DialogHeader.displayName = "DialogHeader" const DialogFooter = ({ className, ...props }) => (
) DialogFooter.displayName = "DialogFooter" const DialogTitle = React.forwardRef(({ className, ...props }, ref) => ( )) DialogTitle.displayName = DialogPrimitive.Title.displayName const DialogDescription = React.forwardRef(({ className, ...props }, ref) => ( )) DialogDescription.displayName = DialogPrimitive.Description.displayName export { Dialog, DialogPortal, DialogOverlay, DialogClose, DialogTrigger, DialogContent, DialogHeader, DialogFooter, DialogTitle, DialogDescription, } ================================================ FILE: src/components/ui/dropdown-menu.jsx ================================================ import * as React from "react" import * as DropdownMenuPrimitive from "@radix-ui/react-dropdown-menu" import { Check, ChevronRight, Circle } from "lucide-react" import { cn } from "@/lib/utils" const DropdownMenu = DropdownMenuPrimitive.Root const DropdownMenuTrigger = DropdownMenuPrimitive.Trigger const DropdownMenuGroup = DropdownMenuPrimitive.Group const DropdownMenuPortal = DropdownMenuPrimitive.Portal const DropdownMenuSub = DropdownMenuPrimitive.Sub const DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup const DropdownMenuSubTrigger = React.forwardRef(({ className, inset, children, ...props }, ref) => ( {children} )) DropdownMenuSubTrigger.displayName = DropdownMenuPrimitive.SubTrigger.displayName const DropdownMenuSubContent = React.forwardRef(({ className, ...props }, ref) => ( )) DropdownMenuSubContent.displayName = DropdownMenuPrimitive.SubContent.displayName const DropdownMenuContent = React.forwardRef(({ className, sideOffset = 4, ...props }, ref) => ( )) DropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName const DropdownMenuItem = React.forwardRef(({ className, inset, ...props }, ref) => ( )) DropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName const DropdownMenuCheckboxItem = React.forwardRef(({ className, children, checked, ...props }, ref) => ( {children} )) DropdownMenuCheckboxItem.displayName = DropdownMenuPrimitive.CheckboxItem.displayName const DropdownMenuRadioItem = React.forwardRef(({ className, children, ...props }, ref) => ( {children} )) DropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName const DropdownMenuLabel = React.forwardRef(({ className, inset, ...props }, ref) => ( )) DropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName const DropdownMenuSeparator = React.forwardRef(({ className, ...props }, ref) => ( )) DropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName const DropdownMenuShortcut = ({ className, ...props }) => { return ( () ); } DropdownMenuShortcut.displayName = "DropdownMenuShortcut" export { DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuItem, DropdownMenuCheckboxItem, DropdownMenuRadioItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuGroup, DropdownMenuPortal, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuRadioGroup, } ================================================ FILE: src/components/ui/input.jsx ================================================ import * as React from "react" import { cn } from "@/lib/utils" const Input = React.forwardRef(({ className, type, ...props }, ref) => { return ( () ); }) Input.displayName = "Input" export { Input } ================================================ FILE: src/components/ui/popover.jsx ================================================ import * as React from "react" import * as PopoverPrimitive from "@radix-ui/react-popover" import { cn } from "@/lib/utils" const Popover = PopoverPrimitive.Root const PopoverTrigger = PopoverPrimitive.Trigger const PopoverContent = React.forwardRef(({ className, align = "center", sideOffset = 4, ...props }, ref) => ( )) PopoverContent.displayName = PopoverPrimitive.Content.displayName export { Popover, PopoverTrigger, PopoverContent } ================================================ FILE: src/components/ui/sonner.jsx ================================================ import { useTheme } from "next-themes" import { Toaster as Sonner } from "sonner" const Toaster = ({ ...props }) => { const { theme = "system" } = useTheme() return ( () ); } export { Toaster } ================================================ FILE: src/components/ui/textarea.jsx ================================================ import * as React from "react" import { cn } from "@/lib/utils" const Textarea = React.forwardRef(({ className, ...props }, ref) => { return ( (