33 lines
895 B
TypeScript
33 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
|