@unif/react-native-hms-scan 0.6.2 → 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.
Files changed (156) hide show
  1. package/README.md +3 -2
  2. package/android/src/main/AndroidManifest.xml +0 -9
  3. package/android/src/main/java/com/unif/reactnativehmsscan/HmsScanImage.kt +135 -0
  4. package/android/src/main/java/com/unif/reactnativehmsscan/HmsScanModule.kt +163 -147
  5. package/android/src/main/java/com/unif/reactnativehmsscan/HmsScanResultMapper.kt +17 -9
  6. package/android/src/main/java/com/unif/reactnativehmsscan/HmsScanView.kt +57 -19
  7. package/android/src/main/java/com/unif/reactnativehmsscan/HmsScanViewManager.kt +1 -1
  8. package/ios/HmsScanModule.mm +13 -37
  9. package/ios/HmsScanResultMapper.h +4 -3
  10. package/ios/HmsScanResultMapper.mm +31 -19
  11. package/ios/HmsScanView.h +1 -1
  12. package/ios/HmsScanView.mm +140 -25
  13. package/lib/module/HmsScanView/HmsScanView.js +66 -0
  14. package/lib/module/HmsScanView/HmsScanView.js.map +1 -0
  15. package/lib/module/HmsScanView/HmsScanView.web.js +26 -0
  16. package/lib/module/HmsScanView/HmsScanView.web.js.map +1 -0
  17. package/lib/module/HmsScanView/types.js +4 -0
  18. package/lib/module/HmsScanView/types.js.map +1 -0
  19. package/lib/module/HmsScanViewNativeComponent.ts +7 -5
  20. package/lib/module/NativeHmsScan.js +1 -1
  21. package/lib/module/NativeHmsScan.js.map +1 -1
  22. package/lib/module/ScanError.js +12 -0
  23. package/lib/module/ScanError.js.map +1 -0
  24. package/lib/module/Scanner/DeniedOverlay.js +1 -1
  25. package/lib/module/Scanner/DeniedOverlay.js.map +1 -1
  26. package/lib/module/Scanner/ResultFail.js +3 -2
  27. package/lib/module/Scanner/ResultFail.js.map +1 -1
  28. package/lib/module/Scanner/ResultFocus/ResultFocus.js +56 -0
  29. package/lib/module/Scanner/ResultFocus/ResultFocus.js.map +1 -0
  30. package/lib/module/Scanner/ResultFocus/styles.js +39 -0
  31. package/lib/module/Scanner/ResultFocus/styles.js.map +1 -0
  32. package/lib/module/Scanner/ResultFocus/types.js +4 -0
  33. package/lib/module/Scanner/ResultFocus/types.js.map +1 -0
  34. package/lib/module/Scanner/Scanner.js +11 -310
  35. package/lib/module/Scanner/Scanner.js.map +1 -1
  36. package/lib/module/Scanner/Scanner.web.js +29 -0
  37. package/lib/module/Scanner/Scanner.web.js.map +1 -0
  38. package/lib/module/Scanner/ScannerInner.js +310 -0
  39. package/lib/module/Scanner/ScannerInner.js.map +1 -0
  40. package/lib/module/Scanner/styles.js +11 -0
  41. package/lib/module/Scanner/styles.js.map +1 -0
  42. package/lib/module/Scanner/types.js +4 -0
  43. package/lib/module/Scanner/types.js.map +1 -0
  44. package/lib/module/constants.js +20 -0
  45. package/lib/module/constants.js.map +1 -0
  46. package/lib/module/decodeImage.js +29 -24
  47. package/lib/module/decodeImage.js.map +1 -1
  48. package/lib/module/decodeImage.web.js +7 -0
  49. package/lib/module/decodeImage.web.js.map +1 -0
  50. package/lib/module/errors.js +24 -0
  51. package/lib/module/errors.js.map +1 -0
  52. package/lib/module/format.js +53 -47
  53. package/lib/module/format.js.map +1 -1
  54. package/lib/module/index.js +5 -19
  55. package/lib/module/index.js.map +1 -1
  56. package/lib/module/index.web.js +8 -0
  57. package/lib/module/index.web.js.map +1 -0
  58. package/lib/module/mock.js +2 -23
  59. package/lib/module/mock.js.map +1 -1
  60. package/lib/module/permissions.js +24 -20
  61. package/lib/module/permissions.js.map +1 -1
  62. package/lib/module/permissions.web.js +10 -0
  63. package/lib/module/permissions.web.js.map +1 -0
  64. package/lib/module/types.js +1 -45
  65. package/lib/module/types.js.map +1 -1
  66. package/lib/typescript/src/HmsScanView/HmsScanView.d.ts +3 -0
  67. package/lib/typescript/src/HmsScanView/HmsScanView.d.ts.map +1 -0
  68. package/lib/typescript/src/HmsScanView/HmsScanView.web.d.ts +3 -0
  69. package/lib/typescript/src/HmsScanView/HmsScanView.web.d.ts.map +1 -0
  70. package/lib/typescript/src/HmsScanView/types.d.ts +12 -0
  71. package/lib/typescript/src/HmsScanView/types.d.ts.map +1 -0
  72. package/lib/typescript/src/HmsScanViewNativeComponent.d.ts +6 -4
  73. package/lib/typescript/src/HmsScanViewNativeComponent.d.ts.map +1 -1
  74. package/lib/typescript/src/NativeHmsScan.d.ts +3 -5
  75. package/lib/typescript/src/NativeHmsScan.d.ts.map +1 -1
  76. package/lib/typescript/src/ScanError.d.ts +7 -0
  77. package/lib/typescript/src/ScanError.d.ts.map +1 -0
  78. package/lib/typescript/src/Scanner/DeniedOverlay.d.ts.map +1 -1
  79. package/lib/typescript/src/Scanner/ResultFail.d.ts +2 -1
  80. package/lib/typescript/src/Scanner/ResultFail.d.ts.map +1 -1
  81. package/lib/typescript/src/Scanner/ResultFocus/ResultFocus.d.ts +4 -0
  82. package/lib/typescript/src/Scanner/ResultFocus/ResultFocus.d.ts.map +1 -0
  83. package/lib/typescript/src/Scanner/ResultFocus/styles.d.ts +36 -0
  84. package/lib/typescript/src/Scanner/ResultFocus/styles.d.ts.map +1 -0
  85. package/lib/typescript/src/Scanner/ResultFocus/types.d.ts +8 -0
  86. package/lib/typescript/src/Scanner/ResultFocus/types.d.ts.map +1 -0
  87. package/lib/typescript/src/Scanner/Scanner.d.ts +2 -45
  88. package/lib/typescript/src/Scanner/Scanner.d.ts.map +1 -1
  89. package/lib/typescript/src/Scanner/Scanner.web.d.ts +3 -0
  90. package/lib/typescript/src/Scanner/Scanner.web.d.ts.map +1 -0
  91. package/lib/typescript/src/Scanner/ScannerInner.d.ts +3 -0
  92. package/lib/typescript/src/Scanner/ScannerInner.d.ts.map +1 -0
  93. package/lib/typescript/src/Scanner/styles.d.ts +7 -0
  94. package/lib/typescript/src/Scanner/styles.d.ts.map +1 -0
  95. package/lib/typescript/src/Scanner/types.d.ts +20 -0
  96. package/lib/typescript/src/Scanner/types.d.ts.map +1 -0
  97. package/lib/typescript/src/constants.d.ts +8 -0
  98. package/lib/typescript/src/constants.d.ts.map +1 -0
  99. package/lib/typescript/src/decodeImage.d.ts +2 -12
  100. package/lib/typescript/src/decodeImage.d.ts.map +1 -1
  101. package/lib/typescript/src/decodeImage.web.d.ts +3 -0
  102. package/lib/typescript/src/decodeImage.web.d.ts.map +1 -0
  103. package/lib/typescript/src/errors.d.ts +6 -0
  104. package/lib/typescript/src/errors.d.ts.map +1 -0
  105. package/lib/typescript/src/format.d.ts +15 -12
  106. package/lib/typescript/src/format.d.ts.map +1 -1
  107. package/lib/typescript/src/index.d.ts +6 -7
  108. package/lib/typescript/src/index.d.ts.map +1 -1
  109. package/lib/typescript/src/index.web.d.ts +9 -0
  110. package/lib/typescript/src/index.web.d.ts.map +1 -0
  111. package/lib/typescript/src/mock.d.ts +9 -8
  112. package/lib/typescript/src/mock.d.ts.map +1 -1
  113. package/lib/typescript/src/permissions.d.ts +4 -8
  114. package/lib/typescript/src/permissions.d.ts.map +1 -1
  115. package/lib/typescript/src/permissions.web.d.ts +4 -0
  116. package/lib/typescript/src/permissions.web.d.ts.map +1 -0
  117. package/lib/typescript/src/types.d.ts +31 -56
  118. package/lib/typescript/src/types.d.ts.map +1 -1
  119. package/package.json +8 -1
  120. package/src/HmsScanView/HmsScanView.tsx +67 -0
  121. package/src/HmsScanView/HmsScanView.web.tsx +22 -0
  122. package/src/HmsScanView/types.ts +17 -0
  123. package/src/HmsScanViewNativeComponent.ts +7 -5
  124. package/src/NativeHmsScan.ts +3 -5
  125. package/src/ScanError.ts +13 -0
  126. package/src/Scanner/DeniedOverlay.tsx +4 -2
  127. package/src/Scanner/ResultFail.tsx +23 -5
  128. package/src/Scanner/ResultFocus/ResultFocus.tsx +43 -0
  129. package/src/Scanner/ResultFocus/styles.ts +25 -0
  130. package/src/Scanner/ResultFocus/types.ts +8 -0
  131. package/src/Scanner/Scanner.tsx +14 -432
  132. package/src/Scanner/Scanner.web.tsx +26 -0
  133. package/src/Scanner/ScannerInner.tsx +391 -0
  134. package/src/Scanner/styles.ts +6 -0
  135. package/src/Scanner/types.ts +36 -0
  136. package/src/constants.ts +55 -0
  137. package/src/decodeImage.ts +35 -29
  138. package/src/decodeImage.web.ts +8 -0
  139. package/src/errors.ts +26 -0
  140. package/src/format.ts +77 -76
  141. package/src/index.tsx +17 -32
  142. package/src/index.web.tsx +22 -0
  143. package/src/mock.ts +21 -29
  144. package/src/permissions.ts +33 -20
  145. package/src/permissions.web.ts +9 -0
  146. package/src/types.ts +38 -126
  147. package/lib/module/HmsScanView.js +0 -43
  148. package/lib/module/HmsScanView.js.map +0 -1
  149. package/lib/module/Scanner/ResultFocus.js +0 -171
  150. package/lib/module/Scanner/ResultFocus.js.map +0 -1
  151. package/lib/typescript/src/HmsScanView.d.ts +0 -33
  152. package/lib/typescript/src/HmsScanView.d.ts.map +0 -1
  153. package/lib/typescript/src/Scanner/ResultFocus.d.ts +0 -14
  154. package/lib/typescript/src/Scanner/ResultFocus.d.ts.map +0 -1
  155. package/src/HmsScanView.tsx +0 -87
  156. package/src/Scanner/ResultFocus.tsx +0 -122
@@ -1,171 +0,0 @@
1
- "use strict";
2
-
3
- import { useEffect, useRef } from 'react';
4
- import { Animated, StyleSheet, Text, View } from 'react-native';
5
- import { Avatar, Button, Card, StatusDot, useColors, useThemedStyles, r, rf, fw, fontMono } from '@unif/react-native-design';
6
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
7
- // 聚焦款"浮层确认卡":design Card + 2px 主色描边,悬浮在相机之上(无遮罩)。
8
- export function ResultFocus({
9
- product,
10
- detectMs,
11
- bottomInset,
12
- onRescan,
13
- onConfirm
14
- }) {
15
- const c = useColors();
16
- const s = useThemedStyles(makeStyles);
17
- const anim = useRef(new Animated.Value(0)).current;
18
- useEffect(() => {
19
- Animated.timing(anim, {
20
- toValue: 1,
21
- duration: 280,
22
- useNativeDriver: true
23
- }).start();
24
- }, [anim]);
25
- const brandChar = product.brandChar ?? (product.brand ?? product.name).charAt(0);
26
- const badge = detectMs > 0 ? `已识别 · ${(detectMs / 1000).toFixed(1)}s` : '已识别';
27
- const caption = product.priceCaption ?? '建议零售';
28
- return /*#__PURE__*/_jsx(Animated.View, {
29
- style: [styles.wrap, {
30
- bottom: bottomInset + r(18)
31
- }, {
32
- opacity: anim,
33
- transform: [{
34
- translateY: anim.interpolate({
35
- inputRange: [0, 1],
36
- outputRange: [r(24), 0]
37
- })
38
- }]
39
- }],
40
- children: /*#__PURE__*/_jsxs(Card, {
41
- borderColor: c.primary,
42
- borderWidth: 2,
43
- borderRadius: r(16),
44
- padding: r(14),
45
- children: [/*#__PURE__*/_jsxs(View, {
46
- style: styles.header,
47
- children: [/*#__PURE__*/_jsx(StatusDot, {
48
- status: "done",
49
- size: r(20)
50
- }), /*#__PURE__*/_jsx(Text, {
51
- style: s.badge,
52
- children: badge
53
- }), /*#__PURE__*/_jsx(View, {
54
- style: styles.spacer
55
- }), !!product.barcode && /*#__PURE__*/_jsx(Text, {
56
- style: s.barcode,
57
- children: product.barcode
58
- })]
59
- }), /*#__PURE__*/_jsxs(View, {
60
- style: styles.body,
61
- children: [/*#__PURE__*/_jsx(Avatar, {
62
- label: brandChar,
63
- variant: "brand",
64
- size: "xl"
65
- }), /*#__PURE__*/_jsxs(View, {
66
- style: styles.info,
67
- children: [/*#__PURE__*/_jsxs(Text, {
68
- style: s.name,
69
- numberOfLines: 2,
70
- children: [product.brand ? `${product.brand} ` : '', product.name]
71
- }), !!(product.spec || product.stockShort) && /*#__PURE__*/_jsx(Text, {
72
- style: s.sub,
73
- numberOfLines: 1,
74
- children: [product.spec, product.stockShort ? `库存${product.stockShort}` : null].filter(Boolean).join(' · ')
75
- })]
76
- }), !!product.price && /*#__PURE__*/_jsxs(View, {
77
- style: styles.priceCol,
78
- children: [/*#__PURE__*/_jsx(Text, {
79
- style: s.price,
80
- children: product.price
81
- }), /*#__PURE__*/_jsx(Text, {
82
- style: s.caption,
83
- children: caption
84
- })]
85
- })]
86
- }), /*#__PURE__*/_jsxs(View, {
87
- style: styles.actions,
88
- children: [/*#__PURE__*/_jsx(Button, {
89
- label: "\u91CD\u626B",
90
- variant: "secondary",
91
- block: true,
92
- onPress: onRescan
93
- }), /*#__PURE__*/_jsx(Button, {
94
- label: "\u786E\u5B9A",
95
- variant: "primary",
96
- block: true,
97
- onPress: onConfirm
98
- })]
99
- })]
100
- })
101
- });
102
- }
103
- const styles = StyleSheet.create({
104
- wrap: {
105
- position: 'absolute',
106
- left: r(16),
107
- right: r(16),
108
- zIndex: 50
109
- },
110
- header: {
111
- flexDirection: 'row',
112
- alignItems: 'center',
113
- columnGap: r(7),
114
- marginBottom: r(12)
115
- },
116
- spacer: {
117
- flex: 1
118
- },
119
- body: {
120
- flexDirection: 'row',
121
- alignItems: 'center',
122
- columnGap: r(14),
123
- marginBottom: r(14)
124
- },
125
- info: {
126
- flex: 1,
127
- minWidth: 0
128
- },
129
- priceCol: {
130
- alignItems: 'flex-end'
131
- },
132
- actions: {
133
- flexDirection: 'row',
134
- columnGap: r(10)
135
- }
136
- });
137
- const makeStyles = c => StyleSheet.create({
138
- badge: {
139
- fontSize: rf(13),
140
- fontWeight: fw.semi,
141
- color: c.foreground
142
- },
143
- barcode: {
144
- fontSize: rf(12),
145
- color: c.foregroundMuted,
146
- fontFamily: fontMono
147
- },
148
- name: {
149
- fontSize: rf(16),
150
- fontWeight: fw.semi,
151
- color: c.foreground,
152
- lineHeight: rf(21)
153
- },
154
- sub: {
155
- fontSize: rf(12.5),
156
- color: c.foregroundMuted,
157
- marginTop: r(4)
158
- },
159
- price: {
160
- fontSize: rf(24),
161
- fontWeight: fw.heavy,
162
- color: c.primary,
163
- lineHeight: rf(24)
164
- },
165
- caption: {
166
- fontSize: rf(11),
167
- color: c.foregroundMuted,
168
- marginTop: r(3)
169
- }
170
- });
171
- //# sourceMappingURL=ResultFocus.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["useEffect","useRef","Animated","StyleSheet","Text","View","Avatar","Button","Card","StatusDot","useColors","useThemedStyles","r","rf","fw","fontMono","jsx","_jsx","jsxs","_jsxs","ResultFocus","product","detectMs","bottomInset","onRescan","onConfirm","c","s","makeStyles","anim","Value","current","timing","toValue","duration","useNativeDriver","start","brandChar","brand","name","charAt","badge","toFixed","caption","priceCaption","style","styles","wrap","bottom","opacity","transform","translateY","interpolate","inputRange","outputRange","children","borderColor","primary","borderWidth","borderRadius","padding","header","status","size","spacer","barcode","body","label","variant","info","numberOfLines","spec","stockShort","sub","filter","Boolean","join","price","priceCol","actions","block","onPress","create","position","left","right","zIndex","flexDirection","alignItems","columnGap","marginBottom","flex","minWidth","fontSize","fontWeight","semi","color","foreground","foregroundMuted","fontFamily","lineHeight","marginTop","heavy"],"sourceRoot":"../../../src","sources":["Scanner/ResultFocus.tsx"],"mappings":"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","ignoreList":[]}
@@ -1,33 +0,0 @@
1
- import type { ViewProps } from 'react-native';
2
- import type { BarcodeFormat, ScanError, ScanResult } from './types';
3
- /** 平台相关的暗光提示 / 手电状态。 */
4
- export interface TorchStatus {
5
- /** Android:环境暗光提示;iOS:设备是否有手电硬件。 */
6
- available: boolean;
7
- /** 手电当前是否点亮。 */
8
- on: boolean;
9
- }
10
- export interface HmsScanViewProps extends ViewProps {
11
- /** 限定码制;不传 = 全部。 */
12
- formats?: readonly BarcodeFormat[];
13
- /** 连续扫码,默认 true。 */
14
- continuous?: boolean;
15
- /** 暂停/恢复扫码,默认 false。 */
16
- paused?: boolean;
17
- /** 手电筒,默认 false(iOS 为尽力而为)。 */
18
- torch?: boolean;
19
- /** 命中一个或多个码时回调(已解析为强类型)。 */
20
- onScanResult?: (results: ScanResult[]) => void;
21
- /** 相机/解码出错时回调。 */
22
- onScanError?: (error: ScanError) => void;
23
- /** Android 暗光提示或 iOS 手电硬件 / 点亮状态变化时回调。 */
24
- onTorchStatus?: (status: TorchStatus) => void;
25
- }
26
- /**
27
- * 底层 headless 扫码相机组件:只渲染相机预览并发出扫码结果事件。
28
- * 取景框 / 扫描线 / 手电按钮等 UI 由上层(如 `<Scanner>`)用普通 RN 视图叠加绘制。
29
- *
30
- * Android = 华为 RemoteView,iOS = HmsCustomScanViewController(Scan SDK-Plus / ScanKitFrameWork)。
31
- */
32
- export declare const HmsScanView: import("react").ForwardRefExoticComponent<HmsScanViewProps & import("react").RefAttributes<import("react").Component<import("./HmsScanViewNativeComponent").NativeProps, {}, any> & import("react-native").ReactNativeElement>>;
33
- //# sourceMappingURL=HmsScanView.d.ts.map
@@ -1 +0,0 @@
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"}
@@ -1,14 +0,0 @@
1
- import type { ScanProduct } from '../types';
2
- interface ResultFocusProps {
3
- product: ScanProduct;
4
- /** 识别耗时(ms),用于 "已识别 · 0.6s"。<=0 则只显示 "已识别"。 */
5
- detectMs: number;
6
- bottomInset: number;
7
- /** 重扫:放弃本次结果,回到取景重新扫描。(退出扫码页是外层工具栏「返回」的事。) */
8
- onRescan: () => void;
9
- /** 确定:确认本次结果并带回上一级。 */
10
- onConfirm: () => void;
11
- }
12
- export declare function ResultFocus({ product, detectMs, bottomInset, onRescan, onConfirm, }: ResultFocusProps): import("react/jsx-runtime").JSX.Element;
13
- export {};
14
- //# sourceMappingURL=ResultFocus.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ResultFocus.d.ts","sourceRoot":"","sources":["../../../../src/Scanner/ResultFocus.tsx"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAE5C,UAAU,gBAAgB;IACxB,OAAO,EAAE,WAAW,CAAC;IACrB,+CAA+C;IAC/C,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,8CAA8C;IAC9C,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,uBAAuB;IACvB,SAAS,EAAE,MAAM,IAAI,CAAC;CACvB;AAGD,wBAAgB,WAAW,CAAC,EAC1B,OAAO,EACP,QAAQ,EACR,WAAW,EACX,QAAQ,EACR,SAAS,GACV,EAAE,gBAAgB,2CAmElB"}
@@ -1,87 +0,0 @@
1
- import { forwardRef, type ComponentRef } from 'react';
2
- import type { ViewProps } from 'react-native';
3
- import NativeHmsScanView from './HmsScanViewNativeComponent';
4
- import { formatsToCsv, parseResultsJson } from './format';
5
- import type { BarcodeFormat, ScanError, ScanResult } from './types';
6
-
7
- /** 平台相关的暗光提示 / 手电状态。 */
8
- export interface TorchStatus {
9
- /** Android:环境暗光提示;iOS:设备是否有手电硬件。 */
10
- available: boolean;
11
- /** 手电当前是否点亮。 */
12
- on: boolean;
13
- }
14
-
15
- export interface HmsScanViewProps extends ViewProps {
16
- /** 限定码制;不传 = 全部。 */
17
- formats?: readonly BarcodeFormat[];
18
- /** 连续扫码,默认 true。 */
19
- continuous?: boolean;
20
- /** 暂停/恢复扫码,默认 false。 */
21
- paused?: boolean;
22
- /** 手电筒,默认 false(iOS 为尽力而为)。 */
23
- torch?: boolean;
24
- /** 命中一个或多个码时回调(已解析为强类型)。 */
25
- onScanResult?: (results: ScanResult[]) => void;
26
- /** 相机/解码出错时回调。 */
27
- onScanError?: (error: ScanError) => void;
28
- /** Android 暗光提示或 iOS 手电硬件 / 点亮状态变化时回调。 */
29
- onTorchStatus?: (status: TorchStatus) => void;
30
- }
31
-
32
- /**
33
- * 底层 headless 扫码相机组件:只渲染相机预览并发出扫码结果事件。
34
- * 取景框 / 扫描线 / 手电按钮等 UI 由上层(如 `<Scanner>`)用普通 RN 视图叠加绘制。
35
- *
36
- * Android = 华为 RemoteView,iOS = HmsCustomScanViewController(Scan SDK-Plus / ScanKitFrameWork)。
37
- */
38
- export const HmsScanView = forwardRef<
39
- ComponentRef<typeof NativeHmsScanView>,
40
- HmsScanViewProps
41
- >(function HmsScanView(
42
- {
43
- formats,
44
- continuous = true,
45
- paused = false,
46
- torch = false,
47
- onScanResult,
48
- onScanError,
49
- onTorchStatus,
50
- ...viewProps
51
- },
52
- ref
53
- ) {
54
- return (
55
- <NativeHmsScanView
56
- {...viewProps}
57
- ref={ref}
58
- formatsCsv={formatsToCsv(formats)}
59
- continuous={continuous}
60
- paused={paused}
61
- torch={torch}
62
- onScanResult={
63
- onScanResult
64
- ? (e) => onScanResult(parseResultsJson(e.nativeEvent.resultsJson))
65
- : undefined
66
- }
67
- onScanError={
68
- onScanError
69
- ? (e) =>
70
- onScanError({
71
- code: e.nativeEvent.code,
72
- message: e.nativeEvent.message,
73
- })
74
- : undefined
75
- }
76
- onTorchStatus={
77
- onTorchStatus
78
- ? (e) =>
79
- onTorchStatus({
80
- available: e.nativeEvent.available,
81
- on: e.nativeEvent.on,
82
- })
83
- : undefined
84
- }
85
- />
86
- );
87
- });
@@ -1,122 +0,0 @@
1
- import { useEffect, useRef } from 'react';
2
- import { Animated, StyleSheet, Text, View } from 'react-native';
3
- import {
4
- Avatar,
5
- Button,
6
- Card,
7
- StatusDot,
8
- useColors,
9
- useThemedStyles,
10
- r,
11
- rf,
12
- fw,
13
- fontMono,
14
- } from '@unif/react-native-design';
15
- import type { ScanProduct } from '../types';
16
-
17
- interface ResultFocusProps {
18
- product: ScanProduct;
19
- /** 识别耗时(ms),用于 "已识别 · 0.6s"。<=0 则只显示 "已识别"。 */
20
- detectMs: number;
21
- bottomInset: number;
22
- /** 重扫:放弃本次结果,回到取景重新扫描。(退出扫码页是外层工具栏「返回」的事。) */
23
- onRescan: () => void;
24
- /** 确定:确认本次结果并带回上一级。 */
25
- onConfirm: () => void;
26
- }
27
-
28
- // 聚焦款"浮层确认卡":design Card + 2px 主色描边,悬浮在相机之上(无遮罩)。
29
- export function ResultFocus({
30
- product,
31
- detectMs,
32
- bottomInset,
33
- onRescan,
34
- onConfirm,
35
- }: ResultFocusProps) {
36
- const c = useColors();
37
- const s = useThemedStyles(makeStyles);
38
- const anim = useRef(new Animated.Value(0)).current;
39
- useEffect(() => {
40
- Animated.timing(anim, { toValue: 1, duration: 280, useNativeDriver: true }).start();
41
- }, [anim]);
42
-
43
- const brandChar = product.brandChar ?? (product.brand ?? product.name).charAt(0);
44
- const badge = detectMs > 0 ? `已识别 · ${(detectMs / 1000).toFixed(1)}s` : '已识别';
45
- const caption = product.priceCaption ?? '建议零售';
46
-
47
- return (
48
- <Animated.View
49
- style={[
50
- styles.wrap,
51
- { bottom: bottomInset + r(18) },
52
- {
53
- opacity: anim,
54
- transform: [{ translateY: anim.interpolate({ inputRange: [0, 1], outputRange: [r(24), 0] }) }],
55
- },
56
- ]}
57
- >
58
- <Card borderColor={c.primary} borderWidth={2} borderRadius={r(16)} padding={r(14)}>
59
- {/* 头部:成功点 · 已识别 · 条码 */}
60
- <View style={styles.header}>
61
- <StatusDot status="done" size={r(20)} />
62
- <Text style={s.badge}>{badge}</Text>
63
- <View style={styles.spacer} />
64
- {!!product.barcode && <Text style={s.barcode}>{product.barcode}</Text>}
65
- </View>
66
-
67
- {/* 商品行 */}
68
- <View style={styles.body}>
69
- <Avatar label={brandChar} variant="brand" size="xl" />
70
- <View style={styles.info}>
71
- <Text style={s.name} numberOfLines={2}>
72
- {product.brand ? `${product.brand} ` : ''}
73
- {product.name}
74
- </Text>
75
- {!!(product.spec || product.stockShort) && (
76
- <Text style={s.sub} numberOfLines={1}>
77
- {[product.spec, product.stockShort ? `库存${product.stockShort}` : null]
78
- .filter(Boolean)
79
- .join(' · ')}
80
- </Text>
81
- )}
82
- </View>
83
- {!!product.price && (
84
- <View style={styles.priceCol}>
85
- <Text style={s.price}>{product.price}</Text>
86
- <Text style={s.caption}>{caption}</Text>
87
- </View>
88
- )}
89
- </View>
90
-
91
- {/* 操作:重扫(回取景)· 确定(确认带回)。
92
- block(flexGrow:1)而非 style={{flex:1}}:ButtonBase 非 block 时硬编码 flexGrow:0,
93
- Yoga 里显式 flexGrow:0 压过 flex:1 → flex:1 撑不开按钮、且把 flexBasis 收成 0,
94
- 按钮塌成 padding 宽把 label 裁没。两个 block 按钮在 row 里均分(同 design ConfirmHost)。 */}
95
- <View style={styles.actions}>
96
- <Button label="重扫" variant="secondary" block onPress={onRescan} />
97
- <Button label="确定" variant="primary" block onPress={onConfirm} />
98
- </View>
99
- </Card>
100
- </Animated.View>
101
- );
102
- }
103
-
104
- const styles = StyleSheet.create({
105
- wrap: { position: 'absolute', left: r(16), right: r(16), zIndex: 50 },
106
- header: { flexDirection: 'row', alignItems: 'center', columnGap: r(7), marginBottom: r(12) },
107
- spacer: { flex: 1 },
108
- body: { flexDirection: 'row', alignItems: 'center', columnGap: r(14), marginBottom: r(14) },
109
- info: { flex: 1, minWidth: 0 },
110
- priceCol: { alignItems: 'flex-end' },
111
- actions: { flexDirection: 'row', columnGap: r(10) },
112
- });
113
-
114
- const makeStyles = (c: ReturnType<typeof useColors>) =>
115
- StyleSheet.create({
116
- badge: { fontSize: rf(13), fontWeight: fw.semi, color: c.foreground },
117
- barcode: { fontSize: rf(12), color: c.foregroundMuted, fontFamily: fontMono },
118
- name: { fontSize: rf(16), fontWeight: fw.semi, color: c.foreground, lineHeight: rf(21) },
119
- sub: { fontSize: rf(12.5), color: c.foregroundMuted, marginTop: r(4) },
120
- price: { fontSize: rf(24), fontWeight: fw.heavy, color: c.primary, lineHeight: rf(24) },
121
- caption: { fontSize: rf(11), color: c.foregroundMuted, marginTop: r(3) },
122
- });