"use client"; import React, { useState, useRef, useEffect } from "react"; import { Material, MaterialDatabase } from "./types"; import { Box, Typography, TextField, Paper, Stack, Button, IconButton, Chip, } from "@mui/material"; import CheckIcon from "@mui/icons-material/Check"; import CloseIcon from "@mui/icons-material/Close"; interface MaterialLotScannerProps { materials: Material[]; onMaterialsChange: (materials: Material[]) => void; error?: string; } const MaterialLotScanner: React.FC = ({ materials, onMaterialsChange, error, }) => { const [materialScanInput, setMaterialScanInput] = useState(""); const materialScanRef = useRef(null); useEffect(() => { if (materialScanRef.current) { materialScanRef.current.focus(); } }, []); const handleMaterialInputChange = ( e: React.ChangeEvent, ) => { setMaterialScanInput(e.target.value.trim()); }; const handleMaterialInputKeyPress = async ( e: React.KeyboardEvent, ) => { if (e.key === "Enter") { const target = e.target as HTMLInputElement; const scannedLot = target.value.trim(); if (scannedLot) { const response = await fetch( "http://your-backend-url.com/validateLot", { method: "POST", headers: { "Content-Type": "application/json", }, body: JSON.stringify({ lot: scannedLot }), }, ); const data = await response.json(); if (data.suggestedLot) { const updatedMaterials = materials.map((material) => { if (material.name === data.matchedMaterial.name) { const isAlreadyAdded = material.lotNumbers.includes(scannedLot); if (!isAlreadyAdded) { return { ...material, isUsed: true, lotNumbers: [...material.lotNumbers, scannedLot], }; } } return material; }); onMaterialsChange(updatedMaterials); setMaterialScanInput(""); } else if (data.matchedMaterial) { setMaterialScanInput( scannedLot + " (Invalid lot number format. Suggested lot number: " + data.suggestedLot + ")", ); } else { setMaterialScanInput( scannedLot + " (Invalid lot number format or material not recognized.)", ); } } } }; const removeLotNumber = (materialName: string, lotNumber: string): void => { const updatedMaterials = materials.map((material) => { if (material.name === materialName) { const updatedLotNumbers = material.lotNumbers.filter( (lot) => lot !== lotNumber, ); return { ...material, lotNumbers: updatedLotNumbers, isUsed: updatedLotNumbers.length > 0, }; } return material; }); onMaterialsChange(updatedMaterials); }; const requiredMaterials = materials.filter((m) => m.required); const optionalMaterials = materials.filter((m) => !m.required); return ( Material Lot Numbers Lot Number Formats: Steel Sheet: SS-YYMMDD-XXX | Aluminum: AL-YYMMDD-XXX | Plastic: PP-YYMMDD-XXX Copper Wire: CW-YYMMDD-XXX | Rubber: RG-YYMMDD-XXX | Glass: GP-YYMMDD-XXX {error && ( {error} )} {/* Required Materials */} Required Materials {requiredMaterials.map((material) => ( {material.isUsed && ( )} {material.name} {material.lotNumbers.length} lot(s) {material.lotNumbers.length > 0 && ( {material.lotNumbers.map((lotNumber, index) => ( {lotNumber} removeLotNumber(material.name, lotNumber) } color="error" size="small" > ))} )} ))} {/* Optional Materials */} Optional Materials {optionalMaterials.map((material) => ( {material.isUsed && ( )} {material.name} {material.lotNumbers.length} lot(s) {material.lotNumbers.length > 0 && ( {material.lotNumbers.map((lotNumber, index) => ( {lotNumber} removeLotNumber(material.name, lotNumber) } color="error" size="small" > ))} )} ))} ); }; export default MaterialLotScanner;