'use client'; import { useState, useEffect } from 'react'; import { useAuth } from '@/lib/context/auth-context'; import { useMutation, useQueryClient } from '@tanstack/react-query'; import { useForm } from 'react-hook-form'; import { zodResolver } from '@hookform/resolvers/zod'; import { z } from 'zod'; import { useTranslations } from 'next-intl'; import { updateUser, changePassword } from '@/lib/api'; export default function ProfilePage() { const t = useTranslations('dashboard.profile'); const { user, refreshUser, loading } = useAuth(); const queryClient = useQueryClient(); const [activeTab, setActiveTab] = useState<'profile' | 'password'>('profile'); const [successMessage, setSuccessMessage] = useState(''); const [errorMessage, setErrorMessage] = useState(''); const passwordSchema = z .object({ currentPassword: z.string().min(1, t('passwordForm.errors.currentRequired')), newPassword: z .string() .min(12, t('passwordForm.errors.newMin')) .regex( /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]/, t('passwordForm.errors.newComplexity') ), confirmPassword: z.string().min(1, t('passwordForm.errors.confirmRequired')), }) .refine(data => data.newPassword === data.confirmPassword, { message: t('passwordForm.errors.mismatch'), path: ['confirmPassword'], }); type PasswordFormData = z.infer; const profileSchema = z.object({ firstName: z.string().min(2, t('passwordForm.fieldErrors.firstNameMin')), lastName: z.string().min(2, t('passwordForm.fieldErrors.lastNameMin')), email: z.string().email(t('passwordForm.fieldErrors.emailInvalid')), }); type ProfileFormData = z.infer; const profileForm = useForm({ resolver: zodResolver(profileSchema), defaultValues: { firstName: user?.firstName || '', lastName: user?.lastName || '', email: user?.email || '', }, }); const passwordForm = useForm({ resolver: zodResolver(passwordSchema), defaultValues: { currentPassword: '', newPassword: '', confirmPassword: '', }, }); useEffect(() => { if (user) { profileForm.reset({ firstName: user.firstName, lastName: user.lastName, email: user.email, }); } // eslint-disable-next-line react-hooks/exhaustive-deps }, [user]); useEffect(() => { if (activeTab === 'password') { passwordForm.reset({ currentPassword: '', newPassword: '', confirmPassword: '', }); } // eslint-disable-next-line react-hooks/exhaustive-deps }, [activeTab]); const updateProfileMutation = useMutation({ mutationFn: (data: ProfileFormData) => { if (!user?.id) throw new Error('User ID not found'); return updateUser(user.id, data); }, onSuccess: () => { setSuccessMessage(t('profileForm.successUpdate')); setErrorMessage(''); refreshUser(); queryClient.invalidateQueries({ queryKey: ['user'] }); setTimeout(() => setSuccessMessage(''), 3000); }, onError: (error: any) => { setErrorMessage(error.message || t('profileForm.errorUpdate')); setSuccessMessage(''); }, }); const updatePasswordMutation = useMutation({ mutationFn: async (data: PasswordFormData) => { return changePassword({ currentPassword: data.currentPassword, newPassword: data.newPassword, }); }, onSuccess: () => { setSuccessMessage(t('passwordForm.successUpdate')); setErrorMessage(''); passwordForm.reset({ currentPassword: '', newPassword: '', confirmPassword: '', }); setTimeout(() => setSuccessMessage(''), 3000); }, onError: (error: any) => { setErrorMessage(error.message || t('passwordForm.errorUpdate')); setSuccessMessage(''); }, }); const handleProfileSubmit = (data: ProfileFormData) => { updateProfileMutation.mutate(data); }; const handlePasswordSubmit = (data: PasswordFormData) => { updatePasswordMutation.mutate(data); }; if (loading) { return (

{t('loading')}

); } if (!loading && !user) { return (

{t('loadError')}

); } return (

{t('header.title')}

{t('header.subtitle')}

{successMessage && (
{successMessage}
)} {errorMessage && (
{errorMessage}
)}
{user?.firstName?.[0]} {user?.lastName?.[0]}

{user?.firstName} {user?.lastName}

{user?.email}

{user?.role} {t('active')}
{activeTab === 'profile' ? (
{profileForm.formState.errors.firstName && (

{profileForm.formState.errors.firstName.message}

)}
{profileForm.formState.errors.lastName && (

{profileForm.formState.errors.lastName.message}

)}

{t('profileForm.emailHelp')}

) : (
{passwordForm.formState.errors.currentPassword && (

{passwordForm.formState.errors.currentPassword.message}

)}
{passwordForm.formState.errors.newPassword && (

{passwordForm.formState.errors.newPassword.message}

)}

{t('passwordForm.newHint')}

{passwordForm.formState.errors.confirmPassword && (

{passwordForm.formState.errors.confirmPassword.message}

)}
)}
); }