useScan.ts 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. import { tryOnBeforeMount, tryOnUnmounted, useDebounceFn } from '@vueuse/core';
  2. import type { BridgeEventMap } from '../../../@types/bridge';
  3. export type ScanData = NonNullable<BridgeEventMap['scan']['detail']['data']>;
  4. export function useScan(fn: (data: ScanData) => void) {
  5. const callback = useDebounceFn(fn, 300)
  6. let onCleanup = () => {};
  7. tryOnBeforeMount(async () => {
  8. if (window.bridge) {
  9. onCleanup = window.bridge.addEventListener('scan', (event) => {
  10. event.stopPropagation();
  11. event.preventDefault();
  12. if (event.detail.code !== 0 || !event.detail.data?.code) return;
  13. callback(event.detail.data);
  14. });
  15. } else if (window.platform) {
  16. const update = (event: CustomEvent) => {
  17. event.stopPropagation();
  18. event.preventDefault();
  19. if (!event.detail?.code) return;
  20. callback({ code: event.detail.code, state: 0, type: -1 });
  21. };
  22. platform.addEventListener('scan', update);
  23. onCleanup = () => platform.removeEventListener('scan', update);
  24. }
  25. });
  26. tryOnUnmounted(() => onCleanup?.());
  27. const scanValue = ref('');
  28. async function scan(code?: string) {
  29. if (code != null) return callback({ code, state: 0, type: -1 });
  30. try {
  31. const data = await Bridge.scan();
  32. if (data?.code) callback(data);
  33. } catch (e) {}
  34. }
  35. return { scanValue, scan };
  36. }