"use client"; import React, { useState, useEffect } from "react"; import { Stack, Typography, Button, Alert, TextField } from "@mui/material"; import Modal from "@/app/components/Modal/Modal"; import Spinner from "@/app/components/Spinner/Spinner"; import { IAddModalProps } from "./types"; const AddModal: React.FC = ({ open, onClose, onConfirm, resourceType = "item", fields, isLoading = false, error = null, }) => { const [formData, setFormData] = useState>({}); const [validationErrors, setValidationErrors] = useState< Record >({}); useEffect(() => { if (open) { const initialData: Record = {}; fields.forEach(field => { initialData[field.name] = field.defaultValue ?? ""; }); setFormData(initialData); setValidationErrors({}); } }, [open, fields]); const handleChange = ( e: React.ChangeEvent ) => { const { name, value } = e.target; setFormData(prev => ({ ...prev, [name]: value })); if (validationErrors[name]) { setValidationErrors(prev => { const next = { ...prev }; delete next[name]; return next; }); } }; const validateForm = (): boolean => { const errors: Record = {}; fields.forEach(field => { const value = formData[field.name]; const isEmpty = value === undefined || value === null || String(value).trim() === ""; if (field.required && isEmpty) { errors[field.name] = `${field.label} is required`; } if (field.type === "email" && value && !isEmpty) { const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; if (!emailRegex.test(String(value))) { errors[field.name] = "Please enter a valid email address"; } } }); setValidationErrors(errors); return Object.keys(errors).length === 0; }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); if (!validateForm()) { return; } await Promise.resolve(onConfirm(formData)); }; const handleClose = () => { if (!isLoading) { setFormData({}); setValidationErrors({}); onClose(); } }; const title = `Add ${resourceType.charAt(0).toUpperCase() + resourceType.slice(1)}`; return (
{fields.map(field => ( ))} {error && ( {error} )}
); }; export default AddModal;