import { useState, useEffect, useMemo } from 'react'; import { useForm } from 'react-hook-form'; import { zodResolver } from '@hookform/resolvers/zod'; import { useQueryClient } from '@tanstack/react-query'; import { AlertCircle } from 'lucide-react'; import { Alert, AlertDescription, Button, Dialog, DialogContent, DialogHeader, DialogTitle, DialogFooter, ScrollArea, } from '@/components'; import { useRecords } from '@/features/database/hooks/useRecords'; import { buildDynamicSchema, getInitialValues } from '@/features/database'; import { RecordFormField } from '@/features/database/components/RecordFormField'; import { cn } from '@/lib/utils/utils'; import { ColumnSchema } from '@insforge/shared-schemas'; import { SYSTEM_FIELDS } from '../helpers'; interface RecordFormDialogProps { open: boolean; onOpenChange: (open: boolean) => void; tableName: string; schema: ColumnSchema[]; onSuccess?: () => void; } export function RecordFormDialog({ open, onOpenChange, tableName, schema, onSuccess, }: RecordFormDialogProps) { const [error, setError] = useState(null); const queryClient = useQueryClient(); const { createRecord, isCreating } = useRecords(tableName); const displayFields = useMemo(() => { const filteredFields = schema.filter((field) => !SYSTEM_FIELDS.includes(field.columnName)); return filteredFields; }, [schema]); const dynamicSchema = useMemo(() => { const schema = buildDynamicSchema(displayFields); return schema; }, [displayFields]); const initialValues = useMemo(() => { const values = getInitialValues(displayFields); return values; }, [displayFields]); const form = useForm({ resolver: zodResolver(dynamicSchema), defaultValues: initialValues, }); useEffect(() => { form.reset(initialValues); }, [displayFields, schema, form, initialValues]); // Clear error state when dialog opens/closes useEffect(() => { if (!open) { setError(null); } }, [open]); const handleSubmit = form.handleSubmit( async (data) => { try { await createRecord(data); void queryClient.invalidateQueries({ queryKey: ['records', tableName] }); void queryClient.invalidateQueries({ queryKey: ['table', tableName] }); onOpenChange(false); form.reset(); setError(null); if (onSuccess) { onSuccess(); } } catch (err) { const errorMessage = err instanceof Error ? err.message : 'Failed to create record'; setError(errorMessage); console.error('Form submission error:', err); } }, (errors) => { console.error('Form validation errors:', errors); } ); return (
void handleSubmit(e)} className="flex flex-col"> Add Record
{displayFields.map((field) => ( ))}
{error && (
{error}
)}
); }