"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;