123456789101112131415161718192021222324252627282930313233343536373839404142 |
- import { tryOnBeforeMount, tryOnUnmounted, useDebounceFn } from '@vueuse/core';
- import type { BridgeEventMap } from '../../../@types/bridge';
- export type ScanData = NonNullable<BridgeEventMap['scan']['detail']['data']>;
- 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 };
- }
|