@unif/react-native-hms-scan 0.5.4 → 0.5.5

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.
Files changed (33) hide show
  1. package/android/src/main/java/com/unif/reactnativehmsscan/HmsScanView.kt +31 -15
  2. package/lib/module/NativeHmsScan.js.map +1 -1
  3. package/lib/module/Scanner/ScanErrorOverlay.js +55 -0
  4. package/lib/module/Scanner/ScanErrorOverlay.js.map +1 -0
  5. package/lib/module/Scanner/Scanner.js +176 -52
  6. package/lib/module/Scanner/Scanner.js.map +1 -1
  7. package/lib/module/decodeImage.js +3 -2
  8. package/lib/module/decodeImage.js.map +1 -1
  9. package/lib/module/index.js.map +1 -1
  10. package/lib/module/types.js +2 -0
  11. package/lib/module/types.js.map +1 -1
  12. package/lib/typescript/src/HmsScanView.d.ts +3 -6
  13. package/lib/typescript/src/HmsScanView.d.ts.map +1 -1
  14. package/lib/typescript/src/NativeHmsScan.d.ts +3 -1
  15. package/lib/typescript/src/NativeHmsScan.d.ts.map +1 -1
  16. package/lib/typescript/src/Scanner/ScanErrorOverlay.d.ts +7 -0
  17. package/lib/typescript/src/Scanner/ScanErrorOverlay.d.ts.map +1 -0
  18. package/lib/typescript/src/Scanner/Scanner.d.ts +9 -6
  19. package/lib/typescript/src/Scanner/Scanner.d.ts.map +1 -1
  20. package/lib/typescript/src/decodeImage.d.ts +3 -2
  21. package/lib/typescript/src/decodeImage.d.ts.map +1 -1
  22. package/lib/typescript/src/index.d.ts +1 -1
  23. package/lib/typescript/src/index.d.ts.map +1 -1
  24. package/lib/typescript/src/types.d.ts +6 -1
  25. package/lib/typescript/src/types.d.ts.map +1 -1
  26. package/package.json +3 -2
  27. package/src/HmsScanView.tsx +3 -3
  28. package/src/NativeHmsScan.ts +3 -1
  29. package/src/Scanner/ScanErrorOverlay.tsx +51 -0
  30. package/src/Scanner/Scanner.tsx +236 -54
  31. package/src/decodeImage.ts +3 -2
  32. package/src/index.tsx +1 -0
  33. package/src/types.ts +7 -1
@@ -41,6 +41,8 @@ class HmsScanView(
41
41
  // Runtime props (applied to the live RemoteView; stashed until it exists).
42
42
  private var paused: Boolean = false
43
43
  private var torch: Boolean = false
44
+ private var actualTorchOn: Boolean = false
45
+ private var torchAvailable: Boolean = false
44
46
 
45
47
  // True while this view is between onAttachedToWindow and onDetachedFromWindow.
46
48
  private var attached: Boolean = false
@@ -82,10 +84,7 @@ class HmsScanView(
82
84
  if (remoteView == null) {
83
85
  buildRemoteView()
84
86
  }
85
- remoteView?.let {
86
- it.onStart()
87
- it.onResume()
88
- }
87
+ startRemoteView()
89
88
  }
90
89
 
91
90
  override fun onDetachedFromWindow() {
@@ -99,6 +98,8 @@ class HmsScanView(
99
98
  override fun onHostResume() {
100
99
  if (attached) {
101
100
  remoteView?.onResume()
101
+ applyPaused()
102
+ applyTorch()
102
103
  }
103
104
  }
104
105
 
@@ -154,12 +155,18 @@ class HmsScanView(
154
155
  )
155
156
 
156
157
  remoteView = view
158
+ } catch (e: Throwable) {
159
+ emitError("E_CAMERA_INIT", e.message ?: "Failed to initialize camera")
160
+ }
161
+ }
157
162
 
158
- // Apply runtime props that may have arrived before the view existed.
163
+ private fun startRemoteView() {
164
+ remoteView?.let {
165
+ it.onStart()
166
+ it.onResume()
167
+ // RemoteView 进入 active lifecycle 后再落实首次收到的 runtime props。
159
168
  applyPaused()
160
169
  applyTorch()
161
- } catch (e: Throwable) {
162
- emitError("E_CAMERA_INIT", e.message ?: "Failed to initialize camera")
163
170
  }
164
171
  }
165
172
 
@@ -174,6 +181,7 @@ class HmsScanView(
174
181
  }
175
182
  removeView(view)
176
183
  remoteView = null
184
+ actualTorchOn = false
177
185
  }
178
186
 
179
187
  /** Rebuild the RemoteView in place to honour a changed build-time prop. */
@@ -181,10 +189,7 @@ class HmsScanView(
181
189
  if (!attached) return
182
190
  teardownRemoteView()
183
191
  buildRemoteView()
184
- remoteView?.let {
185
- it.onStart()
186
- it.onResume()
187
- }
192
+ startRemoteView()
188
193
  }
189
194
 
190
195
  private fun applyPaused() {
@@ -210,6 +215,7 @@ class HmsScanView(
210
215
  } catch (_: Throwable) {
211
216
  // Ignore: device may have no flash.
212
217
  }
218
+ emitTorchStatus(view)
213
219
  }
214
220
 
215
221
  /** Resolve the hosting Activity required by RemoteView.Builder.setContext(). */
@@ -232,13 +238,23 @@ class HmsScanView(
232
238
  }
233
239
 
234
240
  private fun onTorchVisible(visible: Boolean) {
235
- // Keep our cached torch flag in sync with the actual hardware state.
236
- val on = remoteView?.lightStatus ?: torch
237
- torch = on
241
+ torchAvailable = visible
242
+ val view = remoteView ?: return
243
+ emitTorchStatus(view)
244
+ }
245
+
246
+ private fun emitTorchStatus(view: RemoteView) {
247
+ val on =
248
+ try {
249
+ view.lightStatus
250
+ } catch (_: Throwable) {
251
+ actualTorchOn
252
+ }
253
+ actualTorchOn = on
238
254
  emitEvent(
239
255
  "topTorchStatus",
240
256
  Arguments.createMap().apply {
241
- putBoolean("available", visible)
257
+ putBoolean("available", torchAvailable)
242
258
  putBoolean("on", on)
243
259
  },
244
260
  )
@@ -1 +1 @@
1
- {"version":3,"names":["TurboModuleRegistry","getEnforcing"],"sourceRoot":"../../src","sources":["NativeHmsScan.ts"],"mappings":";;AACA,SAASA,mBAAmB,QAAQ,cAAc;;AAElD;AACA;AACA;AACA;;AAiBA,eAAeA,mBAAmB,CAACC,YAAY,CAAO,SAAS,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["TurboModuleRegistry","getEnforcing"],"sourceRoot":"../../src","sources":["NativeHmsScan.ts"],"mappings":";;AACA,SAASA,mBAAmB,QAAQ,cAAc;;AAElD;AACA;AACA;AACA;;AAmBA,eAAeA,mBAAmB,CAACC,YAAY,CAAO,SAAS,CAAC","ignoreList":[]}
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+
3
+ import { StyleSheet, View } from 'react-native';
4
+ import { Button, Empty, useThemedStyles, r } from '@unif/react-native-design';
5
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
6
+ export function ScanErrorOverlay({
7
+ onClose,
8
+ onRetry
9
+ }) {
10
+ const s = useThemedStyles(makeStyles);
11
+ return /*#__PURE__*/_jsxs(View, {
12
+ style: s.overlay,
13
+ children: [/*#__PURE__*/_jsx(Empty, {
14
+ icon: "error-alert",
15
+ title: "\u76F8\u673A\u542F\u52A8\u5931\u8D25",
16
+ desc: "\u65E0\u6CD5\u542F\u52A8\u626B\u7801\u76F8\u673A\uFF0C\u8BF7\u786E\u8BA4\u6743\u9650\u4E0E\u8BBE\u5907\u72B6\u6001\u540E\u91CD\u8BD5\u3002"
17
+ }), /*#__PURE__*/_jsxs(View, {
18
+ style: styles.row,
19
+ children: [onClose && /*#__PURE__*/_jsx(Button, {
20
+ label: "\u53D6\u6D88",
21
+ variant: "ghost",
22
+ block: true,
23
+ onPress: onClose
24
+ }), /*#__PURE__*/_jsx(Button, {
25
+ label: "\u91CD\u8BD5",
26
+ variant: "primary",
27
+ block: true,
28
+ onPress: onRetry
29
+ })]
30
+ })]
31
+ });
32
+ }
33
+ const styles = StyleSheet.create({
34
+ row: {
35
+ flexDirection: 'row',
36
+ columnGap: r(12),
37
+ marginTop: r(8)
38
+ }
39
+ });
40
+ const makeStyles = c => StyleSheet.create({
41
+ overlay: {
42
+ position: 'absolute',
43
+ top: 0,
44
+ left: 0,
45
+ right: 0,
46
+ bottom: 0,
47
+ zIndex: 40,
48
+ backgroundColor: c.background,
49
+ alignItems: 'center',
50
+ justifyContent: 'center',
51
+ paddingHorizontal: r(40),
52
+ rowGap: r(8)
53
+ }
54
+ });
55
+ //# sourceMappingURL=ScanErrorOverlay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["StyleSheet","View","Button","Empty","useThemedStyles","r","jsx","_jsx","jsxs","_jsxs","ScanErrorOverlay","onClose","onRetry","s","makeStyles","style","overlay","children","icon","title","desc","styles","row","label","variant","block","onPress","create","flexDirection","columnGap","marginTop","c","position","top","left","right","bottom","zIndex","backgroundColor","background","alignItems","justifyContent","paddingHorizontal","rowGap"],"sourceRoot":"../../../src","sources":["Scanner/ScanErrorOverlay.tsx"],"mappings":";;AAAA,SAASA,UAAU,EAAEC,IAAI,QAAQ,cAAc;AAC/C,SACEC,MAAM,EACNC,KAAK,EACLC,eAAe,EACfC,CAAC,QAEI,2BAA2B;AAAC,SAAAC,GAAA,IAAAC,IAAA,EAAAC,IAAA,IAAAC,KAAA;AAOnC,OAAO,SAASC,gBAAgBA,CAAC;EAAEC,OAAO;EAAEC;AAA+B,CAAC,EAAE;EAC5E,MAAMC,CAAC,GAAGT,eAAe,CAACU,UAAU,CAAC;EACrC,oBACEL,KAAA,CAACR,IAAI;IAACc,KAAK,EAAEF,CAAC,CAACG,OAAQ;IAAAC,QAAA,gBACrBV,IAAA,CAACJ,KAAK;MACJe,IAAI,EAAC,aAAa;MAClBC,KAAK,EAAC,sCAAQ;MACdC,IAAI,EAAC;IAAyB,CAC/B,CAAC,eACFX,KAAA,CAACR,IAAI;MAACc,KAAK,EAAEM,MAAM,CAACC,GAAI;MAAAL,QAAA,GACrBN,OAAO,iBAAIJ,IAAA,CAACL,MAAM;QAACqB,KAAK,EAAC,cAAI;QAACC,OAAO,EAAC,OAAO;QAACC,KAAK;QAACC,OAAO,EAAEf;MAAQ,CAAE,CAAC,eACzEJ,IAAA,CAACL,MAAM;QAACqB,KAAK,EAAC,cAAI;QAACC,OAAO,EAAC,SAAS;QAACC,KAAK;QAACC,OAAO,EAAEd;MAAQ,CAAE,CAAC;IAAA,CAC3D,CAAC;EAAA,CACH,CAAC;AAEX;AAEA,MAAMS,MAAM,GAAGrB,UAAU,CAAC2B,MAAM,CAAC;EAC/BL,GAAG,EAAE;IAAEM,aAAa,EAAE,KAAK;IAAEC,SAAS,EAAExB,CAAC,CAAC,EAAE,CAAC;IAAEyB,SAAS,EAAEzB,CAAC,CAAC,CAAC;EAAE;AACjE,CAAC,CAAC;AAEF,MAAMS,UAAU,GAAIiB,CAAc,IAChC/B,UAAU,CAAC2B,MAAM,CAAC;EAChBX,OAAO,EAAE;IACPgB,QAAQ,EAAE,UAAU;IACpBC,GAAG,EAAE,CAAC;IACNC,IAAI,EAAE,CAAC;IACPC,KAAK,EAAE,CAAC;IACRC,MAAM,EAAE,CAAC;IACTC,MAAM,EAAE,EAAE;IACVC,eAAe,EAAEP,CAAC,CAACQ,UAAU;IAC7BC,UAAU,EAAE,QAAQ;IACpBC,cAAc,EAAE,QAAQ;IACxBC,iBAAiB,EAAErC,CAAC,CAAC,EAAE,CAAC;IACxBsC,MAAM,EAAEtC,CAAC,CAAC,CAAC;EACb;AACF,CAAC,CAAC","ignoreList":[]}
@@ -1,8 +1,8 @@
1
1
  "use strict";
2
2
 
3
3
  import { useCallback, useEffect, useRef, useState } from 'react';
4
- import { Linking, StyleSheet, View } from 'react-native';
5
- import { ThemeProvider, ToastHost } from '@unif/react-native-design';
4
+ import { AppState, Linking, StyleSheet, View } from 'react-native';
5
+ import { ThemeProvider } from '@unif/react-native-design';
6
6
  import { HmsScanView } from "../HmsScanView.js";
7
7
  import { decodeImage } from "../decodeImage.js";
8
8
  import { getCameraPermissionStatus, requestCameraPermission } from "../permissions.js";
@@ -13,21 +13,35 @@ import { ScanToolbar } from "./ScanToolbar.js";
13
13
  import { ResultFocus } from "./ResultFocus.js";
14
14
  import { ResultFail } from "./ResultFail.js";
15
15
  import { DeniedOverlay } from "./DeniedOverlay.js";
16
+ import { ScanErrorOverlay } from "./ScanErrorOverlay.js";
16
17
 
17
18
  // 'done':autoConfirm 自动回调后的终态——相机暂停、不出卡片、不自动重扫(宿主通常已导航离开)。
18
19
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
19
20
  const VF_SIZE = 256;
20
21
  const DEFAULT_HINT = '将条码 / 二维码放入框内,自动扫描';
22
+ function toScanError(error, fallbackMessage) {
23
+ if (error && typeof error === 'object') {
24
+ const native = error;
25
+ return {
26
+ code: typeof native.code === 'string' ? native.code : 'E_UNKNOWN',
27
+ message: typeof native.message === 'string' ? native.message : fallbackMessage
28
+ };
29
+ }
30
+ return {
31
+ code: 'E_UNKNOWN',
32
+ message: fallbackMessage
33
+ };
34
+ }
21
35
  /**
22
36
  * 成品「扫一扫」界面(聚焦款)。底层 <HmsScanView> 出相机画面,取景框 / 工具栏 / 结果卡
23
- * 全用 @unif/react-native-design 的主题令牌与组件绘制(统一风格)。自带 ThemeProvider +
24
- * ToastHost,可直接整屏接入;放进宿主已有的 ThemeProvider 里也兼容。
37
+ * 全用 @unif/react-native-design 的主题令牌与组件绘制(统一风格)。自带 ThemeProvider,
38
+ * 可直接整屏接入;放进宿主已有的 ThemeProvider 里也兼容。
25
39
  */
26
40
  export function Scanner(props) {
27
- return /*#__PURE__*/_jsxs(ThemeProvider, {
28
- children: [/*#__PURE__*/_jsx(ScannerInner, {
41
+ return /*#__PURE__*/_jsx(ThemeProvider, {
42
+ children: /*#__PURE__*/_jsx(ScannerInner, {
29
43
  ...props
30
- }), /*#__PURE__*/_jsx(ToastHost, {})]
44
+ })
31
45
  });
32
46
  }
33
47
  function ScannerInner({
@@ -41,59 +55,126 @@ function ScannerInner({
41
55
  resolveProduct,
42
56
  onConfirm,
43
57
  autoConfirm = false,
44
- pickImage
58
+ pickImage,
59
+ onScanError
45
60
  }) {
46
61
  const [phase, setPhase] = useState('init');
47
62
  const [torch, setTorch] = useState(false);
48
63
  const [product, setProduct] = useState(null);
49
64
  const [detectMs, setDetectMs] = useState(0);
65
+ const [scanSession, setScanSession] = useState(0);
50
66
  const handlingRef = useRef(false);
67
+ const acceptingResultsRef = useRef(false);
68
+ const scanSessionRef = useRef(0);
51
69
  const detectStartRef = useRef(0);
52
70
  const lastResultRef = useRef(null);
53
71
  const mountedRef = useRef(true);
72
+ const permissionRunRef = useRef(0);
73
+ const processingRunRef = useRef(0);
74
+ const waitingForSettingsRef = useRef(false);
75
+ const onScanErrorRef = useRef(onScanError);
76
+ onScanErrorRef.current = onScanError;
77
+ const invalidateProcessing = useCallback(() => {
78
+ ++processingRunRef.current;
79
+ }, []);
80
+ const invalidateScanSession = useCallback(() => {
81
+ ++scanSessionRef.current;
82
+ acceptingResultsRef.current = false;
83
+ }, []);
84
+ const enterScan = useCallback(() => {
85
+ invalidateProcessing();
86
+ handlingRef.current = false;
87
+ const sessionId = ++scanSessionRef.current;
88
+ acceptingResultsRef.current = true;
89
+ setScanSession(sessionId);
90
+ setProduct(null);
91
+ lastResultRef.current = null;
92
+ setPhase('scan');
93
+ }, [invalidateProcessing]);
94
+ const enterDenied = useCallback(() => {
95
+ ++permissionRunRef.current;
96
+ invalidateProcessing();
97
+ invalidateScanSession();
98
+ setProduct(null);
99
+ setPhase('denied');
100
+ }, [invalidateProcessing, invalidateScanSession]);
101
+ const reportFatalError = useCallback(error => {
102
+ // fatal 后不允许已在途的权限检查或扫码 / 相册处理链覆盖 error phase。
103
+ ++permissionRunRef.current;
104
+ invalidateProcessing();
105
+ invalidateScanSession();
106
+ setProduct(null);
107
+ setPhase('error');
108
+ onScanErrorRef.current?.(error);
109
+ }, [invalidateProcessing, invalidateScanSession]);
110
+ const runPermissionFlow = useCallback(async requestIfNeeded => {
111
+ const runId = ++permissionRunRef.current;
112
+ const isCurrent = () => mountedRef.current && permissionRunRef.current === runId;
113
+ try {
114
+ let status = await getCameraPermissionStatus();
115
+ if (!isCurrent()) return;
116
+ if (requestIfNeeded && (status === 'undetermined' || status === 'denied')) {
117
+ status = await requestCameraPermission();
118
+ if (!isCurrent()) return;
119
+ }
120
+ if (status === 'granted') {
121
+ enterScan();
122
+ } else {
123
+ enterDenied();
124
+ }
125
+ } catch (error) {
126
+ if (!isCurrent()) return;
127
+ reportFatalError(toScanError(error, '检查相机权限失败'));
128
+ }
129
+ }, [enterDenied, enterScan, reportFatalError]);
54
130
 
55
131
  // 权限流:已授权 → scan;否则请求;仍未授权 → denied。
56
132
  useEffect(() => {
57
133
  mountedRef.current = true;
58
- (async () => {
59
- try {
60
- let status = await getCameraPermissionStatus();
61
- if (status === 'undetermined' || status === 'denied') {
62
- status = await requestCameraPermission();
63
- }
64
- if (!mountedRef.current) return;
65
- setPhase(status === 'granted' ? 'scan' : 'denied');
66
- } catch {
67
- if (mountedRef.current) setPhase('scan');
68
- }
69
- })();
134
+ void runPermissionFlow(true);
70
135
  return () => {
71
136
  mountedRef.current = false;
137
+ ++permissionRunRef.current;
138
+ invalidateProcessing();
139
+ invalidateScanSession();
72
140
  };
73
- }, []);
141
+ }, [invalidateProcessing, invalidateScanSession, runPermissionFlow]);
142
+ useEffect(() => {
143
+ const subscription = AppState.addEventListener('change', nextState => {
144
+ if (nextState === 'active' && waitingForSettingsRef.current) {
145
+ waitingForSettingsRef.current = false;
146
+ void runPermissionFlow(false);
147
+ }
148
+ });
149
+ return () => subscription.remove();
150
+ }, [runPermissionFlow]);
151
+ useEffect(() => {
152
+ if (!showTorch) setTorch(false);
153
+ }, [showTorch]);
74
154
  const reset = useCallback(() => {
75
- handlingRef.current = false;
76
- setProduct(null);
77
- setPhase('scan');
78
- }, []);
79
- const finalize = useCallback(async result => {
155
+ enterScan();
156
+ }, [enterScan]);
157
+ const finalize = useCallback(async (result, runId) => {
158
+ const isCurrent = () => mountedRef.current && processingRunRef.current === runId;
159
+ if (!isCurrent()) return;
80
160
  lastResultRef.current = result;
81
161
  try {
82
162
  const resolved = resolveProduct ? await resolveProduct(result) : {
83
163
  name: result.value
84
164
  };
85
- if (!mountedRef.current) return;
165
+ if (!isCurrent()) return;
86
166
  if (!resolved) {
87
167
  setPhase('fail');
88
168
  return;
89
169
  }
90
170
  const p = {
91
- barcode: result.value,
92
- ...resolved
171
+ ...resolved,
172
+ barcode: resolved.barcode ?? result.value
93
173
  };
94
- if (autoConfirm) {
174
+ if (autoConfirm && onConfirm) {
95
175
  // 跳过结果卡:直接回调,进 'done' 终态(相机暂停、不自动重扫)。
96
- onConfirm?.(p, result);
176
+ onConfirm(p, result);
177
+ if (!isCurrent()) return;
97
178
  setPhase('done');
98
179
  return;
99
180
  }
@@ -101,46 +182,85 @@ function ScannerInner({
101
182
  setDetectMs(Date.now() - detectStartRef.current);
102
183
  setPhase('success');
103
184
  } catch {
104
- if (mountedRef.current) setPhase('fail');
185
+ if (isCurrent()) setPhase('fail');
105
186
  }
106
187
  }, [resolveProduct, autoConfirm, onConfirm]);
107
188
  const onCameraResult = useCallback(results => {
108
- if (phase !== 'scan' || handlingRef.current) return;
189
+ if (scanSession !== scanSessionRef.current || phase !== 'scan' || !acceptingResultsRef.current || handlingRef.current) {
190
+ return;
191
+ }
109
192
  const first = results[0];
110
193
  if (!first) return;
194
+ acceptingResultsRef.current = false;
111
195
  handlingRef.current = true;
196
+ const runId = ++processingRunRef.current;
112
197
  detectStartRef.current = Date.now();
113
198
  setPhase('detecting');
114
- void finalize(first);
115
- }, [phase, finalize]);
116
- const onScanError = useCallback(error => {
117
- if (error.code === 'E_NO_CAMERA_PERMISSION') setPhase('denied');
199
+ void finalize(first, runId);
200
+ }, [phase, scanSession, finalize]);
201
+ const handleViewScanError = useCallback(error => {
202
+ if (error.code === 'E_NO_CAMERA_PERMISSION') {
203
+ enterDenied();
204
+ } else if (error.code !== 'E_NO_RESULT') {
205
+ reportFatalError(error);
206
+ return;
207
+ }
208
+ onScanErrorRef.current?.(error);
209
+ }, [enterDenied, reportFatalError]);
210
+ const onTorchStatus = useCallback(status => {
211
+ setTorch(status.on);
118
212
  }, []);
213
+ const openSettings = useCallback(async () => {
214
+ waitingForSettingsRef.current = true;
215
+ try {
216
+ await Linking.openSettings();
217
+ } catch (error) {
218
+ waitingForSettingsRef.current = false;
219
+ if (mountedRef.current) {
220
+ reportFatalError(toScanError(error, '打开系统设置失败'));
221
+ }
222
+ }
223
+ }, [reportFatalError]);
224
+ const retryCamera = useCallback(() => {
225
+ invalidateProcessing();
226
+ invalidateScanSession();
227
+ handlingRef.current = false;
228
+ setProduct(null);
229
+ lastResultRef.current = null;
230
+ setPhase('init');
231
+ void runPermissionFlow(true);
232
+ }, [invalidateProcessing, invalidateScanSession, runPermissionFlow]);
119
233
  const onAlbum = useCallback(async () => {
120
- if (!pickImage || handlingRef.current) return;
234
+ if (!pickImage || !acceptingResultsRef.current || handlingRef.current) {
235
+ return;
236
+ }
237
+ acceptingResultsRef.current = false;
238
+ handlingRef.current = true;
239
+ const runId = ++processingRunRef.current;
240
+ const isCurrent = () => mountedRef.current && processingRunRef.current === runId;
241
+ setPhase('detecting');
121
242
  try {
122
243
  const uri = await pickImage();
123
- if (!uri || !mountedRef.current) return;
124
- handlingRef.current = true;
244
+ if (!isCurrent()) return;
245
+ if (!uri) {
246
+ reset();
247
+ return;
248
+ }
125
249
  detectStartRef.current = Date.now();
126
- setPhase('detecting');
127
250
  const results = await decodeImage(uri, formats ? {
128
251
  formats
129
252
  } : undefined);
130
- if (!mountedRef.current) return;
253
+ if (!isCurrent()) return;
131
254
  const first = results[0];
132
255
  if (!first) {
133
256
  setPhase('fail');
134
257
  return;
135
258
  }
136
- await finalize(first);
259
+ await finalize(first, runId);
137
260
  } catch {
138
- if (mountedRef.current) {
139
- handlingRef.current = true;
140
- setPhase('fail');
141
- }
261
+ if (isCurrent()) setPhase('fail');
142
262
  }
143
- }, [pickImage, formats, finalize]);
263
+ }, [pickImage, formats, finalize, reset]);
144
264
  const onConfirmPress = useCallback(() => {
145
265
  const r = lastResultRef.current;
146
266
  const p = product;
@@ -152,18 +272,19 @@ function ScannerInner({
152
272
  const showChrome = phase === 'scan' || phase === 'detecting';
153
273
  return /*#__PURE__*/_jsxs(View, {
154
274
  style: styles.root,
155
- children: [phase !== 'denied' && phase !== 'init' && /*#__PURE__*/_jsx(HmsScanView, {
275
+ children: [phase !== 'denied' && phase !== 'init' && phase !== 'error' && /*#__PURE__*/_jsx(HmsScanView, {
156
276
  style: StyleSheet.absoluteFill,
157
277
  formats: formats,
158
278
  paused: phase !== 'scan',
159
279
  torch: torch,
160
280
  onScanResult: onCameraResult,
161
- onScanError: onScanError
281
+ onScanError: handleViewScanError,
282
+ onTorchStatus: onTorchStatus
162
283
  }), showChrome && /*#__PURE__*/_jsx(Viewfinder, {
163
284
  size: VF_SIZE,
164
285
  detecting: phase === 'detecting',
165
286
  hintText: hintText
166
- }), phase !== 'denied' && phase !== 'init' && /*#__PURE__*/_jsx(ScanTopBar, {
287
+ }), phase !== 'denied' && phase !== 'init' && phase !== 'error' && /*#__PURE__*/_jsx(ScanTopBar, {
167
288
  title: title,
168
289
  topInset: topInset
169
290
  }), showChrome && (showTorch || !!pickImage || !!onClose) && /*#__PURE__*/_jsx(ScanToolbar, {
@@ -181,9 +302,12 @@ function ScannerInner({
181
302
  }), phase === 'fail' && /*#__PURE__*/_jsx(ResultFail, {
182
303
  bottomInset: bottomInset,
183
304
  onRescan: reset
305
+ }), phase === 'error' && /*#__PURE__*/_jsx(ScanErrorOverlay, {
306
+ onClose: onClose,
307
+ onRetry: retryCamera
184
308
  }), phase === 'denied' && /*#__PURE__*/_jsx(DeniedOverlay, {
185
309
  onClose: onClose,
186
- onSettings: () => Linking.openSettings()
310
+ onSettings: openSettings
187
311
  })]
188
312
  });
189
313
  }
@@ -1 +1 @@
1
- {"version":3,"names":["useCallback","useEffect","useRef","useState","Linking","StyleSheet","View","ThemeProvider","ToastHost","HmsScanView","decodeImage","getCameraPermissionStatus","requestCameraPermission","scanChrome","Viewfinder","ScanTopBar","ScanToolbar","ResultFocus","ResultFail","DeniedOverlay","jsx","_jsx","jsxs","_jsxs","VF_SIZE","DEFAULT_HINT","Scanner","props","children","ScannerInner","title","formats","hintText","topInset","bottomInset","showTorch","onClose","resolveProduct","onConfirm","autoConfirm","pickImage","phase","setPhase","torch","setTorch","product","setProduct","detectMs","setDetectMs","handlingRef","detectStartRef","lastResultRef","mountedRef","current","status","reset","finalize","result","resolved","name","value","p","barcode","Date","now","onCameraResult","results","first","onScanError","error","code","onAlbum","uri","undefined","onConfirmPress","r","showChrome","style","styles","root","absoluteFill","paused","onScanResult","size","detecting","flash","onFlash","t","onRescan","onSettings","openSettings","create","flex","backgroundColor","cameraBg"],"sourceRoot":"../../../src","sources":["Scanner/Scanner.tsx"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["useCallback","useEffect","useRef","useState","AppState","Linking","StyleSheet","View","ThemeProvider","HmsScanView","decodeImage","getCameraPermissionStatus","requestCameraPermission","scanChrome","Viewfinder","ScanTopBar","ScanToolbar","ResultFocus","ResultFail","DeniedOverlay","ScanErrorOverlay","jsx","_jsx","jsxs","_jsxs","VF_SIZE","DEFAULT_HINT","toScanError","error","fallbackMessage","native","code","message","Scanner","props","children","ScannerInner","title","formats","hintText","topInset","bottomInset","showTorch","onClose","resolveProduct","onConfirm","autoConfirm","pickImage","onScanError","phase","setPhase","torch","setTorch","product","setProduct","detectMs","setDetectMs","scanSession","setScanSession","handlingRef","acceptingResultsRef","scanSessionRef","detectStartRef","lastResultRef","mountedRef","permissionRunRef","processingRunRef","waitingForSettingsRef","onScanErrorRef","current","invalidateProcessing","invalidateScanSession","enterScan","sessionId","enterDenied","reportFatalError","runPermissionFlow","requestIfNeeded","runId","isCurrent","status","subscription","addEventListener","nextState","remove","reset","finalize","result","resolved","name","value","p","barcode","Date","now","onCameraResult","results","first","handleViewScanError","onTorchStatus","on","openSettings","retryCamera","onAlbum","uri","undefined","onConfirmPress","r","showChrome","style","styles","root","absoluteFill","paused","onScanResult","size","detecting","flash","onFlash","t","onRescan","onRetry","onSettings","create","flex","backgroundColor","cameraBg"],"sourceRoot":"../../../src","sources":["Scanner/Scanner.tsx"],"mappings":"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","ignoreList":[]}
@@ -7,8 +7,9 @@ import { HmsScanError } from "./types.js";
7
7
  /**
8
8
  * 从本地图片解码条码 / 二维码(华为 Bitmap 模式)。
9
9
  *
10
- * @param uri 本地图片:file:// / content:// / ph:// / 绝对路径。**不下载远程 URL**,
11
- * 如需识别网络图请宿主先下载到本地再传入。
10
+ * @param uri 本地图片。iOS 支持 file://、绝对路径、data:;Android 支持
11
+ * file://、绝对路径、content://、android.resource://。
12
+ * 两端都不下载远程 URL,也不支持 ph:// / assets-library://。
12
13
  * @param options 可选;formats 限定码制,不传 = 全部。
13
14
  * @returns 命中的结果数组(可能为空)。
14
15
  * @throws HmsScanError 图片加载失败 / 读权限缺失等。
@@ -1 +1 @@
1
- {"version":3,"names":["NativeHmsScan","formatsToCsv","parseResultsJson","HmsScanError","decodeImage","uri","options","json","formats","e","err","code","message"],"sourceRoot":"../../src","sources":["decodeImage.ts"],"mappings":";;AAAA,OAAOA,aAAa,MAAM,oBAAiB;AAC3C,SAASC,YAAY,EAAEC,gBAAgB,QAAQ,aAAU;AACzD,SAASC,YAAY,QAAkD,YAAS;;AAEhF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,eAAeC,WAAWA,CAC/BC,GAAW,EACXC,OAA4B,EACL;EACvB,IAAI,CAACD,GAAG,EAAE;IACR,MAAM,IAAIF,YAAY,CAAC,qBAAqB,EAAE,uBAAuB,CAAC;EACxE;EACA,IAAI;IACF,MAAMI,IAAI,GAAG,MAAMP,aAAa,CAACI,WAAW,CAACC,GAAG,EAAEJ,YAAY,CAACK,OAAO,EAAEE,OAAO,CAAC,CAAC;IACjF,OAAON,gBAAgB,CAACK,IAAI,CAAC;EAC/B,CAAC,CAAC,OAAOE,CAAC,EAAE;IACV;IACA,MAAMC,GAAG,GAAGD,CAAwC;IACpD,IACEC,GAAG,CAACC,IAAI,KAAK,sBAAsB,IACnCD,GAAG,CAACC,IAAI,KAAK,qBAAqB,IAClCD,GAAG,CAACC,IAAI,KAAK,iBAAiB,EAC9B;MACA,MAAM,IAAIR,YAAY,CAACO,GAAG,CAACC,IAAI,EAAED,GAAG,CAACE,OAAO,CAAC;IAC/C;IACA,MAAM,IAAIT,YAAY,CAAC,WAAW,EAAEO,GAAG,CAACE,OAAO,IAAI,oBAAoB,CAAC;EAC1E;AACF","ignoreList":[]}
1
+ {"version":3,"names":["NativeHmsScan","formatsToCsv","parseResultsJson","HmsScanError","decodeImage","uri","options","json","formats","e","err","code","message"],"sourceRoot":"../../src","sources":["decodeImage.ts"],"mappings":";;AAAA,OAAOA,aAAa,MAAM,oBAAiB;AAC3C,SAASC,YAAY,EAAEC,gBAAgB,QAAQ,aAAU;AACzD,SAASC,YAAY,QAAkD,YAAS;;AAEhF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,eAAeC,WAAWA,CAC/BC,GAAW,EACXC,OAA4B,EACL;EACvB,IAAI,CAACD,GAAG,EAAE;IACR,MAAM,IAAIF,YAAY,CAAC,qBAAqB,EAAE,uBAAuB,CAAC;EACxE;EACA,IAAI;IACF,MAAMI,IAAI,GAAG,MAAMP,aAAa,CAACI,WAAW,CAACC,GAAG,EAAEJ,YAAY,CAACK,OAAO,EAAEE,OAAO,CAAC,CAAC;IACjF,OAAON,gBAAgB,CAACK,IAAI,CAAC;EAC/B,CAAC,CAAC,OAAOE,CAAC,EAAE;IACV;IACA,MAAMC,GAAG,GAAGD,CAAwC;IACpD,IACEC,GAAG,CAACC,IAAI,KAAK,sBAAsB,IACnCD,GAAG,CAACC,IAAI,KAAK,qBAAqB,IAClCD,GAAG,CAACC,IAAI,KAAK,iBAAiB,EAC9B;MACA,MAAM,IAAIR,YAAY,CAACO,GAAG,CAACC,IAAI,EAAED,GAAG,CAACE,OAAO,CAAC;IAC/C;IACA,MAAM,IAAIT,YAAY,CAAC,WAAW,EAAEO,GAAG,CAACE,OAAO,IAAI,oBAAoB,CAAC;EAC1E;AACF","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"names":["ALL_BARCODE_FORMATS","HmsScanError","coerceFormat","coerceContentType","formatsToCsv","HmsScanView","decodeImage","getCameraPermissionStatus","requestCameraPermission","Scanner"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;AAAA;AACA;AACA;;AAEA;AACA,SACEA,mBAAmB,EACnBC,YAAY,QACP,YAAS;AAYhB;AACA,SAASC,YAAY,EAAEC,iBAAiB,EAAEC,YAAY,QAAQ,aAAU;;AAExE;AACA,SAASC,WAAW,QAAQ,kBAAe;AAG3C;AACA,SAASC,WAAW,QAAQ,kBAAe;;AAE3C;AACA,SAASC,yBAAyB,EAAEC,uBAAuB,QAAQ,kBAAe;;AAElF;AACA,SAASC,OAAO,QAAQ,sBAAmB","ignoreList":[]}
1
+ {"version":3,"names":["ALL_BARCODE_FORMATS","HmsScanError","coerceFormat","coerceContentType","formatsToCsv","HmsScanView","decodeImage","getCameraPermissionStatus","requestCameraPermission","Scanner"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;AAAA;AACA;AACA;;AAEA;AACA,SACEA,mBAAmB,EACnBC,YAAY,QACP,YAAS;AAahB;AACA,SAASC,YAAY,EAAEC,iBAAiB,EAAEC,YAAY,QAAQ,aAAU;;AAExE;AACA,SAASC,WAAW,QAAQ,kBAAe;AAG3C;AACA,SAASC,WAAW,QAAQ,kBAAe;;AAE3C;AACA,SAASC,yBAAyB,EAAEC,uBAAuB,QAAQ,kBAAe;;AAElF;AACA,SAASC,OAAO,QAAQ,sBAAmB","ignoreList":[]}
@@ -24,6 +24,8 @@ export const ALL_BARCODE_FORMATS = ['QR_CODE', 'AZTEC', 'DATA_MATRIX', 'PDF417',
24
24
 
25
25
  /** decodeImage 选项。 */
26
26
 
27
+ /** `<HmsScanView>` / `<Scanner>` 通过回调上报的普通错误对象。 */
28
+
27
29
  /** 相机权限状态。 */
28
30
 
29
31
  /** 错误码。 */
@@ -1 +1 @@
1
- {"version":3,"names":["ALL_BARCODE_FORMATS","HmsScanError","Error","constructor","code","message","name","Object","setPrototypeOf","prototype"],"sourceRoot":"../../src","sources":["types.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAkBA;AACA,OAAO,MAAMA,mBAA6C,GAAG,CAC3D,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,CACV;;AAEV;AACA;AACA;AACA;;AAgBA;;AAMA;;AAYA;;AAMA;;AAOA;;AAUA;AACA,OAAO,MAAMC,YAAY,SAASC,KAAK,CAAC;EAEtCC,WAAWA,CAACC,IAAsB,EAAEC,OAAgB,EAAE;IACpD,KAAK,CAACA,OAAO,IAAID,IAAI,CAAC;IACtB,IAAI,CAACE,IAAI,GAAG,cAAc;IAC1B,IAAI,CAACF,IAAI,GAAGA,IAAI;IAChB;IACAG,MAAM,CAACC,cAAc,CAAC,IAAI,EAAEP,YAAY,CAACQ,SAAS,CAAC;EACrD;AACF;;AAEA;AACA;AACA;AACA","ignoreList":[]}
1
+ {"version":3,"names":["ALL_BARCODE_FORMATS","HmsScanError","Error","constructor","code","message","name","Object","setPrototypeOf","prototype"],"sourceRoot":"../../src","sources":["types.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAkBA;AACA,OAAO,MAAMA,mBAA6C,GAAG,CAC3D,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,CACV;;AAEV;AACA;AACA;AACA;;AAgBA;;AAMA;;AAYA;;AAMA;;AAMA;;AAOA;;AAUA;AACA,OAAO,MAAMC,YAAY,SAASC,KAAK,CAAC;EAEtCC,WAAWA,CAACC,IAAsB,EAAEC,OAAgB,EAAE;IACpD,KAAK,CAACA,OAAO,IAAID,IAAI,CAAC;IACtB,IAAI,CAACE,IAAI,GAAG,cAAc;IAC1B,IAAI,CAACF,IAAI,GAAGA,IAAI;IAChB;IACAG,MAAM,CAACC,cAAc,CAAC,IAAI,EAAEP,YAAY,CAACQ,SAAS,CAAC;EACrD;AACF;;AAEA;AACA;AACA;AACA","ignoreList":[]}
@@ -1,5 +1,5 @@
1
1
  import type { ViewProps } from 'react-native';
2
- import type { BarcodeFormat, ScanResult } from './types';
2
+ import type { BarcodeFormat, ScanError, ScanResult } from './types';
3
3
  /** 平台相关的暗光提示 / 手电状态。 */
4
4
  export interface TorchStatus {
5
5
  /** Android:环境暗光提示;iOS:设备是否有手电硬件。 */
@@ -9,7 +9,7 @@ export interface TorchStatus {
9
9
  }
10
10
  export interface HmsScanViewProps extends ViewProps {
11
11
  /** 限定码制;不传 = 全部。 */
12
- formats?: BarcodeFormat[];
12
+ formats?: readonly BarcodeFormat[];
13
13
  /** 连续扫码,默认 true。 */
14
14
  continuous?: boolean;
15
15
  /** 暂停/恢复扫码,默认 false。 */
@@ -19,10 +19,7 @@ export interface HmsScanViewProps extends ViewProps {
19
19
  /** 命中一个或多个码时回调(已解析为强类型)。 */
20
20
  onScanResult?: (results: ScanResult[]) => void;
21
21
  /** 相机/解码出错时回调。 */
22
- onScanError?: (error: {
23
- code: string;
24
- message: string;
25
- }) => void;
22
+ onScanError?: (error: ScanError) => void;
26
23
  /** Android 暗光提示或 iOS 手电硬件 / 点亮状态变化时回调。 */
27
24
  onTorchStatus?: (status: TorchStatus) => void;
28
25
  }
@@ -1 +1 @@
1
- {"version":3,"file":"HmsScanView.d.ts","sourceRoot":"","sources":["../../../src/HmsScanView.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAG9C,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAEzD,wBAAwB;AACxB,MAAM,WAAW,WAAW;IAC1B,oCAAoC;IACpC,SAAS,EAAE,OAAO,CAAC;IACnB,gBAAgB;IAChB,EAAE,EAAE,OAAO,CAAC;CACb;AAED,MAAM,WAAW,gBAAiB,SAAQ,SAAS;IACjD,oBAAoB;IACpB,OAAO,CAAC,EAAE,aAAa,EAAE,CAAC;IAC1B,oBAAoB;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,wBAAwB;IACxB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,+BAA+B;IAC/B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,4BAA4B;IAC5B,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,UAAU,EAAE,KAAK,IAAI,CAAC;IAC/C,kBAAkB;IAClB,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IACjE,0CAA0C;IAC1C,aAAa,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,IAAI,CAAC;CAC/C;AAED;;;;;GAKG;AACH,eAAO,MAAM,WAAW,iOAiDtB,CAAC"}
1
+ {"version":3,"file":"HmsScanView.d.ts","sourceRoot":"","sources":["../../../src/HmsScanView.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAG9C,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAEpE,wBAAwB;AACxB,MAAM,WAAW,WAAW;IAC1B,oCAAoC;IACpC,SAAS,EAAE,OAAO,CAAC;IACnB,gBAAgB;IAChB,EAAE,EAAE,OAAO,CAAC;CACb;AAED,MAAM,WAAW,gBAAiB,SAAQ,SAAS;IACjD,oBAAoB;IACpB,OAAO,CAAC,EAAE,SAAS,aAAa,EAAE,CAAC;IACnC,oBAAoB;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,wBAAwB;IACxB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,+BAA+B;IAC/B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,4BAA4B;IAC5B,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,UAAU,EAAE,KAAK,IAAI,CAAC;IAC/C,kBAAkB;IAClB,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,CAAC;IACzC,0CAA0C;IAC1C,aAAa,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,IAAI,CAAC;CAC/C;AAED;;;;;GAKG;AACH,eAAO,MAAM,WAAW,iOAiDtB,CAAC"}
@@ -2,7 +2,9 @@ import type { TurboModule } from 'react-native';
2
2
  export interface Spec extends TurboModule {
3
3
  /**
4
4
  * 解码本地图片里的条码 / 二维码。
5
- * @param uri 本地图片:file:// / content:// / ph:// / 绝对路径(不下载远程 URL)。
5
+ * @param uri 本地图片。iOS 支持 file://、绝对路径、data:;Android 支持
6
+ * file://、绝对路径、content://、android.resource://。
7
+ * 两端都不下载远程 URL,也不支持 ph:// / assets-library://。
6
8
  * @param formatsCsv 限定码制(逗号分隔的 BarcodeFormat),空串 = 全部。
7
9
  * @returns JSON 编码的 ScanResult[](可能为空数组)。
8
10
  */