import { Skeleton } from '@/components/ui/skeleton'; import { updateProfile } from '@/service/profile.api'; import { useAuth } from '@components/auth/auth-provider'; import AvatarUser, { AvatarUserType } from '@components/avatar/avatar-user'; import RoleBadge from '@components/avatar/role-badge'; import { useAppForm } from '@hooks/use-app-form'; import { m } from '@paraglide/messages'; import { UserCircleIcon } from '@phosphor-icons/react'; import { ProfileInput, profileUpdateSchema } from '@service/profile.schema'; import { useMutation, useQueryClient } from '@tanstack/react-query'; import { Card, CardContent, CardHeader, CardTitle } from '@ui/card'; import { Field, FieldGroup, FieldLabel } from '@ui/field'; import { Input } from '@ui/input'; import { useRef } from 'react'; import { toast } from 'sonner'; const defaultValues: ProfileInput = { name: '', image: undefined, }; const ProfileForm = () => { const fileInputRef = useRef(null); const { session, isPending } = useAuth(); const queryClient = useQueryClient(); const { mutate: updateProfileMutation, isPending: isRunning } = useMutation({ mutationFn: updateProfile, onSuccess: () => { form.reset(); if (fileInputRef.current) { fileInputRef.current.value = ''; } queryClient.refetchQueries({ queryKey: ['auth', 'session'], }); toast.success(m.profile_messages_update_success(), { richColors: true, }); }, onError: (error: ReturnError) => { console.error(error); const code = error.code as Parameters< typeof m.backend_message >[0]['code']; toast.error(m.backend_message({ code }), { richColors: true, }); }, }); const form = useAppForm({ defaultValues: { ...defaultValues, name: session?.user?.name || '', }, validators: { onSubmit: profileUpdateSchema, onChange: profileUpdateSchema, }, onSubmit: async ({ value }) => { const formData = new FormData(); formData.set('name', value.name); if (value.image) { formData.set('file', value.image); } updateProfileMutation({ data: formData }); }, }); if (isPending || !session?.user?.name) { return ; } return ( {m.profile_ui_title()}
{ e.preventDefault(); e.stopPropagation(); form.handleSubmit(); }} >
{(field) => ( field.handleChange(e.target.files?.[0])} /> )}
{(field) => } {m.profile_form_email()} {m.profile_form_role()}
); }; export default ProfileForm;