import axios from "axios"; import { format } from "date-fns-tz"; import { useCallback, useEffect, useState } from "react"; import { Text, View } from "react-native"; import { useAppStore } from "../hooks/useAppStore"; import { useMobileAuthStore } from "../hooks/useMobileAuth"; import { useScannerStore } from "../hooks/useScannerStore"; import { scannerFeedback } from "../lib/feedbackScan"; import { sendTcpMessage } from "../lib/tcpScan"; import { versionCheck } from "../lib/versionValidation"; import { type ZebraScanResult, zebraScanner } from "../lib/ZebraScanner"; import { ScannedLabelBox } from "./ScannedLabels"; import { GlobalFooter } from "./UpdateFooter"; import { Separator } from "./ui/separator"; const STX = "\x02"; const ETX = "\x03"; export default function ProdScanner() { const lastScan = useScannerStore((s) => s.lastScan); const setLastScan = useScannerStore((s) => s.setLastScan); const [tagScans, setTagScans] = useState([]); const scannerIdFromStore = useAppStore((s) => s.scannerId); const serverIp = useAppStore((s) => s.serverIp); const serverPort = useAppStore((s) => s.serverPort); const [bgColor, setBGColor] = useState(null); const handleScan = useCallback( async (scan: ZebraScanResult) => { await scannerFeedback({ type: "scan", sound: true, vibrate: true, led: true, }); let commandToSend = `${STX}${scannerIdFromStore}@${scan.data}${ETX}`; // if we are sscc we need to scan like this .... 98@]C100090087710038712256 if (scan.data.startsWith("000")) { commandToSend = `${STX}${scannerIdFromStore}@]C1${scan.data}${ETX}`; setTagScans((prev: any) => [ { label: parseInt(scan.data.slice(10, -1) || "000", 10).toString(), date: format(new Date(Date.now()), "HH:mm"), }, ...prev, ]); } const scanned = (await sendTcpMessage( commandToSend, serverIp, parseInt(serverPort || "0", 10), )) as any; // send the logs to lst but allow it to time out if it dose not exist just bc. const data = { ...scanned.data, runningNumber: scan.data.startsWith("000") ? parseInt(scan.data.slice(10, -1) || "000", 10).toString() : "0", }; try { await axios.post( `http://${serverIp.trim()}:3000/lst/api/mobile/logs`, data, ); } catch (error) { console.log(error); } // const response = await sendTcpMessage(tcpMessage); console.log(scanned.data); if (scanned.data.status !== "error") { await scannerFeedback({ type: "good", sound: true, vibrate: true, led: true, }); setBGColor("bg-green-500"); // version check versionCheck(); // auth update useMobileAuthStore.getState().updateLastScan(); setTimeout(() => { setBGColor(null); }, 1 * 1000); } if (scanned.data.status === "error") { await scannerFeedback({ type: scanned.data.status === "error" ? "bad" : "good", sound: true, vibrate: true, led: true, }); setBGColor("bg-red-500"); setTimeout(() => { setBGColor(null); }, 1 * 1000); } setLastScan(scanned.data); // if we change commands we want to zero out the last scanned labels if (/^[a-zA-Z]/.test(scan.data)) { setTagScans([]); } }, [scannerIdFromStore, serverIp, serverPort, setLastScan], ); const clearScans = () => { setTagScans([]); }; //console.log(lastScan); useEffect(() => { zebraScanner.ensureProfile(); zebraScanner.startListening(); const sub = zebraScanner.addScanListener((scan) => { //console.log("SCAN:", scan); handleScan(scan); }); return () => { sub.remove(); zebraScanner.stopListening(); }; }, [handleScan]); return ( Scanner ID: {parseInt(scannerIdFromStore || "0", 10)} {!lastScan ? ( Ready to scan Waiting for first scan... ) : ( {lastScan.lines ?.filter((line) => !/^\d+@$/.test(line)) .map((i) => { return ( {i} ); })} )} ); }