'use client'; import { useEffect, useState } from 'react'; import { Dialog, DialogTitle, DialogContent, DialogActions, } from '../../utils'; import { Button, TextField } from '../../inputs'; export type FormField = { name: string; label: string; type?: string; required?: boolean; defaultValue?: string | number | boolean; }; export type FormDialogProps = { open: boolean; title: string; fields: FormField[]; initialData?: Record; onClose: () => void; onSubmit: (data: Record) => Promise; submitLabel?: string; testId?: string; }; /** * FormDialog - A reusable form dialog component. * Renders a dynamic form based on field definitions. */ export function FormDialog({ open, title, fields, initialData, onClose, onSubmit, submitLabel = 'Submit', testId, }: FormDialogProps) { const [formData, setFormData] = useState>({}); const [loading, setLoading] = useState(false); useEffect(() => { if (initialData) { setFormData(initialData); } else { setFormData({}); } }, [initialData, open]); const handleSubmit = async () => { setLoading(true); try { await onSubmit(formData); setFormData({}); onClose(); } catch (error) { console.error('Form submission error:', error); } finally { setLoading(false); } }; const handleChange = (fieldName: string, value: unknown) => { setFormData((prev) => ({ ...prev, [fieldName]: value, })); }; return ( {title} {fields.map((field) => ( handleChange(field.name, e.target.value)} disabled={loading} sx={{ mb: 2 }} /> ))} ); } export default FormDialog;