/** * User Profile Page * * Allows users to view and update their profile information */ '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 { updateUser, changePassword } from '@/lib/api'; // Password update schema const passwordSchema = z .object({ currentPassword: z.string().min(1, 'Current password is required'), newPassword: z .string() .min(12, 'Password must be at least 12 characters') .regex( /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]/, 'Password must contain uppercase, lowercase, number, and special character' ), confirmPassword: z.string().min(1, 'Please confirm your password'), }) .refine(data => data.newPassword === data.confirmPassword, { message: "Passwords don't match", path: ['confirmPassword'], }); type PasswordFormData = z.infer; // Profile update schema const profileSchema = z.object({ firstName: z.string().min(2, 'First name must be at least 2 characters'), lastName: z.string().min(2, 'Last name must be at least 2 characters'), email: z.string().email('Invalid email address'), }); type ProfileFormData = z.infer; export default function ProfilePage() { const { user, refreshUser, loading } = useAuth(); const queryClient = useQueryClient(); const [activeTab, setActiveTab] = useState<'profile' | 'password'>('profile'); const [successMessage, setSuccessMessage] = useState(''); const [errorMessage, setErrorMessage] = useState(''); // Profile form const profileForm = useForm({ resolver: zodResolver(profileSchema), defaultValues: { firstName: user?.firstName || '', lastName: user?.lastName || '', email: user?.email || '', }, }); // Password form const passwordForm = useForm({ resolver: zodResolver(passwordSchema), defaultValues: { currentPassword: '', newPassword: '', confirmPassword: '', }, }); // Update form values when user data loads useEffect(() => { if (user) { profileForm.reset({ firstName: user.firstName, lastName: user.lastName, email: user.email, }); } // eslint-disable-next-line react-hooks/exhaustive-deps }, [user]); // Reset password form when switching to password tab useEffect(() => { if (activeTab === 'password') { passwordForm.reset({ currentPassword: '', newPassword: '', confirmPassword: '', }); } // eslint-disable-next-line react-hooks/exhaustive-deps }, [activeTab]); // Update profile mutation const updateProfileMutation = useMutation({ mutationFn: (data: ProfileFormData) => { if (!user?.id) throw new Error('User ID not found'); return updateUser(user.id, data); }, onSuccess: () => { setSuccessMessage('Profile updated successfully!'); setErrorMessage(''); refreshUser(); queryClient.invalidateQueries({ queryKey: ['user'] }); setTimeout(() => setSuccessMessage(''), 3000); }, onError: (error: any) => { setErrorMessage(error.message || 'Failed to update profile'); setSuccessMessage(''); }, }); // Update password mutation const updatePasswordMutation = useMutation({ mutationFn: async (data: PasswordFormData) => { return changePassword({ currentPassword: data.currentPassword, newPassword: data.newPassword, }); }, onSuccess: () => { setSuccessMessage('Password updated successfully!'); setErrorMessage(''); passwordForm.reset({ currentPassword: '', newPassword: '', confirmPassword: '', }); setTimeout(() => setSuccessMessage(''), 3000); }, onError: (error: any) => { setErrorMessage(error.message || 'Failed to update password'); setSuccessMessage(''); }, }); const handleProfileSubmit = (data: ProfileFormData) => { updateProfileMutation.mutate(data); }; const handlePasswordSubmit = (data: PasswordFormData) => { updatePasswordMutation.mutate(data); }; // Show loading state while user data is being fetched if (loading) { return (

Loading profile...

); } // Show error if user is not found after loading if (!loading && !user) { return (

Unable to load user profile

); } return (
{/* Header */}

My Profile

Manage your account settings and preferences

{/* Success/Error Messages */} {successMessage && (
{successMessage}
)} {errorMessage && (
{errorMessage}
)} {/* User Info Card */}
{user?.firstName?.[0]} {user?.lastName?.[0]}

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

{user?.email}

{user?.role} Active
{/* Tabs */}
{activeTab === 'profile' ? (
{/* First Name */}
{profileForm.formState.errors.firstName && (

{profileForm.formState.errors.firstName.message}

)}
{/* Last Name */}
{profileForm.formState.errors.lastName && (

{profileForm.formState.errors.lastName.message}

)}
{/* Email */}

Email cannot be changed

{/* Submit Button */}
) : (
{/* Current Password */}
{passwordForm.formState.errors.currentPassword && (

{passwordForm.formState.errors.currentPassword.message}

)}
{/* New Password */}
{passwordForm.formState.errors.newPassword && (

{passwordForm.formState.errors.newPassword.message}

)}

Must be at least 12 characters with uppercase, lowercase, number, and special character

{/* Confirm Password */}
{passwordForm.formState.errors.confirmPassword && (

{passwordForm.formState.errors.confirmPassword.message}

)}
{/* Submit Button */}
)}
); }