"use client"; import React from "react"; import { X, Save } from "@mui/icons-material"; import { Dialog, DialogTitle, DialogContent, DialogActions, IconButton, Typography, Button, Box, Stack, } from "@mui/material"; import { useForm, Controller } from "react-hook-form"; import { QualityCheckModalProps, QualityCheckData, QualityCheckRecord, QualityCheckItem, } from "./types"; import { getStatusIcon, getStatusColor } from "./utils/QualityCheckHelper"; import DefectsSection from "./DefectsSection"; import OperatorScanner from "./OperatorScanner"; const QualityCheckModal: React.FC = ({ isOpen, onClose, item = null, }) => { const { control, handleSubmit, reset, watch, setValue, setError, clearErrors, formState: { errors, isValid }, } = useForm({ defaultValues: { inspectors: [], checkDate: new Date().toISOString().split("T")[0], status: "pending", notes: "", defects: [], }, mode: "onChange", }); const watchedDefects = watch("defects"); const watchedInspectors = watch("inspectors"); const validateForm = (): boolean => { let isValid = true; // Clear previous errors clearErrors(); // Validate inspectors if (!watchedInspectors || watchedInspectors.length === 0) { setError("inspectors", { type: "required", message: "At least one inspector is required", }); isValid = false; } return isValid; }; const onSubmit = (data: QualityCheckData): void => { if (!validateForm()) { return; } console.log(data); const qualityRecord: QualityCheckRecord = { ...data, itemId: item?.id?.toString(), itemName: item?.name, timestamp: new Date().toISOString(), }; // Save to localStorage or your preferred storage method // const existingRecords = JSON.parse(localStorage.getItem('qualityCheckRecords') || '[]'); // const updatedRecords = [...existingRecords, qualityRecord]; // localStorage.setItem('qualityCheckRecords', JSON.stringify(updatedRecords)); // Close modal and reset form handleClose(); }; const handleClose = (): void => { reset({ inspectors: [], checkDate: new Date().toISOString().split("T")[0], status: "pending", notes: "", defects: [], }); onClose(); }; const statusOptions: Array<"pending" | "passed" | "failed"> = [ "pending", "passed", "failed", ]; if (!isOpen) return null; return ( Quality Check {item && ( Item: {item.name} (ID: {item.id}) )} {/* Inspector and Date */} Inspector * { setValue("inspectors", operators); if (operators.length > 0) { clearErrors("inspectors"); } }} error={errors.inspectors?.message} /> Check Date * ( )} /> {errors.checkDate && ( {errors.checkDate.message} )} {/* Quality Status */} Quality Status * ( {statusOptions.map((statusOption) => { const IconComponent = getStatusIcon(statusOption); const isSelected = field.value === statusOption; return ( ); })} )} /> {errors.status && ( {errors.status.message} )} {/* Defects Section */} { setValue("defects", defects); clearErrors("defects"); }} error={errors.defects?.message} /> {/* Additional Notes */} ( Additional Notes