@unif/react-native-hms-scan 0.6.1 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +24 -72
- package/android/src/main/AndroidManifest.xml +0 -9
- package/android/src/main/java/com/unif/reactnativehmsscan/HmsScanImage.kt +135 -0
- package/android/src/main/java/com/unif/reactnativehmsscan/HmsScanModule.kt +163 -147
- package/android/src/main/java/com/unif/reactnativehmsscan/HmsScanResultMapper.kt +17 -9
- package/android/src/main/java/com/unif/reactnativehmsscan/HmsScanView.kt +57 -19
- package/android/src/main/java/com/unif/reactnativehmsscan/HmsScanViewManager.kt +1 -1
- package/ios/HmsScanModule.mm +13 -37
- package/ios/HmsScanResultMapper.h +4 -3
- package/ios/HmsScanResultMapper.mm +31 -19
- package/ios/HmsScanView.h +1 -1
- package/ios/HmsScanView.mm +140 -25
- package/lib/module/HmsScanView/HmsScanView.js +66 -0
- package/lib/module/HmsScanView/HmsScanView.js.map +1 -0
- package/lib/module/HmsScanView/HmsScanView.web.js +26 -0
- package/lib/module/HmsScanView/HmsScanView.web.js.map +1 -0
- package/lib/module/HmsScanView/types.js +4 -0
- package/lib/module/HmsScanView/types.js.map +1 -0
- package/lib/module/HmsScanViewNativeComponent.ts +7 -5
- package/lib/module/NativeHmsScan.js +1 -1
- package/lib/module/NativeHmsScan.js.map +1 -1
- package/lib/module/ScanError.js +12 -0
- package/lib/module/ScanError.js.map +1 -0
- package/lib/module/Scanner/DeniedOverlay.js +1 -1
- package/lib/module/Scanner/DeniedOverlay.js.map +1 -1
- package/lib/module/Scanner/ResultFail.js +3 -2
- package/lib/module/Scanner/ResultFail.js.map +1 -1
- package/lib/module/Scanner/ResultFocus/ResultFocus.js +56 -0
- package/lib/module/Scanner/ResultFocus/ResultFocus.js.map +1 -0
- package/lib/module/Scanner/ResultFocus/styles.js +39 -0
- package/lib/module/Scanner/ResultFocus/styles.js.map +1 -0
- package/lib/module/Scanner/ResultFocus/types.js +4 -0
- package/lib/module/Scanner/ResultFocus/types.js.map +1 -0
- package/lib/module/Scanner/ScanHint.js +6 -3
- package/lib/module/Scanner/ScanHint.js.map +1 -1
- package/lib/module/Scanner/ScanToolbar.js +6 -3
- package/lib/module/Scanner/ScanToolbar.js.map +1 -1
- package/lib/module/Scanner/ScanTopBar.js +6 -3
- package/lib/module/Scanner/ScanTopBar.js.map +1 -1
- package/lib/module/Scanner/Scanner.js +9 -311
- package/lib/module/Scanner/Scanner.js.map +1 -1
- package/lib/module/Scanner/Scanner.web.js +29 -0
- package/lib/module/Scanner/Scanner.web.js.map +1 -0
- package/lib/module/Scanner/ScannerInner.js +310 -0
- package/lib/module/Scanner/ScannerInner.js.map +1 -0
- package/lib/module/Scanner/styles.js +11 -0
- package/lib/module/Scanner/styles.js.map +1 -0
- package/lib/module/Scanner/types.js +4 -0
- package/lib/module/Scanner/types.js.map +1 -0
- package/lib/module/constants.js +20 -0
- package/lib/module/constants.js.map +1 -0
- package/lib/module/decodeImage.js +29 -24
- package/lib/module/decodeImage.js.map +1 -1
- package/lib/module/decodeImage.web.js +7 -0
- package/lib/module/decodeImage.web.js.map +1 -0
- package/lib/module/errors.js +24 -0
- package/lib/module/errors.js.map +1 -0
- package/lib/module/format.js +53 -47
- package/lib/module/format.js.map +1 -1
- package/lib/module/index.js +5 -19
- package/lib/module/index.js.map +1 -1
- package/lib/module/index.web.js +8 -0
- package/lib/module/index.web.js.map +1 -0
- package/lib/module/mock.js +2 -23
- package/lib/module/mock.js.map +1 -1
- package/lib/module/permissions.js +24 -20
- package/lib/module/permissions.js.map +1 -1
- package/lib/module/permissions.web.js +10 -0
- package/lib/module/permissions.web.js.map +1 -0
- package/lib/module/types.js +1 -45
- package/lib/module/types.js.map +1 -1
- package/lib/typescript/src/HmsScanView/HmsScanView.d.ts +3 -0
- package/lib/typescript/src/HmsScanView/HmsScanView.d.ts.map +1 -0
- package/lib/typescript/src/HmsScanView/HmsScanView.web.d.ts +3 -0
- package/lib/typescript/src/HmsScanView/HmsScanView.web.d.ts.map +1 -0
- package/lib/typescript/src/HmsScanView/types.d.ts +12 -0
- package/lib/typescript/src/HmsScanView/types.d.ts.map +1 -0
- package/lib/typescript/src/HmsScanViewNativeComponent.d.ts +6 -4
- package/lib/typescript/src/HmsScanViewNativeComponent.d.ts.map +1 -1
- package/lib/typescript/src/NativeHmsScan.d.ts +3 -5
- package/lib/typescript/src/NativeHmsScan.d.ts.map +1 -1
- package/lib/typescript/src/ScanError.d.ts +7 -0
- package/lib/typescript/src/ScanError.d.ts.map +1 -0
- package/lib/typescript/src/Scanner/DeniedOverlay.d.ts.map +1 -1
- package/lib/typescript/src/Scanner/ResultFail.d.ts +2 -1
- package/lib/typescript/src/Scanner/ResultFail.d.ts.map +1 -1
- package/lib/typescript/src/Scanner/ResultFocus/ResultFocus.d.ts +4 -0
- package/lib/typescript/src/Scanner/ResultFocus/ResultFocus.d.ts.map +1 -0
- package/lib/typescript/src/Scanner/ResultFocus/styles.d.ts +36 -0
- package/lib/typescript/src/Scanner/ResultFocus/styles.d.ts.map +1 -0
- package/lib/typescript/src/Scanner/ResultFocus/types.d.ts +8 -0
- package/lib/typescript/src/Scanner/ResultFocus/types.d.ts.map +1 -0
- package/lib/typescript/src/Scanner/ScanHint.d.ts.map +1 -1
- package/lib/typescript/src/Scanner/ScanToolbar.d.ts.map +1 -1
- package/lib/typescript/src/Scanner/ScanTopBar.d.ts.map +1 -1
- package/lib/typescript/src/Scanner/Scanner.d.ts +2 -45
- package/lib/typescript/src/Scanner/Scanner.d.ts.map +1 -1
- package/lib/typescript/src/Scanner/Scanner.web.d.ts +3 -0
- package/lib/typescript/src/Scanner/Scanner.web.d.ts.map +1 -0
- package/lib/typescript/src/Scanner/ScannerInner.d.ts +3 -0
- package/lib/typescript/src/Scanner/ScannerInner.d.ts.map +1 -0
- package/lib/typescript/src/Scanner/styles.d.ts +7 -0
- package/lib/typescript/src/Scanner/styles.d.ts.map +1 -0
- package/lib/typescript/src/Scanner/types.d.ts +20 -0
- package/lib/typescript/src/Scanner/types.d.ts.map +1 -0
- package/lib/typescript/src/constants.d.ts +8 -0
- package/lib/typescript/src/constants.d.ts.map +1 -0
- package/lib/typescript/src/decodeImage.d.ts +2 -12
- package/lib/typescript/src/decodeImage.d.ts.map +1 -1
- package/lib/typescript/src/decodeImage.web.d.ts +3 -0
- package/lib/typescript/src/decodeImage.web.d.ts.map +1 -0
- package/lib/typescript/src/errors.d.ts +6 -0
- package/lib/typescript/src/errors.d.ts.map +1 -0
- package/lib/typescript/src/format.d.ts +15 -12
- package/lib/typescript/src/format.d.ts.map +1 -1
- package/lib/typescript/src/index.d.ts +6 -7
- package/lib/typescript/src/index.d.ts.map +1 -1
- package/lib/typescript/src/index.web.d.ts +9 -0
- package/lib/typescript/src/index.web.d.ts.map +1 -0
- package/lib/typescript/src/mock.d.ts +9 -8
- package/lib/typescript/src/mock.d.ts.map +1 -1
- package/lib/typescript/src/permissions.d.ts +4 -8
- package/lib/typescript/src/permissions.d.ts.map +1 -1
- package/lib/typescript/src/permissions.web.d.ts +4 -0
- package/lib/typescript/src/permissions.web.d.ts.map +1 -0
- package/lib/typescript/src/types.d.ts +31 -56
- package/lib/typescript/src/types.d.ts.map +1 -1
- package/package.json +9 -2
- package/src/HmsScanView/HmsScanView.tsx +67 -0
- package/src/HmsScanView/HmsScanView.web.tsx +22 -0
- package/src/HmsScanView/types.ts +17 -0
- package/src/HmsScanViewNativeComponent.ts +7 -5
- package/src/NativeHmsScan.ts +3 -5
- package/src/ScanError.ts +13 -0
- package/src/Scanner/DeniedOverlay.tsx +4 -2
- package/src/Scanner/ResultFail.tsx +23 -5
- package/src/Scanner/ResultFocus/ResultFocus.tsx +43 -0
- package/src/Scanner/ResultFocus/styles.ts +25 -0
- package/src/Scanner/ResultFocus/types.ts +8 -0
- package/src/Scanner/ScanHint.tsx +16 -11
- package/src/Scanner/ScanToolbar.tsx +35 -13
- package/src/Scanner/ScanTopBar.tsx +20 -12
- package/src/Scanner/Scanner.tsx +13 -436
- package/src/Scanner/Scanner.web.tsx +26 -0
- package/src/Scanner/ScannerInner.tsx +391 -0
- package/src/Scanner/styles.ts +6 -0
- package/src/Scanner/types.ts +36 -0
- package/src/constants.ts +55 -0
- package/src/decodeImage.ts +35 -29
- package/src/decodeImage.web.ts +8 -0
- package/src/errors.ts +26 -0
- package/src/format.ts +77 -76
- package/src/index.tsx +17 -32
- package/src/index.web.tsx +22 -0
- package/src/mock.ts +21 -29
- package/src/permissions.ts +33 -20
- package/src/permissions.web.ts +9 -0
- package/src/types.ts +38 -126
- package/lib/module/HmsScanView.js +0 -43
- package/lib/module/HmsScanView.js.map +0 -1
- package/lib/module/Scanner/ResultFocus.js +0 -171
- package/lib/module/Scanner/ResultFocus.js.map +0 -1
- package/lib/typescript/src/HmsScanView.d.ts +0 -33
- package/lib/typescript/src/HmsScanView.d.ts.map +0 -1
- package/lib/typescript/src/Scanner/ResultFocus.d.ts +0 -14
- package/lib/typescript/src/Scanner/ResultFocus.d.ts.map +0 -1
- package/src/HmsScanView.tsx +0 -87
- package/src/Scanner/ResultFocus.tsx +0 -122
|
@@ -0,0 +1,310 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { useCallback, useEffect, useRef, useState } from 'react';
|
|
4
|
+
import { AppState, Linking, StyleSheet, View } from 'react-native';
|
|
5
|
+
import { useSafeAreaInsets } from 'react-native-safe-area-context';
|
|
6
|
+
import { HmsScanView } from '../HmsScanView/HmsScanView';
|
|
7
|
+
import { decodeImage } from '../decodeImage';
|
|
8
|
+
import { getCameraPermissionStatus, requestCameraPermission } from '../permissions';
|
|
9
|
+
import { formatConfiguration } from "../format.js";
|
|
10
|
+
import { scanError } from "../errors.js";
|
|
11
|
+
import { Viewfinder } from "./Viewfinder.js";
|
|
12
|
+
import { ScanTopBar } from "./ScanTopBar.js";
|
|
13
|
+
import { ScanToolbar } from "./ScanToolbar.js";
|
|
14
|
+
import { ResultFocus } from "./ResultFocus/ResultFocus.js";
|
|
15
|
+
import { ResultFail } from "./ResultFail.js";
|
|
16
|
+
import { DeniedOverlay } from "./DeniedOverlay.js";
|
|
17
|
+
import { ScanErrorOverlay } from "./ScanErrorOverlay.js";
|
|
18
|
+
import { styles } from "./styles.js";
|
|
19
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
20
|
+
export function ScannerInner({
|
|
21
|
+
title = '扫一扫',
|
|
22
|
+
hintText = '将条码 / 二维码放入框内,自动扫描',
|
|
23
|
+
formats,
|
|
24
|
+
topInset,
|
|
25
|
+
bottomInset,
|
|
26
|
+
showTorch = true,
|
|
27
|
+
autoConfirm = false,
|
|
28
|
+
pickImage,
|
|
29
|
+
onConfirm,
|
|
30
|
+
onClose,
|
|
31
|
+
onError
|
|
32
|
+
}) {
|
|
33
|
+
const insets = useSafeAreaInsets();
|
|
34
|
+
const config = formatConfiguration(formats);
|
|
35
|
+
const configKey = config.error?.message ?? config.csv;
|
|
36
|
+
const configRef = useRef(config);
|
|
37
|
+
configRef.current = config;
|
|
38
|
+
const callbacks = useRef({
|
|
39
|
+
onConfirm,
|
|
40
|
+
onClose,
|
|
41
|
+
onError,
|
|
42
|
+
autoConfirm
|
|
43
|
+
});
|
|
44
|
+
callbacks.current = {
|
|
45
|
+
onConfirm,
|
|
46
|
+
onClose,
|
|
47
|
+
onError,
|
|
48
|
+
autoConfirm
|
|
49
|
+
};
|
|
50
|
+
const [phase, setPhase] = useState('init');
|
|
51
|
+
const [result, setResult] = useState(null);
|
|
52
|
+
const [torchRequest, setTorchRequest] = useState(false);
|
|
53
|
+
const [torchState, setTorchState] = useState({
|
|
54
|
+
on: false
|
|
55
|
+
});
|
|
56
|
+
const [scanSession, setScanSession] = useState(0);
|
|
57
|
+
const [activeFormats, setActiveFormats] = useState([]);
|
|
58
|
+
const mounted = useRef(false);
|
|
59
|
+
const closed = useRef(false);
|
|
60
|
+
const accepting = useRef(false);
|
|
61
|
+
const cameraSession = useRef(0);
|
|
62
|
+
const permissionRun = useRef(0);
|
|
63
|
+
const imageRun = useRef(0);
|
|
64
|
+
const imagePending = useRef(false);
|
|
65
|
+
const restartAfterImage = useRef(false);
|
|
66
|
+
const waitingForSettings = useRef(false);
|
|
67
|
+
const selected = useRef(null);
|
|
68
|
+
const stopAdoption = useCallback(() => {
|
|
69
|
+
accepting.current = false;
|
|
70
|
+
++cameraSession.current;
|
|
71
|
+
++imageRun.current;
|
|
72
|
+
++permissionRun.current;
|
|
73
|
+
selected.current = null;
|
|
74
|
+
}, []);
|
|
75
|
+
const startScan = useCallback(() => {
|
|
76
|
+
if (!mounted.current || closed.current) return;
|
|
77
|
+
if (imagePending.current) {
|
|
78
|
+
restartAfterImage.current = true;
|
|
79
|
+
setPhase('processing');
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
const current = configRef.current;
|
|
83
|
+
if (current.error) {
|
|
84
|
+
setPhase('error');
|
|
85
|
+
callbacks.current.onError?.(current.error);
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
setActiveFormats(current.csv ? current.csv.split(',') : []);
|
|
89
|
+
setResult(null);
|
|
90
|
+
selected.current = null;
|
|
91
|
+
accepting.current = true;
|
|
92
|
+
setScanSession(++cameraSession.current);
|
|
93
|
+
setPhase('scan');
|
|
94
|
+
}, []);
|
|
95
|
+
const reportFatal = useCallback(error => {
|
|
96
|
+
stopAdoption();
|
|
97
|
+
setResult(null);
|
|
98
|
+
setTorchRequest(false);
|
|
99
|
+
setPhase(error.reason === 'permission_denied' ? 'denied' : 'error');
|
|
100
|
+
callbacks.current.onError?.(error);
|
|
101
|
+
}, [stopAdoption]);
|
|
102
|
+
const runPermission = useCallback(async requestIfNeeded => {
|
|
103
|
+
const run = ++permissionRun.current;
|
|
104
|
+
const current = () => mounted.current && !closed.current && run === permissionRun.current;
|
|
105
|
+
let status;
|
|
106
|
+
try {
|
|
107
|
+
status = await getCameraPermissionStatus();
|
|
108
|
+
if (!current()) return;
|
|
109
|
+
if (requestIfNeeded && (status === 'denied' || status === 'undetermined')) {
|
|
110
|
+
status = await requestCameraPermission();
|
|
111
|
+
if (!current()) return;
|
|
112
|
+
}
|
|
113
|
+
} catch (error) {
|
|
114
|
+
if (current()) reportFatal(error);
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
if (status === 'granted') startScan();else {
|
|
118
|
+
accepting.current = false;
|
|
119
|
+
setPhase('denied');
|
|
120
|
+
}
|
|
121
|
+
}, [reportFatal, startScan]);
|
|
122
|
+
useEffect(() => {
|
|
123
|
+
mounted.current = true;
|
|
124
|
+
return () => {
|
|
125
|
+
mounted.current = false;
|
|
126
|
+
stopAdoption();
|
|
127
|
+
};
|
|
128
|
+
}, [stopAdoption]);
|
|
129
|
+
useEffect(() => {
|
|
130
|
+
if (closed.current) return;
|
|
131
|
+
stopAdoption();
|
|
132
|
+
setResult(null);
|
|
133
|
+
if (imagePending.current) {
|
|
134
|
+
restartAfterImage.current = true;
|
|
135
|
+
setPhase('processing');
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
if (configRef.current.error) {
|
|
139
|
+
reportFatal(configRef.current.error);
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
setPhase('init');
|
|
143
|
+
void runPermission(true);
|
|
144
|
+
}, [configKey, reportFatal, runPermission, stopAdoption]);
|
|
145
|
+
useEffect(() => {
|
|
146
|
+
const subscription = AppState.addEventListener('change', state => {
|
|
147
|
+
if (state === 'active' && waitingForSettings.current && !closed.current) {
|
|
148
|
+
waitingForSettings.current = false;
|
|
149
|
+
void runPermission(false);
|
|
150
|
+
}
|
|
151
|
+
});
|
|
152
|
+
return () => subscription.remove();
|
|
153
|
+
}, [runPermission]);
|
|
154
|
+
useEffect(() => {
|
|
155
|
+
if (!showTorch) setTorchRequest(false);
|
|
156
|
+
}, [showTorch]);
|
|
157
|
+
const deliver = useCallback(() => {
|
|
158
|
+
const item = selected.current;
|
|
159
|
+
if (!mounted.current || closed.current || !item || item.delivered) return;
|
|
160
|
+
// Mark delivery before calling business code. A callback failure cannot undo it.
|
|
161
|
+
item.delivered = true;
|
|
162
|
+
setPhase('done');
|
|
163
|
+
callbacks.current.onConfirm(item.result);
|
|
164
|
+
}, []);
|
|
165
|
+
const adopt = useCallback(next => {
|
|
166
|
+
selected.current = {
|
|
167
|
+
result: next,
|
|
168
|
+
delivered: false
|
|
169
|
+
};
|
|
170
|
+
setResult(next);
|
|
171
|
+
setPhase('result');
|
|
172
|
+
if (callbacks.current.autoConfirm) deliver();
|
|
173
|
+
}, [deliver]);
|
|
174
|
+
const onCameraResult = useCallback(results => {
|
|
175
|
+
if (!mounted.current || closed.current || !accepting.current || scanSession !== cameraSession.current) return;
|
|
176
|
+
const first = results[0];
|
|
177
|
+
if (!first) return;
|
|
178
|
+
accepting.current = false;
|
|
179
|
+
adopt(first);
|
|
180
|
+
}, [adopt, scanSession]);
|
|
181
|
+
const onCameraError = useCallback(error => {
|
|
182
|
+
if (!mounted.current || closed.current || !accepting.current || scanSession !== cameraSession.current) return;
|
|
183
|
+
reportFatal(error);
|
|
184
|
+
}, [reportFatal, scanSession]);
|
|
185
|
+
const close = useCallback(() => {
|
|
186
|
+
if (closed.current) return;
|
|
187
|
+
closed.current = true;
|
|
188
|
+
stopAdoption();
|
|
189
|
+
setTorchRequest(false);
|
|
190
|
+
setPhase('closed');
|
|
191
|
+
callbacks.current.onClose?.();
|
|
192
|
+
}, [stopAdoption]);
|
|
193
|
+
const reset = useCallback(() => {
|
|
194
|
+
stopAdoption();
|
|
195
|
+
startScan();
|
|
196
|
+
}, [startScan, stopAdoption]);
|
|
197
|
+
const retry = useCallback(() => {
|
|
198
|
+
stopAdoption();
|
|
199
|
+
if (imagePending.current) {
|
|
200
|
+
restartAfterImage.current = true;
|
|
201
|
+
return;
|
|
202
|
+
}
|
|
203
|
+
setPhase('init');
|
|
204
|
+
void runPermission(true);
|
|
205
|
+
}, [runPermission, stopAdoption]);
|
|
206
|
+
const openSettings = useCallback(async () => {
|
|
207
|
+
waitingForSettings.current = true;
|
|
208
|
+
try {
|
|
209
|
+
await Linking.openSettings();
|
|
210
|
+
} catch (error) {
|
|
211
|
+
waitingForSettings.current = false;
|
|
212
|
+
if (mounted.current && !closed.current) reportFatal(scanError(error, {
|
|
213
|
+
reason: 'unavailable',
|
|
214
|
+
message: '打开系统设置失败'
|
|
215
|
+
}));
|
|
216
|
+
}
|
|
217
|
+
}, [reportFatal]);
|
|
218
|
+
const onAlbum = useCallback(async () => {
|
|
219
|
+
if (!pickImage || !accepting.current || imagePending.current || closed.current) return;
|
|
220
|
+
accepting.current = false;
|
|
221
|
+
const run = ++imageRun.current;
|
|
222
|
+
const current = () => mounted.current && !closed.current && run === imageRun.current;
|
|
223
|
+
const inputFormats = activeFormats;
|
|
224
|
+
imagePending.current = true;
|
|
225
|
+
setPhase('processing');
|
|
226
|
+
let image = null;
|
|
227
|
+
let results;
|
|
228
|
+
let failure;
|
|
229
|
+
try {
|
|
230
|
+
image = await pickImage();
|
|
231
|
+
if (current() && image) results = await decodeImage({
|
|
232
|
+
uri: image.uri,
|
|
233
|
+
formats: inputFormats
|
|
234
|
+
});
|
|
235
|
+
} catch (error) {
|
|
236
|
+
failure = scanError(error, {
|
|
237
|
+
reason: 'image_unavailable',
|
|
238
|
+
message: '选择或读取图片失败'
|
|
239
|
+
});
|
|
240
|
+
} finally {
|
|
241
|
+
imagePending.current = false;
|
|
242
|
+
// The original provider owns cleanup, including after this component unmounts.
|
|
243
|
+
try {
|
|
244
|
+
image?.onSourceReleased?.();
|
|
245
|
+
} finally {
|
|
246
|
+
if (current()) {
|
|
247
|
+
if (failure) {
|
|
248
|
+
setPhase('imageError');
|
|
249
|
+
callbacks.current.onError?.(failure);
|
|
250
|
+
} else if (!image) startScan();else if (results?.[0]) adopt(results[0]);else setPhase('empty');
|
|
251
|
+
} else if (restartAfterImage.current && mounted.current && !closed.current) {
|
|
252
|
+
restartAfterImage.current = false;
|
|
253
|
+
setPhase('init');
|
|
254
|
+
void runPermission(true);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
}, [activeFormats, adopt, pickImage, runPermission, startScan]);
|
|
259
|
+
const hasCamera = !['init', 'denied', 'error', 'closed'].includes(phase);
|
|
260
|
+
const showChrome = phase === 'scan' || phase === 'processing';
|
|
261
|
+
const bottom = bottomInset ?? insets.bottom;
|
|
262
|
+
return /*#__PURE__*/_jsxs(View, {
|
|
263
|
+
style: styles.root,
|
|
264
|
+
children: [hasCamera && /*#__PURE__*/_jsx(HmsScanView, {
|
|
265
|
+
style: StyleSheet.absoluteFill,
|
|
266
|
+
formats: activeFormats,
|
|
267
|
+
paused: phase !== 'scan',
|
|
268
|
+
torch: torchRequest,
|
|
269
|
+
onScanResult: onCameraResult,
|
|
270
|
+
onScanError: onCameraError,
|
|
271
|
+
onTorchState: state => {
|
|
272
|
+
if (!closed.current && mounted.current && scanSession === cameraSession.current) {
|
|
273
|
+
setTorchState(state);
|
|
274
|
+
// A failed request or the SDK's controls can change actual state.
|
|
275
|
+
// Keep the next toggle based on that report, without optimistic UI.
|
|
276
|
+
setTorchRequest(showTorch && state.on);
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
}, scanSession), showChrome && /*#__PURE__*/_jsx(Viewfinder, {
|
|
280
|
+
size: 256,
|
|
281
|
+
detecting: phase === 'processing',
|
|
282
|
+
hintText: hintText
|
|
283
|
+
}), hasCamera && /*#__PURE__*/_jsx(ScanTopBar, {
|
|
284
|
+
title: title,
|
|
285
|
+
topInset: topInset ?? insets.top
|
|
286
|
+
}), showChrome && /*#__PURE__*/_jsx(ScanToolbar, {
|
|
287
|
+
flash: torchState.on,
|
|
288
|
+
bottomInset: bottom,
|
|
289
|
+
onFlash: showTorch && torchState.available !== false ? () => setTorchRequest(value => !value) : undefined,
|
|
290
|
+
onAlbum: pickImage ? onAlbum : undefined,
|
|
291
|
+
onClose: onClose ? close : undefined
|
|
292
|
+
}), phase === 'result' && result && /*#__PURE__*/_jsx(ResultFocus, {
|
|
293
|
+
result: result,
|
|
294
|
+
bottomInset: bottom,
|
|
295
|
+
onRescan: reset,
|
|
296
|
+
onConfirm: deliver
|
|
297
|
+
}), (phase === 'empty' || phase === 'imageError') && /*#__PURE__*/_jsx(ResultFail, {
|
|
298
|
+
bottomInset: bottom,
|
|
299
|
+
failed: phase === 'imageError',
|
|
300
|
+
onRescan: reset
|
|
301
|
+
}), phase === 'error' && /*#__PURE__*/_jsx(ScanErrorOverlay, {
|
|
302
|
+
onClose: onClose ? close : undefined,
|
|
303
|
+
onRetry: retry
|
|
304
|
+
}), phase === 'denied' && /*#__PURE__*/_jsx(DeniedOverlay, {
|
|
305
|
+
onClose: onClose ? close : undefined,
|
|
306
|
+
onSettings: openSettings
|
|
307
|
+
})]
|
|
308
|
+
});
|
|
309
|
+
}
|
|
310
|
+
//# sourceMappingURL=ScannerInner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["useCallback","useEffect","useRef","useState","AppState","Linking","StyleSheet","View","useSafeAreaInsets","HmsScanView","decodeImage","getCameraPermissionStatus","requestCameraPermission","formatConfiguration","scanError","Viewfinder","ScanTopBar","ScanToolbar","ResultFocus","ResultFail","DeniedOverlay","ScanErrorOverlay","styles","jsx","_jsx","jsxs","_jsxs","ScannerInner","title","hintText","formats","topInset","bottomInset","showTorch","autoConfirm","pickImage","onConfirm","onClose","onError","insets","config","configKey","error","message","csv","configRef","current","callbacks","phase","setPhase","result","setResult","torchRequest","setTorchRequest","torchState","setTorchState","on","scanSession","setScanSession","activeFormats","setActiveFormats","mounted","closed","accepting","cameraSession","permissionRun","imageRun","imagePending","restartAfterImage","waitingForSettings","selected","stopAdoption","startScan","split","reportFatal","reason","runPermission","requestIfNeeded","run","status","subscription","addEventListener","state","remove","deliver","item","delivered","adopt","next","onCameraResult","results","first","onCameraError","close","reset","retry","openSettings","onAlbum","inputFormats","image","failure","uri","onSourceReleased","hasCamera","includes","showChrome","bottom","style","root","children","absoluteFill","paused","torch","onScanResult","onScanError","onTorchState","size","detecting","top","flash","onFlash","available","value","undefined","onRescan","failed","onRetry","onSettings"],"sourceRoot":"../../../src","sources":["Scanner/ScannerInner.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { StyleSheet } from 'react-native';
|
|
4
|
+
import { scanChrome } from "./scanChrome.js";
|
|
5
|
+
export const styles = StyleSheet.create({
|
|
6
|
+
root: {
|
|
7
|
+
flex: 1,
|
|
8
|
+
backgroundColor: scanChrome.cameraBg
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
//# sourceMappingURL=styles.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["StyleSheet","scanChrome","styles","create","root","flex","backgroundColor","cameraBg"],"sourceRoot":"../../../src","sources":["Scanner/styles.ts"],"mappings":";;AAAA,SAASA,UAAU,QAAQ,cAAc;AACzC,SAASC,UAAU,QAAQ,iBAAc;AAEzC,OAAO,MAAMC,MAAM,GAAGF,UAAU,CAACG,MAAM,CAAC;EACtCC,IAAI,EAAE;IAAEC,IAAI,EAAE,CAAC;IAAEC,eAAe,EAAEL,UAAU,CAACM;EAAS;AACxD,CAAC,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":[],"sourceRoot":"../../../src","sources":["Scanner/types.ts"],"mappings":"","ignoreList":[]}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
/** The one source for public scan formats and input validation. */
|
|
4
|
+
export const SCAN_FORMATS = ['QR_CODE', 'AZTEC', 'DATA_MATRIX', 'PDF417', 'CODABAR', 'CODE_39', 'CODE_93', 'CODE_128', 'EAN_8', 'EAN_13', 'UPC_A', 'UPC_E', 'ITF14', 'MULTI_FUNCTIONAL', 'UNKNOWN'];
|
|
5
|
+
export const SCAN_CONTENT_TYPES = ['TEXT', 'URL', 'EMAIL', 'PHONE', 'SMS', 'WIFI', 'CONTACT', 'EVENT', 'LOCATION', 'DRIVER', 'ISBN', 'ARTICLE', 'OTHER'];
|
|
6
|
+
export const SCAN_FORMAT_SET = new Set(SCAN_FORMATS);
|
|
7
|
+
export const SCAN_CONTENT_TYPE_SET = new Set(SCAN_CONTENT_TYPES);
|
|
8
|
+
export const SCAN_ERROR_REASONS = {
|
|
9
|
+
E_INVALID_INPUT: 'invalid_input',
|
|
10
|
+
E_NO_CAMERA_PERMISSION: 'permission_denied',
|
|
11
|
+
E_NO_READ_PERMISSION: 'permission_denied',
|
|
12
|
+
E_IMAGE_LOAD_FAILED: 'image_unavailable',
|
|
13
|
+
E_DECODE_FAILED: 'decode_failed',
|
|
14
|
+
E_INVALID_RESPONSE: 'invalid_response',
|
|
15
|
+
E_UNSUPPORTED: 'unsupported',
|
|
16
|
+
E_UNSUPPORTED_FORMAT: 'unsupported',
|
|
17
|
+
E_CAMERA_INIT: 'unavailable',
|
|
18
|
+
E_UNAVAILABLE: 'unavailable'
|
|
19
|
+
};
|
|
20
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["SCAN_FORMATS","SCAN_CONTENT_TYPES","SCAN_FORMAT_SET","Set","SCAN_CONTENT_TYPE_SET","SCAN_ERROR_REASONS","E_INVALID_INPUT","E_NO_CAMERA_PERMISSION","E_NO_READ_PERMISSION","E_IMAGE_LOAD_FAILED","E_DECODE_FAILED","E_INVALID_RESPONSE","E_UNSUPPORTED","E_UNSUPPORTED_FORMAT","E_CAMERA_INIT","E_UNAVAILABLE"],"sourceRoot":"../../src","sources":["constants.ts"],"mappings":";;AAEA;AACA,OAAO,MAAMA,YAAY,GAAG,CAC1B,SAAS,EACT,OAAO,EACP,aAAa,EACb,QAAQ,EACR,SAAS,EACT,SAAS,EACT,SAAS,EACT,UAAU,EACV,OAAO,EACP,QAAQ,EACR,OAAO,EACP,OAAO,EACP,OAAO,EACP,kBAAkB,EAClB,SAAS,CACD;AACV,OAAO,MAAMC,kBAAkB,GAAG,CAChC,MAAM,EACN,KAAK,EACL,OAAO,EACP,OAAO,EACP,KAAK,EACL,MAAM,EACN,SAAS,EACT,OAAO,EACP,UAAU,EACV,QAAQ,EACR,MAAM,EACN,SAAS,EACT,OAAO,CACC;AAEV,OAAO,MAAMC,eAAoC,GAAG,IAAIC,GAAG,CAACH,YAAY,CAAC;AACzE,OAAO,MAAMI,qBAA0C,GAAG,IAAID,GAAG,CAC/DF,kBACF,CAAC;AAED,OAAO,MAAMI,kBAEZ,GAAG;EACFC,eAAe,EAAE,eAAe;EAChCC,sBAAsB,EAAE,mBAAmB;EAC3CC,oBAAoB,EAAE,mBAAmB;EACzCC,mBAAmB,EAAE,mBAAmB;EACxCC,eAAe,EAAE,eAAe;EAChCC,kBAAkB,EAAE,kBAAkB;EACtCC,aAAa,EAAE,aAAa;EAC5BC,oBAAoB,EAAE,aAAa;EACnCC,aAAa,EAAE,aAAa;EAC5BC,aAAa,EAAE;AACjB,CAAC","ignoreList":[]}
|
|
@@ -2,32 +2,37 @@
|
|
|
2
2
|
|
|
3
3
|
import NativeHmsScan from "./NativeHmsScan.js";
|
|
4
4
|
import { formatsToCsv, parseResultsJson } from "./format.js";
|
|
5
|
-
import {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
throw new
|
|
5
|
+
import { scanError } from "./errors.js";
|
|
6
|
+
import { ScanError } from "./ScanError.js";
|
|
7
|
+
export async function decodeImage(input) {
|
|
8
|
+
// No remote authority, empty filename, fragment, query or malformed escapes.
|
|
9
|
+
const uri = input?.uri;
|
|
10
|
+
if (typeof uri !== 'string' || !/^file:\/\/\/(?:[^?#\s]+\/)*[^/?#\s]+$/i.test(uri)) {
|
|
11
|
+
throw new ScanError({
|
|
12
|
+
reason: 'invalid_input',
|
|
13
|
+
message: 'decodeImage 需要可读的 file URI'
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
try {
|
|
17
|
+
decodeURIComponent(uri);
|
|
18
|
+
} catch {
|
|
19
|
+
throw new ScanError({
|
|
20
|
+
reason: 'invalid_input',
|
|
21
|
+
message: '图片 URI 编码无效'
|
|
22
|
+
});
|
|
20
23
|
}
|
|
24
|
+
const csv = formatsToCsv(input.formats);
|
|
25
|
+
if (!NativeHmsScan) throw new ScanError({
|
|
26
|
+
reason: 'unavailable',
|
|
27
|
+
message: 'HMS Scan 原生模块未安装'
|
|
28
|
+
});
|
|
21
29
|
try {
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
throw new HmsScanError(err.code, err.message);
|
|
29
|
-
}
|
|
30
|
-
throw new HmsScanError('E_UNKNOWN', err.message ?? 'decodeImage failed');
|
|
30
|
+
return parseResultsJson(await NativeHmsScan.decodeImage(uri, csv));
|
|
31
|
+
} catch (error) {
|
|
32
|
+
throw scanError(error, {
|
|
33
|
+
reason: 'decode_failed',
|
|
34
|
+
message: '图片识别失败'
|
|
35
|
+
});
|
|
31
36
|
}
|
|
32
37
|
}
|
|
33
38
|
//# sourceMappingURL=decodeImage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["NativeHmsScan","formatsToCsv","parseResultsJson","
|
|
1
|
+
{"version":3,"names":["NativeHmsScan","formatsToCsv","parseResultsJson","scanError","ScanError","decodeImage","input","uri","test","reason","message","decodeURIComponent","csv","formats","error"],"sourceRoot":"../../src","sources":["decodeImage.ts"],"mappings":";;AAAA,OAAOA,aAAa,MAAM,oBAAiB;AAC3C,SAASC,YAAY,EAAEC,gBAAgB,QAAQ,aAAU;AACzD,SAASC,SAAS,QAAQ,aAAU;AACpC,SAASC,SAAS,QAAQ,gBAAa;AAGvC,OAAO,eAAeC,WAAWA,CAC/BC,KAAqC,EACL;EAChC;EACA,MAAMC,GAAG,GAAGD,KAAK,EAAEC,GAAG;EACtB,IACE,OAAOA,GAAG,KAAK,QAAQ,IACvB,CAAC,wCAAwC,CAACC,IAAI,CAACD,GAAG,CAAC,EACnD;IACA,MAAM,IAAIH,SAAS,CAAC;MAClBK,MAAM,EAAE,eAAe;MACvBC,OAAO,EAAE;IACX,CAAC,CAAC;EACJ;EACA,IAAI;IACFC,kBAAkB,CAACJ,GAAG,CAAC;EACzB,CAAC,CAAC,MAAM;IACN,MAAM,IAAIH,SAAS,CAAC;MAClBK,MAAM,EAAE,eAAe;MACvBC,OAAO,EAAE;IACX,CAAC,CAAC;EACJ;EACA,MAAME,GAAG,GAAGX,YAAY,CAACK,KAAK,CAACO,OAAO,CAAC;EACvC,IAAI,CAACb,aAAa,EAChB,MAAM,IAAII,SAAS,CAAC;IAClBK,MAAM,EAAE,aAAa;IACrBC,OAAO,EAAE;EACX,CAAC,CAAC;EACJ,IAAI;IACF,OAAOR,gBAAgB,CAAC,MAAMF,aAAa,CAACK,WAAW,CAACE,GAAG,EAAEK,GAAG,CAAC,CAAC;EACpE,CAAC,CAAC,OAAOE,KAAK,EAAE;IACd,MAAMX,SAAS,CAACW,KAAK,EAAE;MACrBL,MAAM,EAAE,eAAe;MACvBC,OAAO,EAAE;IACX,CAAC,CAAC;EACJ;AACF","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["unsupportedScanError","decodeImage","_input"],"sourceRoot":"../../src","sources":["decodeImage.web.ts"],"mappings":";;AAAA,SAASA,oBAAoB,QAAQ,aAAU;AAG/C,OAAO,eAAeC,WAAWA,CAC/BC,MAAsC,EACN;EAChC,MAAMF,oBAAoB,CAAC,CAAC;AAC9B","ignoreList":[]}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { ScanError } from "./ScanError.js";
|
|
4
|
+
import { SCAN_ERROR_REASONS } from "./constants.js";
|
|
5
|
+
/** Native boundary normalization; Scanner only uses this for its external picker. */
|
|
6
|
+
export function scanError(error, fallback) {
|
|
7
|
+
if (error instanceof ScanError) return error;
|
|
8
|
+
const raw = error && typeof error === 'object' ? error : {};
|
|
9
|
+
const sourceCode = typeof raw.code === 'string' ? raw.code : undefined;
|
|
10
|
+
return new ScanError({
|
|
11
|
+
reason: sourceCode && SCAN_ERROR_REASONS[sourceCode] || fallback.reason,
|
|
12
|
+
message: typeof raw.message === 'string' ? raw.message : fallback.message,
|
|
13
|
+
...(sourceCode ? {
|
|
14
|
+
sourceCode
|
|
15
|
+
} : {})
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
export function unsupportedScanError() {
|
|
19
|
+
return new ScanError({
|
|
20
|
+
reason: 'unsupported',
|
|
21
|
+
message: 'HMS Scan 仅支持 Android 与 iOS 设备'
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["ScanError","SCAN_ERROR_REASONS","scanError","error","fallback","raw","sourceCode","code","undefined","reason","message","unsupportedScanError"],"sourceRoot":"../../src","sources":["errors.ts"],"mappings":";;AAAA,SAASA,SAAS,QAAQ,gBAAa;AACvC,SAASC,kBAAkB,QAAQ,gBAAa;AAGhD;AACA,OAAO,SAASC,SAASA,CACvBC,KAAc,EACdC,QAA+B,EACpB;EACX,IAAID,KAAK,YAAYH,SAAS,EAAE,OAAOG,KAAK;EAC5C,MAAME,GAAG,GACPF,KAAK,IAAI,OAAOA,KAAK,KAAK,QAAQ,GAAIA,KAAK,GAAyB,CAAC,CAAC;EACxE,MAAMG,UAAU,GAAG,OAAOD,GAAG,CAACE,IAAI,KAAK,QAAQ,GAAGF,GAAG,CAACE,IAAI,GAAGC,SAAS;EACtE,OAAO,IAAIR,SAAS,CAAC;IACnBS,MAAM,EAAGH,UAAU,IAAIL,kBAAkB,CAACK,UAAU,CAAC,IAAKF,QAAQ,CAACK,MAAM;IACzEC,OAAO,EAAE,OAAOL,GAAG,CAACK,OAAO,KAAK,QAAQ,GAAGL,GAAG,CAACK,OAAO,GAAGN,QAAQ,CAACM,OAAO;IACzE,IAAIJ,UAAU,GAAG;MAAEA;IAAW,CAAC,GAAG,CAAC,CAAC;EACtC,CAAC,CAAC;AACJ;AAEA,OAAO,SAASK,oBAAoBA,CAAA,EAAc;EAChD,OAAO,IAAIX,SAAS,CAAC;IACnBS,MAAM,EAAE,aAAa;IACrBC,OAAO,EAAE;EACX,CAAC,CAAC;AACJ","ignoreList":[]}
|
package/lib/module/format.js
CHANGED
|
@@ -1,66 +1,72 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
const CONTENT_TYPES = ['TEXT', 'URL', 'EMAIL', 'PHONE', 'SMS', 'WIFI', 'CONTACT', 'EVENT', 'LOCATION', 'DRIVER', 'ISBN', 'ARTICLE', 'OTHER'];
|
|
6
|
-
const CONTENT_SET = new Set(CONTENT_TYPES);
|
|
7
|
-
|
|
8
|
-
/** 把任意字符串安全收敛成 BarcodeFormat(未知归 UNKNOWN)。 */
|
|
3
|
+
import { SCAN_FORMAT_SET, SCAN_CONTENT_TYPE_SET } from "./constants.js";
|
|
4
|
+
import { ScanError } from "./ScanError.js";
|
|
9
5
|
export function coerceFormat(value) {
|
|
10
|
-
return typeof value === 'string' &&
|
|
6
|
+
return typeof value === 'string' && SCAN_FORMAT_SET.has(value) ? value : 'UNKNOWN';
|
|
11
7
|
}
|
|
12
|
-
|
|
13
|
-
/** 把任意字符串安全收敛成 BarcodeContentType(未知/缺省 → undefined)。 */
|
|
14
8
|
export function coerceContentType(value) {
|
|
15
|
-
return typeof value === 'string' &&
|
|
9
|
+
return typeof value === 'string' && SCAN_CONTENT_TYPE_SET.has(value) ? value : undefined;
|
|
16
10
|
}
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
11
|
+
/** Empty means no extra filter. Order and duplicates do not change the filter. */
|
|
12
|
+
export function formatsToCsv(value) {
|
|
13
|
+
if (value === undefined) return '';
|
|
14
|
+
if (!Array.isArray(value) || [...value].some(item => typeof item !== 'string' || item === 'UNKNOWN' || !SCAN_FORMAT_SET.has(item))) {
|
|
15
|
+
throw new ScanError({
|
|
16
|
+
reason: 'invalid_input',
|
|
17
|
+
message: 'formats 包含无效码制'
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
return [...new Set(value)].sort().join(',');
|
|
21
21
|
}
|
|
22
|
-
function
|
|
22
|
+
export function formatConfiguration(value) {
|
|
23
|
+
try {
|
|
24
|
+
return {
|
|
25
|
+
csv: formatsToCsv(value),
|
|
26
|
+
error: undefined
|
|
27
|
+
};
|
|
28
|
+
} catch (error) {
|
|
29
|
+
return {
|
|
30
|
+
csv: '',
|
|
31
|
+
error: error
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
function cornerPoints(value) {
|
|
23
36
|
if (!Array.isArray(value)) return undefined;
|
|
24
|
-
const points = value.filter(p => !!p && typeof p.x === 'number' && typeof p.y === 'number').map(p => ({
|
|
37
|
+
const points = value.filter(p => !!p && typeof p.x === 'number' && Number.isFinite(p.x) && typeof p.y === 'number' && Number.isFinite(p.y)).map(p => ({
|
|
25
38
|
x: p.x,
|
|
26
39
|
y: p.y
|
|
27
40
|
}));
|
|
28
|
-
return points.length
|
|
41
|
+
return points.length ? points : undefined;
|
|
29
42
|
}
|
|
30
|
-
function
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
const result = {
|
|
36
|
-
value: r.value,
|
|
37
|
-
format: coerceFormat(r.format)
|
|
38
|
-
};
|
|
39
|
-
const contentType = coerceContentType(r.contentType);
|
|
40
|
-
if (contentType) result.contentType = contentType;
|
|
41
|
-
const cornerPoints = coerceCornerPoints(r.cornerPoints);
|
|
42
|
-
if (cornerPoints) result.cornerPoints = cornerPoints;
|
|
43
|
-
return result;
|
|
43
|
+
function invalidResponse() {
|
|
44
|
+
throw new ScanError({
|
|
45
|
+
reason: 'invalid_response',
|
|
46
|
+
message: '原生扫码结果不符合约定'
|
|
47
|
+
});
|
|
44
48
|
}
|
|
45
|
-
|
|
46
|
-
/**
|
|
47
|
-
* 解析原生回传的 JSON 字符串 → 强类型 ScanResult[]。
|
|
48
|
-
* 任何脏数据都被安全过滤;解析失败返回空数组而非抛错。
|
|
49
|
-
*/
|
|
49
|
+
/** Malformed bridge data is distinct from a successfully decoded empty batch. */
|
|
50
50
|
export function parseResultsJson(json) {
|
|
51
|
-
|
|
52
|
-
|
|
51
|
+
let data;
|
|
52
|
+
if (typeof json !== 'string') return invalidResponse();
|
|
53
53
|
try {
|
|
54
|
-
|
|
54
|
+
data = JSON.parse(json);
|
|
55
55
|
} catch {
|
|
56
|
-
return
|
|
57
|
-
}
|
|
58
|
-
if (!Array.isArray(parsed)) return [];
|
|
59
|
-
const out = [];
|
|
60
|
-
for (const item of parsed) {
|
|
61
|
-
const r = coerceResult(item);
|
|
62
|
-
if (r) out.push(r);
|
|
56
|
+
return invalidResponse();
|
|
63
57
|
}
|
|
64
|
-
return
|
|
58
|
+
if (!Array.isArray(data)) return invalidResponse();
|
|
59
|
+
return data.map(raw => {
|
|
60
|
+
if (!raw || typeof raw !== 'object' || typeof raw.value !== 'string' || typeof raw.format !== 'string') return invalidResponse();
|
|
61
|
+
const result = {
|
|
62
|
+
value: raw.value,
|
|
63
|
+
format: coerceFormat(raw.format)
|
|
64
|
+
};
|
|
65
|
+
const contentType = coerceContentType(raw.contentType);
|
|
66
|
+
const points = cornerPoints(raw.cornerPoints);
|
|
67
|
+
if (contentType !== undefined) result.contentType = contentType;
|
|
68
|
+
if (points !== undefined) result.cornerPoints = points;
|
|
69
|
+
return result;
|
|
70
|
+
});
|
|
65
71
|
}
|
|
66
72
|
//# sourceMappingURL=format.js.map
|