import { useState } from 'react' import { Button, Dialog } from '@/components/ui' import { useLocalization } from '@/utils/hooks/useLocalization' import { useBarcodeReader, type BarcodeReaderStatus } from './useBarcodeReader' export type BarcodeScannerDialogProps = { open: boolean onDialogClose: () => void /** * Okunan kod. `false` dönerse kod reddedilmiş sayılır ve listeye yazılmaz; * sürekli modda yazma hatasını kullanıcıya göstermek için kullanılır. */ onDetect: (code: string) => boolean | void | Promise /** Açıkken diyalog okumadan sonra kapanmaz, okunanları listeler. */ continuous?: boolean title?: string } const statusMessageKeys: Record = { starting: '::App.BarcodeScanner.Starting', scanning: '::App.BarcodeScanner.Aim', denied: '::App.BarcodeScanner.PermissionDenied', insecure: '::App.BarcodeScanner.InsecureContext', standaloneIos: '::App.BarcodeScanner.StandaloneIos', error: '::App.BarcodeScanner.CameraError', } /** * Kamerayla barkod/QR okuma diyaloğu. Tek okuma ve sürekli tarama aynı * bileşendir; fark yalnızca okumadan sonra kapanıp kapanmadığıdır. */ const BarcodeScannerDialog = ({ open, onDialogClose, onDetect, continuous = false, title, }: BarcodeScannerDialogProps) => { const { translate } = useLocalization() const [scanned, setScanned] = useState([]) const [failed, setFailed] = useState() const handleDetect = async (code: string) => { const accepted = await onDetect(code) if (accepted === false) { setFailed(code) return } if (!continuous) { onDialogClose() return } setFailed(undefined) setScanned((previous) => [code, ...previous]) } const { videoRef, status } = useBarcodeReader({ active: open, onDetect: handleDetect }) return (
{title ?? translate('::App.BarcodeScanner.Title')}
) } export default BarcodeScannerDialog