'use client' import { useAuth } from '@thedaviddias/auth' import { Button } from '@thedaviddias/design-system/button' import { AlertCircle, Loader2, X } from 'lucide-react' import { useEffect, useId, useState } from 'react' import { useAnalyticsEvents } from '@/components/analytics-tracker' import { AboutFields } from './edit-profile-about-fields' import { BasicInfoFields } from './edit-profile-basic-fields' import { LinksFields } from './edit-profile-links-fields' import { useProfileForm } from './use-profile-form' import { useUsernameValidation } from './use-username-validation' interface EditProfileModalProps { open: boolean onOpenChange: (open: boolean) => void } /** * Modal component for editing user profile information * @param props - Component props * @param props.open - Whether the modal is open * @param props.onOpenChange - Callback for when modal open state changes */ export function EditProfileModal({ open, onOpenChange }: EditProfileModalProps) { const { user, isLoaded } = useAuth() const uniqueId = useId() const { trackProfileModalOpen } = useAnalyticsEvents() const [formData, setFormData] = useState({ firstName: '', lastName: '', username: '', bio: '', work: '', website: '', linkedin: '' }) const { usernameError, isCheckingUsername, setUsernameError } = useUsernameValidation({ username: formData.username, currentUsername: user?.username || user?.user_metadata?.user_name }) const { isLoading, error, setError, handleSubmit } = useProfileForm({ onSuccess: () => onOpenChange(false), usernameError, isCheckingUsername }) // Track when modal opens for analytics useEffect(() => { if (user && open) { trackProfileModalOpen('profile-edit-modal') } }, [user, open, trackProfileModalOpen]) // Update form when user data loads or modal opens (separate effect to avoid dependency issues) useEffect(() => { if (user && open) { setFormData({ firstName: user.firstName || (user.publicMetadata?.firstName as string) || '', lastName: user.lastName || (user.publicMetadata?.lastName as string) || '', username: user.user_metadata?.user_name || user.username || '', bio: (user.publicMetadata?.bio as string) || '', work: (user.publicMetadata?.work as string) || '', website: (user.publicMetadata?.website as string) || '', linkedin: (user.publicMetadata?.linkedin as string) || '' }) } }, [open, user?.id]) // Only depend on modal open state and user ID /** * Handle form submission for profile updates * @param e - Form submission event */ const onSubmit = (e: React.FormEvent) => { e.preventDefault() handleSubmit(formData) } // Clear errors when modal closes useEffect(() => { if (!open) { setError('') setUsernameError('') } }, [open]) if (!isLoaded || !open) return null return (
{/* Backdrop */}
{error && (
{error}
)}
) }