import React, { useState, useEffect } from 'react'; import { Mail, Lock, AlertCircle } from 'lucide-react'; import { Button, Input, Label, Alert, AlertDescription, Dialog, DialogContent, DialogHeader, DialogTitle, DialogFooter, } from '@/components'; import ErrorIcon from '@/assets/icons/error.svg'; import { useToast } from '@/lib/hooks/useToast'; import { useUsers } from '@/features/auth/hooks/useUsers'; import { emailSchema } from '@insforge/shared-schemas'; import { z } from 'zod'; interface User { id?: string; email: string; password?: string; name?: string; } interface UserFormDialogProps { open: boolean; onOpenChange: (open: boolean) => void; user?: User | null; } // Validation helpers const validateEmail = (email: string): string => { if (!email.trim()) { return 'Cannot leave empty'; } try { emailSchema.parse(email); return ''; } catch (error) { if (error instanceof z.ZodError) { return 'Incorrect format'; } return 'Invalid email'; } }; const validatePassword = (password: string): string => { if (!password.trim()) { return 'Cannot leave empty'; } return ''; }; export function UserFormDialog({ open, onOpenChange, user }: UserFormDialogProps) { const [email, setEmail] = useState(''); const [password, setPassword] = useState(''); const [loading, setLoading] = useState(false); const [error, setError] = useState(''); // Validation states const [emailError, setEmailError] = useState(''); const [passwordError, setPasswordError] = useState(''); const [showValidation, setShowValidation] = useState(false); const { showToast } = useToast(); const { refetch, register } = useUsers(); const isEditing = !!user; useEffect(() => { if (user) { setEmail(user.email); setPassword(''); } else { setEmail(''); setPassword(''); } setError(''); setEmailError(''); setPasswordError(''); setShowValidation(false); }, [user, open]); const handleEmailChange = (e: React.ChangeEvent) => { setEmail(e.target.value); // Clear error when user starts typing if (emailError && showValidation) { const error = validateEmail(e.target.value); setEmailError(error); } }; const handlePasswordChange = (e: React.ChangeEvent) => { setPassword(e.target.value); // Clear error when user starts typing if (passwordError && showValidation) { const error = validatePassword(e.target.value); setPasswordError(error); } }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); setError(''); // Validate all fields const emailValidationError = validateEmail(email); const passwordValidationError = validatePassword(password); setEmailError(emailValidationError); setPasswordError(passwordValidationError); setShowValidation(true); if (emailValidationError || passwordValidationError) { return; } setLoading(true); try { const userData: User = { email }; if (password) { userData.password = password; } if (isEditing && user?.id) { userData.id = user.id; } await register({ email: userData.email, password: userData.password || '', name: userData.name, }); void refetch(); onOpenChange(false); showToast('User created successfully', 'success'); } catch (err) { showToast(err instanceof Error ? err.message : 'Failed to create user', 'error'); } finally { setLoading(false); } }; return ( Add User
{ void handleSubmit(e); }} className="flex flex-col" >
{/* Email Field */}
{emailError && showValidation && (
Error

{emailError}

)}
{/* Password Field */}
{passwordError && showValidation && (
Error

{passwordError}

)}
{/* Error Alert */} {error && (
{error}
)}
{/* Footer Buttons */}
); } export default UserFormDialog;