34 lines
895 B
TypeScript
34 lines
895 B
TypeScript
|
|
import { useEffect, useState } from 'react'
|
|||
|
|
import BarcodeScannerDialog from './BarcodeScannerDialog'
|
|||
|
|
import { registerBarcodeScanner } from './scanBarcode'
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* `scanBarcode()` çağrılarını karşılayan tekil diyalog. Uygulama kökünde bir
|
|||
|
|
* kez mount edilir; React ağacı dışından açılabilmesinin tek yolu budur.
|
|||
|
|
*/
|
|||
|
|
const BarcodeScannerHost = () => {
|
|||
|
|
const [resolve, setResolve] = useState<((code: string | null) => void) | null>(null)
|
|||
|
|
|
|||
|
|
useEffect(() => {
|
|||
|
|
registerBarcodeScanner((next) => setResolve(() => next))
|
|||
|
|
return () => registerBarcodeScanner(undefined)
|
|||
|
|
}, [])
|
|||
|
|
|
|||
|
|
const finish = (code: string | null) => {
|
|||
|
|
resolve?.(code)
|
|||
|
|
setResolve(null)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (!resolve) return null
|
|||
|
|
|
|||
|
|
return (
|
|||
|
|
<BarcodeScannerDialog
|
|||
|
|
open
|
|||
|
|
onDetect={(code) => finish(code)}
|
|||
|
|
onDialogClose={() => finish(null)}
|
|||
|
|
/>
|
|||
|
|
)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
export default BarcodeScannerHost
|