"use client" import { JoDetail } from "@/app/api/jo" import { useRouter } from "next/navigation"; import { useTranslation } from "react-i18next"; import useUploadContext from "../UploadProvider/useUploadContext"; import { FormProvider, SubmitErrorHandler, SubmitHandler, useForm } from "react-hook-form"; import React, { useCallback, useEffect, useLayoutEffect, useMemo, useState } from "react"; import { Button, Stack, Typography } from "@mui/material"; import StartIcon from "@mui/icons-material/Start"; import ArrowBackIcon from '@mui/icons-material/ArrowBack'; import { releaseJo } from "@/app/api/jo/actions"; import InfoCard from "./InfoCard"; import PickTable from "./PickTable"; import ActionButtons from "./ActionButtons"; import { useQrCodeScannerContext } from "../QrCodeScannerProvider/QrCodeScannerProvider"; import { fetchStockInLineInfo } from "@/app/api/po/actions"; type Props = { id?: number; defaultValues: Partial | undefined; } const JoSave: React.FC = ({ defaultValues, id, }) => { const { t } = useTranslation("jo") const router = useRouter(); const { setIsUploading } = useUploadContext(); const scanner = useQrCodeScannerContext() const [serverError, setServerError] = useState(""); const finalDefaultValues = useMemo(() => { const values = { ...defaultValues, pickLines: defaultValues?.pickLines?.map(line => ({ ...line, pickedLotNo: Array.isArray(line.pickedLotNo) ? line.pickedLotNo.map(lot => ({ ...lot, isScanned: false })) : line.pickedLotNo })) } return values; }, [defaultValues]) const formProps = useForm({ defaultValues: finalDefaultValues }) const pickLines = useMemo(() => { return formProps.watch("pickLines") }, [formProps.watch("pickLines")]) // --------------------------------------------- Qr Code Scan --------------------------------------------- // const needScan = useMemo(() => { return pickLines.some((line) => line.status === "pending") }, [pickLines.some((line) => line.status === "pending")]) useLayoutEffect(() => { if (needScan && !scanner.isScanning) { scanner.startScan(); } else if (!needScan) { scanner.stopScan(); } }, [needScan]) const checkScannedId = useCallback(async (stockInLineId: number | undefined) => { try { setIsUploading(true) if (stockInLineId) { const response = await fetchStockInLineInfo(stockInLineId); // const pickLines = formProps.watch("pickLines") const pickedLotNoIndex = pickLines.findIndex((line) => line.pickedLotNo?.some((pln) => pln.lotNo === response?.lotNo)) if (pickedLotNoIndex >= 0) { const updatedPickLines = [...pickLines] const matchedLotNoIndex = updatedPickLines[pickedLotNoIndex].pickedLotNo?.findIndex((line) => line?.lotNo === response?.lotNo && Boolean(line?.isScanned) === false) if (matchedLotNoIndex !== null && matchedLotNoIndex !== undefined && matchedLotNoIndex >= 0) { const updatedPickedLotNo = [...(updatedPickLines[pickedLotNoIndex].pickedLotNo || [])] updatedPickedLotNo[matchedLotNoIndex] = { ...updatedPickedLotNo[matchedLotNoIndex], isScanned: true, } updatedPickLines[pickedLotNoIndex] = { ...updatedPickLines[pickedLotNoIndex], pickedLotNo: updatedPickedLotNo, }; formProps.setValue("pickLines", updatedPickLines, { shouldValidate: true, shouldDirty: true, }); } } } } finally { scanner.resetScan() setIsUploading(false) } }, []) useEffect(() => { const result = scanner.result console.log(scanner.result) if (result?.value) { if (!isNaN(Number(result.value))) { checkScannedId(Number(result?.value)); } } else if (result?.stockInLineId) { checkScannedId(result?.stockInLineId) } }, [scanner.result]) // --------------------------------------------- Button Actions --------------------------------------------- // const handleBack = useCallback(() => { router.replace(`/jo`) }, []) const handleRelease = useCallback(async () => { try { setIsUploading(true) if (id) { const response = await releaseJo({ id: id }) if (response) { formProps.setValue("status", response.entity.status) } } } catch (e) { // backend error setServerError(t("An error has occurred. Please try again later.")); console.log(e); } finally { setIsUploading(false) } }, []) const handleStart = useCallback(async () => { console.log("first") }, []) // --------------------------------------------- Form Submit --------------------------------------------- // const onSubmit = useCallback>(async (data, event) => { console.log(data) }, [t]) const onSubmitError = useCallback>((errors) => { console.log(errors) }, [t]) return <> {serverError && ( {serverError} )} } export default JoSave;