import { zodResolver } from "@hookform/resolvers/zod"; import { t } from "@lingui/macro"; import { Check, UploadSimple, Warning } from "@phosphor-icons/react"; import { UpdateUserDto, updateUserSchema } from "@reactive-resume/dto"; import { Button, buttonVariants, Form, FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage, Input, } from "@reactive-resume/ui"; import { cn } from "@reactive-resume/utils"; import { AnimatePresence, motion } from "framer-motion"; import { useEffect, useRef } from "react"; import { useForm } from "react-hook-form"; import { UserAvatar } from "@/client/components/user-avatar"; import { useToast } from "@/client/hooks/use-toast"; import { useResendVerificationEmail } from "@/client/services/auth"; import { useUploadImage } from "@/client/services/storage"; import { useUpdateUser, useUser } from "@/client/services/user"; export const AccountSettings = () => { const { user } = useUser(); const { toast } = useToast(); const { updateUser, loading } = useUpdateUser(); const { uploadImage, loading: isUploading } = useUploadImage(); const { resendVerificationEmail } = useResendVerificationEmail(); const inputRef = useRef(null); const form = useForm({ resolver: zodResolver(updateUserSchema), defaultValues: { picture: "", name: "", username: "", email: "", }, }); useEffect(() => { user && onReset(); }, [user]); const onReset = () => { if (!user) return; form.reset({ picture: user.picture ?? "", name: user.name, username: user.username, email: user.email, }); }; const onSubmit = async (data: UpdateUserDto) => { if (!user) return; // Check if email has changed and display a toast message to confirm the email change if (user.email !== data.email) { toast({ variant: "info", title: t`Check your email for the confirmation link to update your email address.`, }); } await updateUser({ name: data.name, email: data.email, picture: data.picture, username: data.username, }); form.reset(data); }; const onSelectImage = async (event: React.ChangeEvent) => { if (event.target.files && event.target.files.length > 0) { const file = event.target.files[0]; const response = await uploadImage(file); const url = response.data; await updateUser({ picture: url }); } }; const onResendVerificationEmail = async () => { const data = await resendVerificationEmail(); toast({ variant: "success", title: data.message }); }; if (!user) return null; return (

{t`Account`}

{t`Here, you can update your account information such as your profile picture, name and username.`}

(
{t`Picture`} {!user.picture && ( <> inputRef.current?.click()} > )}
)} /> ( {t`Name`} )} /> ( {t`Username`} )} /> ( {t`Email`} {user.emailVerified ? : } {user.emailVerified ? t`Verified` : t`Unverified`} {!user.emailVerified && ( )} )} /> {form.formState.isDirty && ( )}
); };