From 75febaf3cf772e847e98a0bd8266941ac9ccb008 Mon Sep 17 00:00:00 2001 From: Sid-80 Date: Fri, 5 Jul 2024 22:06:03 +0530 Subject: [PATCH 1/4] feat: Multi-Step Form --- app/cover-letter/page.tsx | 14 ++ components/AuthButton.tsx | 33 +++-- components/CoverLetterForm.tsx | 262 +++++++++++++++++++++++++++++++++ components/cover-letter.tsx | 69 +++++++++ components/ui/form.tsx | 176 ++++++++++++++++++++++ components/ui/label.tsx | 26 ++++ components/ui/textarea.tsx | 24 +++ package-lock.json | 205 ++++++++++++++++++++------ package.json | 6 +- 9 files changed, 762 insertions(+), 53 deletions(-) create mode 100644 app/cover-letter/page.tsx create mode 100644 components/CoverLetterForm.tsx create mode 100644 components/cover-letter.tsx create mode 100644 components/ui/form.tsx create mode 100644 components/ui/label.tsx create mode 100644 components/ui/textarea.tsx diff --git a/app/cover-letter/page.tsx b/app/cover-letter/page.tsx new file mode 100644 index 0000000..d062bf6 --- /dev/null +++ b/app/cover-letter/page.tsx @@ -0,0 +1,14 @@ +import CoverLetter from "@/components/cover-letter"; +import { supabaseServer } from "@/utils/supabase/server"; +import React from "react"; + +export default async function Page() { + const supabase = supabaseServer(); + const { data } = await supabase.auth.getUser(); + + return ( +
+ +
+ ); +} diff --git a/components/AuthButton.tsx b/components/AuthButton.tsx index bf89809..c8139ca 100644 --- a/components/AuthButton.tsx +++ b/components/AuthButton.tsx @@ -4,9 +4,10 @@ import { Button } from "./ui/button"; import { GitHubLogoIcon } from "@radix-ui/react-icons"; import { supabaseBrowser } from "@/utils/supabase/client"; import { User } from "@supabase/supabase-js"; -import { useRouter } from "next/navigation"; +import { usePathname, useRouter } from "next/navigation"; import { IconCubeUnfolded, IconLogout } from "@tabler/icons-react"; import { cn } from "@/lib/utils"; +import Link from "next/link"; type AuthButtonProps = { user: User | null; @@ -22,6 +23,7 @@ export default function AuthButton({ className, }: AuthButtonProps) { const router = useRouter(); + const pathname = usePathname(); const [isLoading, setLoading] = useState(false); const handleLoginWithGithub = () => { @@ -44,15 +46,26 @@ export default function AuthButton({ }; return user ? ( - + <> + {pathname.includes("resume") && ( + + Cover-Letter + + )} + + ) : ( + + )} + {isError && ( + <> + + Error + + + Error Occured!! Please try again later. + + + )} + + + ); +} diff --git a/components/CoverLetterForm.tsx b/components/CoverLetterForm.tsx index d507951..246b0b1 100644 --- a/components/CoverLetterForm.tsx +++ b/components/CoverLetterForm.tsx @@ -13,8 +13,9 @@ import { } from "@/components/ui/form"; import { Textarea } from "./ui/textarea"; import { ArrowRightIcon } from "@radix-ui/react-icons"; -import { SetStateAction } from "react"; +import { SetStateAction, useState } from "react"; import { getCoverLetter } from "@/utils/Gemini"; +import Loader from "./Loader"; const formSchema = z.object({ jobDescription: z @@ -52,6 +53,8 @@ export default function CoverLetterForm({ setIsError, setResponse, }: Props) { + const [isLoading, setIsLoading] = useState(false); + const form = useForm>({ resolver: zodResolver(formSchema), defaultValues: { @@ -83,10 +86,8 @@ export default function CoverLetterForm({ } const onSubmit = async (values: z.infer) => { - // Do something with the form values. - // ✅ This will be type-safe and validated. const { jobDescription, project, skills, experience } = values; - + setIsLoading(true); try { const res = await getCoverLetter({ jobDescription, @@ -95,10 +96,14 @@ export default function CoverLetterForm({ experience, }); - console.log(res); + if (res) { + setIsResponseGenerated(true); + setResponse(res); + } } catch (err) { setIsError(true); } + setIsLoading(false); }; return ( @@ -223,7 +228,7 @@ export default function CoverLetterForm({ name="skills" render={({ field }) => ( - Projects + Skills