'use client'; import { useMemo, useState } from 'react'; import { type Preloaded, usePreloadedQuery, useMutation } from 'convex/react'; import { api } from '~/convex/_generated/api'; import { z } from 'zod'; import { zodResolver } from '@hookform/resolvers/zod'; import { useForm } from 'react-hook-form'; import { CardContent, CardDescription, CardHeader, CardTitle, Form, FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage, Input, SubmitButton, Switch, } from '@/components/ui'; import { toast } from 'sonner'; const formSchema = z.object({ name: z .string() .trim() .min(5, { message: 'Full name is required & must be at least 5 characters.', }) .max(50, { message: 'Full name must be less than 50 characters.', }), email: z.email({ message: 'Please enter a valid email address.', }), lunchTime: z .string() .trim() .min(3, { message: 'Must be a valid 24-hour time. Example: 13:00' }), automaticLunch: z.boolean(), }); type UserInfoFormProps = { preloadedUser: Preloaded; }; export const UserInfoForm = ({ preloadedUser }: UserInfoFormProps) => { const user = usePreloadedQuery(preloadedUser); const [loading, setLoading] = useState(false); const updateUser = useMutation(api.auth.updateUser); const initialValues = useMemo>( () => ({ name: user?.name ?? '', email: user?.email ?? '', lunchTime: user?.lunchTime ?? '12:00', automaticLunch: user?.automaticLunch ?? false, }), [user?.name, user?.email, user?.lunchTime, user?.automaticLunch], ); const form = useForm>({ resolver: zodResolver(formSchema), values: initialValues, }); const handleSubmit = async (values: z.infer) => { const name = values.name.trim(); const email = values.email.trim().toLowerCase(); const lunchTime = values.lunchTime.trim(); const automaticLunch = values.automaticLunch; const patch: Partial<{ name: string; email: string; lunchTime: string; automaticLunch: boolean; }> = {}; if (name !== (user?.name ?? '') && name !== undefined) patch.name = name; if (email !== (user?.email ?? '') && email !== undefined) patch.email = email; if (lunchTime !== (user?.lunchTime && '') && lunchTime !== undefined) patch.lunchTime = lunchTime; if (automaticLunch !== user?.automaticLunch && automaticLunch !== undefined) patch.automaticLunch = automaticLunch; if (Object.keys(patch).length === 0) return; setLoading(true); try { await updateUser(patch); form.reset(patch); toast.success('Profile updated successfully.'); } catch (error) { console.error(error); toast.error('Error updating profile.'); } finally { setLoading(false); } }; return ( <> Account Information Update your account information here.
( Full Name Your public display name. )} /> ( Email Your email address associated with your account. )} />
(
Lunch Time
Your regular lunch time. {!user?.lunchTime && 'Not currently set.'}
)} /> (
Automatic Lunch
Automatically take your lunch at the time you specify.
)} />
Save Changes
); };