import { tryOnBeforeMount, tryOnUnmounted, useDebounceFn } from '@vueuse/core'; import type { BridgeEventMap } from '../../../@types/bridge'; export type ScanData = NonNullable; export function useScan(fn: (data: ScanData) => void) { const callback = useDebounceFn(fn, 300) let onCleanup = () => {}; tryOnBeforeMount(async () => { if (window.bridge) { onCleanup = window.bridge.addEventListener('scan', (event) => { event.stopPropagation(); event.preventDefault(); if (event.detail.code !== 0 || !event.detail.data?.code) return; callback(event.detail.data); }); } else if (window.platform) { const update = (event: CustomEvent) => { event.stopPropagation(); event.preventDefault(); if (!event.detail?.code) return; callback({ code: event.detail.code, state: 0, type: -1 }); }; platform.addEventListener('scan', update); onCleanup = () => platform.removeEventListener('scan', update); } }); tryOnUnmounted(() => onCleanup?.()); const scanValue = ref(''); async function scan(code?: string) { if (code != null) return callback({ code, state: 0, type: -1 }); try { const data = await Bridge.scan(); if (data?.code) callback(data); } catch (e) {} } return { scanValue, scan }; }