import { Capacitor } from '@capacitor/core' // Native scanner composable for Capacitor app // Handles DataWedge and other enterprise scanner broadcasts export const useNativeScanner = (onScan: (barcode: string) => void) => { const isNative = ref(false) const isListening = ref(false) // Check if running in native Capacitor app onMounted(() => { isNative.value = Capacitor.isNativePlatform() if (isNative.value) { startListening() } }) onBeforeUnmount(() => { if (isNative.value) { stopListening() } }) const startListening = () => { if (!isNative.value || isListening.value) return // Listen for DataWedge broadcasts (Zebra, Honeywell, etc.) // The actual broadcast receiver is set up in Android native code // and sends events to the webview via a custom plugin or JavaScript interface if (typeof window !== 'undefined') { // Listen for scanner events from native side window.addEventListener('nativeScan', handleNativeScan) // Also listen for DataWedge intent broadcasts (if using DataWedge plugin) window.addEventListener('datawedge', handleDataWedgeScan) isListening.value = true console.log('[NativeScanner] Started listening for scanner broadcasts') } } const stopListening = () => { if (typeof window !== 'undefined') { window.removeEventListener('nativeScan', handleNativeScan) window.removeEventListener('datawedge', handleDataWedgeScan) isListening.value = false console.log('[NativeScanner] Stopped listening for scanner broadcasts') } } const handleNativeScan = (event: CustomEvent) => { const barcode = event.detail?.barcode || event.detail?.data || event.detail if (barcode && typeof barcode === 'string') { console.log('[NativeScanner] Received scan:', barcode) onScan(barcode) } } const handleDataWedgeScan = (event: CustomEvent) => { // DataWedge sends data in specific format const data = event.detail?.['com.symbol.datawedge.data_string'] || event.detail?.data || event.detail if (data && typeof data === 'string') { console.log('[NativeScanner] DataWedge scan:', data) onScan(data) } } return { isNative: readonly(isNative), isListening: readonly(isListening), startListening, stopListening } } // Declare custom event types for TypeScript declare global { interface WindowEventMap { 'nativeScan': CustomEvent<{ barcode: string } | string> 'datawedge': CustomEvent } }