| @@ -10,7 +10,7 @@ import { | |||||
| Stack, | Stack, | ||||
| Typography, | Typography, | ||||
| } from "@mui/material"; | } from "@mui/material"; | ||||
| import { useCallback, useEffect, useMemo, useState } from "react"; | |||||
| import { useCallback, useEffect, useMemo, useRef, useState } from "react"; | |||||
| import ReactQrCodeScanner, { | import ReactQrCodeScanner, { | ||||
| ScannerConfig, | ScannerConfig, | ||||
| } from "../ReactQrCodeScanner/ReactQrCodeScanner"; | } from "../ReactQrCodeScanner/ReactQrCodeScanner"; | ||||
| @@ -20,7 +20,7 @@ import { | |||||
| import { QrCodeInfo } from "@/app/api/qrcode"; | import { QrCodeInfo } from "@/app/api/qrcode"; | ||||
| import { Check, QrCodeScanner, Warehouse } from "@mui/icons-material"; | import { Check, QrCodeScanner, Warehouse } from "@mui/icons-material"; | ||||
| import { useTranslation } from "react-i18next"; | import { useTranslation } from "react-i18next"; | ||||
| import { useSearchParams } from "next/navigation"; | |||||
| import { usePathname, useRouter, useSearchParams } from "next/navigation"; | |||||
| import { useQrCodeScannerContext } from "../QrCodeScannerProvider/QrCodeScannerProvider"; | import { useQrCodeScannerContext } from "../QrCodeScannerProvider/QrCodeScannerProvider"; | ||||
| import PutAwayModal from "./PutAwayModal"; | import PutAwayModal from "./PutAwayModal"; | ||||
| import { PutAwayRecord } from "."; | import { PutAwayRecord } from "."; | ||||
| @@ -35,6 +35,9 @@ type ScanStatusType = "pending" | "scanning" | "retry"; | |||||
| const PutAwayScan: React.FC<Props> = ({ warehouse }) => { | const PutAwayScan: React.FC<Props> = ({ warehouse }) => { | ||||
| const { t } = useTranslation("putAway"); | const { t } = useTranslation("putAway"); | ||||
| const searchParams = useSearchParams(); | const searchParams = useSearchParams(); | ||||
| const pathname = usePathname(); | |||||
| const router = useRouter(); | |||||
| const deepLinkConsumedRef = useRef(false); | |||||
| const [scanDisplay, setScanDisplay] = useState<ScanStatusType>("pending"); | const [scanDisplay, setScanDisplay] = useState<ScanStatusType>("pending"); | ||||
| const [openPutAwayModal, setOpenPutAwayModal] = useState(false); | const [openPutAwayModal, setOpenPutAwayModal] = useState(false); | ||||
| @@ -105,11 +108,18 @@ const PutAwayScan: React.FC<Props> = ({ warehouse }) => { | |||||
| /** Deep link from nav alert: /putAway?stockInLineId=… */ | /** Deep link from nav alert: /putAway?stockInLineId=… */ | ||||
| useEffect(() => { | useEffect(() => { | ||||
| if (!stockInLineIdQ) return; | |||||
| if (!stockInLineIdQ || deepLinkConsumedRef.current) return; | |||||
| const id = parseInt(stockInLineIdQ, 10); | const id = parseInt(stockInLineIdQ, 10); | ||||
| if (!Number.isFinite(id) || id <= 0) return; | if (!Number.isFinite(id) || id <= 0) return; | ||||
| deepLinkConsumedRef.current = true; | |||||
| setScannedSilId((prev) => (prev === id ? prev : id)); | setScannedSilId((prev) => (prev === id ? prev : id)); | ||||
| }, [stockInLineIdQ]); | |||||
| // Consume deep link once, then remove it from URL | |||||
| const nextParams = new URLSearchParams(searchParams.toString()); | |||||
| nextParams.delete("stockInLineId"); | |||||
| const nextQuery = nextParams.toString(); | |||||
| router.replace(nextQuery ? `${pathname}?${nextQuery}` : pathname); | |||||
| }, [stockInLineIdQ, pathname, router, searchParams]); | |||||
| // Get Scanned Values | // Get Scanned Values | ||||
| useEffect(() => { | useEffect(() => { | ||||