@unif/react-native-hms-scan 0.1.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 (111) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +149 -0
  3. package/ReactNativeHmsScan.podspec +30 -0
  4. package/android/build.gradle +79 -0
  5. package/android/consumer-rules.pro +13 -0
  6. package/android/src/main/AndroidManifest.xml +23 -0
  7. package/android/src/main/java/com/unif/reactnativehmsscan/HmsScanModule.kt +192 -0
  8. package/android/src/main/java/com/unif/reactnativehmsscan/HmsScanResultMapper.kt +145 -0
  9. package/android/src/main/java/com/unif/reactnativehmsscan/HmsScanView.kt +257 -0
  10. package/android/src/main/java/com/unif/reactnativehmsscan/HmsScanViewManager.kt +66 -0
  11. package/android/src/main/java/com/unif/reactnativehmsscan/ReactNativeHmsScanPackage.kt +49 -0
  12. package/ios/HmsScanModule.h +20 -0
  13. package/ios/HmsScanModule.mm +161 -0
  14. package/ios/HmsScanResultMapper.h +45 -0
  15. package/ios/HmsScanResultMapper.mm +297 -0
  16. package/ios/HmsScanView.h +24 -0
  17. package/ios/HmsScanView.mm +322 -0
  18. package/lib/module/HmsScanView.js +43 -0
  19. package/lib/module/HmsScanView.js.map +1 -0
  20. package/lib/module/HmsScanViewNativeComponent.ts +44 -0
  21. package/lib/module/NativeHmsScan.js +11 -0
  22. package/lib/module/NativeHmsScan.js.map +1 -0
  23. package/lib/module/Scanner/DeniedOverlay.js +60 -0
  24. package/lib/module/Scanner/DeniedOverlay.js.map +1 -0
  25. package/lib/module/Scanner/ResultFail.js +79 -0
  26. package/lib/module/Scanner/ResultFail.js.map +1 -0
  27. package/lib/module/Scanner/ResultFocus.js +174 -0
  28. package/lib/module/Scanner/ResultFocus.js.map +1 -0
  29. package/lib/module/Scanner/ScanHint.js +44 -0
  30. package/lib/module/Scanner/ScanHint.js.map +1 -0
  31. package/lib/module/Scanner/ScanToolbar.js +103 -0
  32. package/lib/module/Scanner/ScanToolbar.js.map +1 -0
  33. package/lib/module/Scanner/ScanTopBar.js +87 -0
  34. package/lib/module/Scanner/ScanTopBar.js.map +1 -0
  35. package/lib/module/Scanner/Scanner.js +184 -0
  36. package/lib/module/Scanner/Scanner.js.map +1 -0
  37. package/lib/module/Scanner/Viewfinder.js +159 -0
  38. package/lib/module/Scanner/Viewfinder.js.map +1 -0
  39. package/lib/module/Scanner/scanChrome.js +23 -0
  40. package/lib/module/Scanner/scanChrome.js.map +1 -0
  41. package/lib/module/decodeImage.js +32 -0
  42. package/lib/module/decodeImage.js.map +1 -0
  43. package/lib/module/format.js +66 -0
  44. package/lib/module/format.js.map +1 -0
  45. package/lib/module/index.js +21 -0
  46. package/lib/module/index.js.map +1 -0
  47. package/lib/module/mock.js +30 -0
  48. package/lib/module/mock.js.map +1 -0
  49. package/lib/module/package.json +1 -0
  50. package/lib/module/permissions.js +28 -0
  51. package/lib/module/permissions.js.map +1 -0
  52. package/lib/module/types.js +46 -0
  53. package/lib/module/types.js.map +1 -0
  54. package/lib/typescript/jest.setup.d.ts +1 -0
  55. package/lib/typescript/jest.setup.d.ts.map +1 -0
  56. package/lib/typescript/package.json +1 -0
  57. package/lib/typescript/src/HmsScanView.d.ts +36 -0
  58. package/lib/typescript/src/HmsScanView.d.ts.map +1 -0
  59. package/lib/typescript/src/HmsScanViewNativeComponent.d.ts +32 -0
  60. package/lib/typescript/src/HmsScanViewNativeComponent.d.ts.map +1 -0
  61. package/lib/typescript/src/NativeHmsScan.d.ts +17 -0
  62. package/lib/typescript/src/NativeHmsScan.d.ts.map +1 -0
  63. package/lib/typescript/src/Scanner/DeniedOverlay.d.ts +7 -0
  64. package/lib/typescript/src/Scanner/DeniedOverlay.d.ts.map +1 -0
  65. package/lib/typescript/src/Scanner/ResultFail.d.ts +7 -0
  66. package/lib/typescript/src/Scanner/ResultFail.d.ts.map +1 -0
  67. package/lib/typescript/src/Scanner/ResultFocus.d.ts +12 -0
  68. package/lib/typescript/src/Scanner/ResultFocus.d.ts.map +1 -0
  69. package/lib/typescript/src/Scanner/ScanHint.d.ts +8 -0
  70. package/lib/typescript/src/Scanner/ScanHint.d.ts.map +1 -0
  71. package/lib/typescript/src/Scanner/ScanToolbar.d.ts +9 -0
  72. package/lib/typescript/src/Scanner/ScanToolbar.d.ts.map +1 -0
  73. package/lib/typescript/src/Scanner/ScanTopBar.d.ts +10 -0
  74. package/lib/typescript/src/Scanner/ScanTopBar.d.ts.map +1 -0
  75. package/lib/typescript/src/Scanner/Scanner.d.ts +34 -0
  76. package/lib/typescript/src/Scanner/Scanner.d.ts.map +1 -0
  77. package/lib/typescript/src/Scanner/Viewfinder.d.ts +11 -0
  78. package/lib/typescript/src/Scanner/Viewfinder.d.ts.map +1 -0
  79. package/lib/typescript/src/Scanner/scanChrome.d.ts +19 -0
  80. package/lib/typescript/src/Scanner/scanChrome.d.ts.map +1 -0
  81. package/lib/typescript/src/decodeImage.d.ts +12 -0
  82. package/lib/typescript/src/decodeImage.d.ts.map +1 -0
  83. package/lib/typescript/src/format.d.ts +13 -0
  84. package/lib/typescript/src/format.d.ts.map +1 -0
  85. package/lib/typescript/src/index.d.ts +10 -0
  86. package/lib/typescript/src/index.d.ts.map +1 -0
  87. package/lib/typescript/src/mock.d.ts +12 -0
  88. package/lib/typescript/src/mock.d.ts.map +1 -0
  89. package/lib/typescript/src/permissions.d.ts +9 -0
  90. package/lib/typescript/src/permissions.d.ts.map +1 -0
  91. package/lib/typescript/src/types.d.ts +62 -0
  92. package/lib/typescript/src/types.d.ts.map +1 -0
  93. package/package.json +174 -0
  94. package/src/HmsScanView.tsx +87 -0
  95. package/src/HmsScanViewNativeComponent.ts +44 -0
  96. package/src/NativeHmsScan.ts +24 -0
  97. package/src/Scanner/DeniedOverlay.tsx +59 -0
  98. package/src/Scanner/ResultFail.tsx +71 -0
  99. package/src/Scanner/ResultFocus.tsx +118 -0
  100. package/src/Scanner/ScanHint.tsx +38 -0
  101. package/src/Scanner/ScanToolbar.tsx +93 -0
  102. package/src/Scanner/ScanTopBar.tsx +74 -0
  103. package/src/Scanner/Scanner.tsx +238 -0
  104. package/src/Scanner/Viewfinder.tsx +115 -0
  105. package/src/Scanner/scanChrome.ts +20 -0
  106. package/src/decodeImage.ts +36 -0
  107. package/src/format.ts +93 -0
  108. package/src/index.tsx +35 -0
  109. package/src/mock.ts +43 -0
  110. package/src/permissions.ts +27 -0
  111. package/src/types.ts +138 -0
@@ -0,0 +1,44 @@
1
+ import type { ViewProps } from 'react-native';
2
+ import type {
3
+ DirectEventHandler,
4
+ WithDefault,
5
+ } from 'react-native/Libraries/Types/CodegenTypes';
6
+ import codegenNativeComponent from 'react-native/Libraries/Utilities/codegenNativeComponent';
7
+
8
+ // RN codegen Fabric 组件规范(注册名 "HmsScanView")。
9
+ // 事件 payload 都用基础类型 / 单字符串,绕开 codegen 对复杂事件结构的限制:
10
+ // 扫码结果以 JSON 字符串回传(由 src/HmsScanView.tsx 解析成 ScanResult[])。
11
+
12
+ type ScanResultEvent = Readonly<{
13
+ /** JSON 编码的 ScanResult[]。 */
14
+ resultsJson: string;
15
+ }>;
16
+
17
+ type ScanErrorEvent = Readonly<{
18
+ code: string;
19
+ message: string;
20
+ }>;
21
+
22
+ type TorchStatusEvent = Readonly<{
23
+ /** 环境是否暗到建议显示手电按钮(Android OnLightVisibleCallBack)。 */
24
+ available: boolean;
25
+ /** 手电当前是否点亮。 */
26
+ on: boolean;
27
+ }>;
28
+
29
+ export interface NativeProps extends ViewProps {
30
+ /** 限定码制(逗号分隔的 BarcodeFormat),空串 = 全部。 */
31
+ formatsCsv?: WithDefault<string, ''>;
32
+ /** 连续扫码(命中后继续,不自动停)。 */
33
+ continuous?: WithDefault<boolean, true>;
34
+ /** 暂停/恢复扫码(命中后想停在结果卡时用)。 */
35
+ paused?: WithDefault<boolean, false>;
36
+ /** 手电筒(Android 直接控制;iOS 走 AVCaptureDevice 尽力补)。 */
37
+ torch?: WithDefault<boolean, false>;
38
+
39
+ onScanResult?: DirectEventHandler<ScanResultEvent>;
40
+ onScanError?: DirectEventHandler<ScanErrorEvent>;
41
+ onTorchStatus?: DirectEventHandler<TorchStatusEvent>;
42
+ }
43
+
44
+ export default codegenNativeComponent<NativeProps>('HmsScanView');
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+
3
+ import { TurboModuleRegistry } from 'react-native';
4
+
5
+ // RN codegen 规范(宿主 App build 时生成 NativeHmsScanSpec)。
6
+ // 注:为规避 codegen 对"对象数组 / 字符串字面量联合"的类型限制,
7
+ // decodeImage 返回 JSON 编码的 ScanResult[](由 src/format.ts 解析回强类型),
8
+ // 权限状态返回字符串(由 src/permissions.ts 归一)。
9
+
10
+ export default TurboModuleRegistry.getEnforcing('HmsScan');
11
+ //# sourceMappingURL=NativeHmsScan.js.map
@@ -0,0 +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":[]}
@@ -0,0 +1,60 @@
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
+ // 相机权限未授权态:无相机可显示,故用主题背景的全屏空态(与 react-native-camera 的 NoPermission 一致)。
7
+ export function DeniedOverlay({
8
+ onClose,
9
+ onSettings
10
+ }) {
11
+ const s = useThemedStyles(makeStyles);
12
+ return /*#__PURE__*/_jsxs(View, {
13
+ style: s.overlay,
14
+ children: [/*#__PURE__*/_jsx(Empty, {
15
+ icon: "permission-denied",
16
+ title: "\u9700\u8981\u76F8\u673A\u6743\u9650",
17
+ desc: "\u5F00\u542F\u76F8\u673A\u540E\uFF0C\u624D\u80FD\u626B\u63CF\u5546\u54C1\u6761\u7801\u4E0E\u95E8\u5E97\u4E8C\u7EF4\u7801\u3002\u8BF7\u524D\u5F80\u7CFB\u7EDF\u8BBE\u7F6E\u6388\u6743\u3002"
18
+ }), /*#__PURE__*/_jsxs(View, {
19
+ style: styles.row,
20
+ children: [onClose && /*#__PURE__*/_jsx(Button, {
21
+ label: "\u53D6\u6D88",
22
+ variant: "ghost",
23
+ onPress: onClose,
24
+ style: styles.btn
25
+ }), /*#__PURE__*/_jsx(Button, {
26
+ label: "\u53BB\u8BBE\u7F6E\u5F00\u542F",
27
+ variant: "primary",
28
+ leftIcon: "settings",
29
+ onPress: onSettings,
30
+ style: styles.btn
31
+ })]
32
+ })]
33
+ });
34
+ }
35
+ const styles = StyleSheet.create({
36
+ row: {
37
+ flexDirection: 'row',
38
+ columnGap: r(12),
39
+ marginTop: r(8)
40
+ },
41
+ btn: {
42
+ flex: 1
43
+ }
44
+ });
45
+ const makeStyles = c => StyleSheet.create({
46
+ overlay: {
47
+ position: 'absolute',
48
+ top: 0,
49
+ left: 0,
50
+ right: 0,
51
+ bottom: 0,
52
+ zIndex: 40,
53
+ backgroundColor: c.background,
54
+ alignItems: 'center',
55
+ justifyContent: 'center',
56
+ paddingHorizontal: r(40),
57
+ rowGap: r(8)
58
+ }
59
+ });
60
+ //# sourceMappingURL=DeniedOverlay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["StyleSheet","View","Button","Empty","useThemedStyles","r","jsx","_jsx","jsxs","_jsxs","DeniedOverlay","onClose","onSettings","s","makeStyles","style","overlay","children","icon","title","desc","styles","row","label","variant","onPress","btn","leftIcon","create","flexDirection","columnGap","marginTop","flex","c","position","top","left","right","bottom","zIndex","backgroundColor","background","alignItems","justifyContent","paddingHorizontal","rowGap"],"sourceRoot":"../../../src","sources":["Scanner/DeniedOverlay.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;AACA,OAAO,SAASC,aAAaA,CAAC;EAAEC,OAAO;EAAEC;AAA+B,CAAC,EAAE;EACzE,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,mBAAmB;MACxBC,KAAK,EAAC,sCAAQ;MACdC,IAAI,EAAC;IAAiC,CACvC,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,OAAO,EAAEd,OAAQ;QAACI,KAAK,EAAEM,MAAM,CAACK;MAAI,CAAE,CAAC,eACtFnB,IAAA,CAACL,MAAM;QACLqB,KAAK,EAAC,gCAAO;QACbC,OAAO,EAAC,SAAS;QACjBG,QAAQ,EAAC,UAAU;QACnBF,OAAO,EAAEb,UAAW;QACpBG,KAAK,EAAEM,MAAM,CAACK;MAAI,CACnB,CAAC;IAAA,CACE,CAAC;EAAA,CACH,CAAC;AAEX;AAEA,MAAML,MAAM,GAAGrB,UAAU,CAAC4B,MAAM,CAAC;EAC/BN,GAAG,EAAE;IAAEO,aAAa,EAAE,KAAK;IAAEC,SAAS,EAAEzB,CAAC,CAAC,EAAE,CAAC;IAAE0B,SAAS,EAAE1B,CAAC,CAAC,CAAC;EAAE,CAAC;EAChEqB,GAAG,EAAE;IAAEM,IAAI,EAAE;EAAE;AACjB,CAAC,CAAC;AAEF,MAAMlB,UAAU,GAAImB,CAAc,IAChCjC,UAAU,CAAC4B,MAAM,CAAC;EAChBZ,OAAO,EAAE;IACPkB,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,EAAEvC,CAAC,CAAC,EAAE,CAAC;IACxBwC,MAAM,EAAExC,CAAC,CAAC,CAAC;EACb;AACF,CAAC,CAAC","ignoreList":[]}
@@ -0,0 +1,79 @@
1
+ "use strict";
2
+
3
+ import { useEffect, useRef } from 'react';
4
+ import { Animated, StyleSheet, View } from 'react-native';
5
+ import { Button, Empty, useThemedStyles, r } from '@unif/react-native-design';
6
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
7
+ // 未识别失败的底部弹层:design 的 Empty(error-alert)+ Button(重新扫描)。
8
+ // 聚焦款不加背景遮罩,与浮层确认卡保持一致。
9
+ export function ResultFail({
10
+ bottomInset,
11
+ onRetry
12
+ }) {
13
+ const s = useThemedStyles(makeStyles);
14
+ const anim = useRef(new Animated.Value(0)).current;
15
+ useEffect(() => {
16
+ Animated.timing(anim, {
17
+ toValue: 1,
18
+ duration: 320,
19
+ useNativeDriver: true
20
+ }).start();
21
+ }, [anim]);
22
+ return /*#__PURE__*/_jsxs(Animated.View, {
23
+ style: [s.sheet, {
24
+ transform: [{
25
+ translateY: anim.interpolate({
26
+ inputRange: [0, 1],
27
+ outputRange: [r(320), 0]
28
+ })
29
+ }]
30
+ }],
31
+ children: [/*#__PURE__*/_jsx(View, {
32
+ style: s.grabber
33
+ }), /*#__PURE__*/_jsxs(View, {
34
+ style: [styles.inner, {
35
+ paddingBottom: bottomInset + r(14)
36
+ }],
37
+ children: [/*#__PURE__*/_jsx(Empty, {
38
+ icon: "error-alert",
39
+ title: "\u672A\u8BC6\u522B\u5230\u6761\u7801",
40
+ desc: "\u8BF7\u5C06\u6761\u7801\u5B8C\u6574\u7F6E\u4E8E\u6846\u5185\u3001\u4FDD\u6301\u5E73\u6574\u5E76\u5BF9\u51C6\u5149\u7EBF\u540E\u91CD\u8BD5\u3002"
41
+ }), /*#__PURE__*/_jsx(Button, {
42
+ label: "\u91CD\u65B0\u626B\u63CF",
43
+ leftIcon: "retry",
44
+ variant: "primary",
45
+ block: true,
46
+ onPress: onRetry
47
+ })]
48
+ })]
49
+ });
50
+ }
51
+ const styles = StyleSheet.create({
52
+ inner: {
53
+ paddingHorizontal: r(18),
54
+ paddingTop: r(8),
55
+ rowGap: r(16)
56
+ }
57
+ });
58
+ const makeStyles = (c, shadow) => StyleSheet.create({
59
+ sheet: {
60
+ position: 'absolute',
61
+ left: 0,
62
+ right: 0,
63
+ bottom: 0,
64
+ zIndex: 50,
65
+ backgroundColor: c.surface,
66
+ borderTopLeftRadius: r(20),
67
+ borderTopRightRadius: r(20),
68
+ paddingTop: r(10),
69
+ ...shadow.floating
70
+ },
71
+ grabber: {
72
+ width: r(40),
73
+ height: r(4),
74
+ borderRadius: 999,
75
+ backgroundColor: c.surfaceContainerHighest,
76
+ alignSelf: 'center'
77
+ }
78
+ });
79
+ //# sourceMappingURL=ResultFail.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["useEffect","useRef","Animated","StyleSheet","View","Button","Empty","useThemedStyles","r","jsx","_jsx","jsxs","_jsxs","ResultFail","bottomInset","onRetry","s","makeStyles","anim","Value","current","timing","toValue","duration","useNativeDriver","start","style","sheet","transform","translateY","interpolate","inputRange","outputRange","children","grabber","styles","inner","paddingBottom","icon","title","desc","label","leftIcon","variant","block","onPress","create","paddingHorizontal","paddingTop","rowGap","c","shadow","position","left","right","bottom","zIndex","backgroundColor","surface","borderTopLeftRadius","borderTopRightRadius","floating","width","height","borderRadius","surfaceContainerHighest","alignSelf"],"sourceRoot":"../../../src","sources":["Scanner/ResultFail.tsx"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,174 @@
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
+ onContinue,
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: "\u7EE7\u7EED\u626B\u63CF",
90
+ variant: "secondary",
91
+ onPress: onContinue,
92
+ style: styles.btn
93
+ }), /*#__PURE__*/_jsx(Button, {
94
+ label: "\u786E\u8BA4",
95
+ variant: "primary",
96
+ onPress: onConfirm,
97
+ style: styles.btn
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
+ btn: {
137
+ flex: 1
138
+ }
139
+ });
140
+ const makeStyles = c => StyleSheet.create({
141
+ badge: {
142
+ fontSize: rf(13),
143
+ fontWeight: fw.semi,
144
+ color: c.foreground
145
+ },
146
+ barcode: {
147
+ fontSize: rf(12),
148
+ color: c.foregroundSubtle,
149
+ fontFamily: fontMono
150
+ },
151
+ name: {
152
+ fontSize: rf(16),
153
+ fontWeight: fw.semi,
154
+ color: c.foreground,
155
+ lineHeight: rf(21)
156
+ },
157
+ sub: {
158
+ fontSize: rf(12.5),
159
+ color: c.foregroundMuted,
160
+ marginTop: r(4)
161
+ },
162
+ price: {
163
+ fontSize: rf(24),
164
+ fontWeight: fw.heavy,
165
+ color: c.primary,
166
+ lineHeight: rf(24)
167
+ },
168
+ caption: {
169
+ fontSize: rf(11),
170
+ color: c.foregroundSubtle,
171
+ marginTop: r(3)
172
+ }
173
+ });
174
+ //# sourceMappingURL=ResultFocus.js.map
@@ -0,0 +1 @@
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","onContinue","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","onPress","btn","create","position","left","right","zIndex","flexDirection","alignItems","columnGap","marginBottom","flex","minWidth","fontSize","fontWeight","semi","color","foreground","foregroundSubtle","fontFamily","lineHeight","foregroundMuted","marginTop","heavy"],"sourceRoot":"../../../src","sources":["Scanner/ResultFocus.tsx"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+
3
+ import { StyleSheet, Text, View } from 'react-native';
4
+ import { Spinner, r, rf, fw } from '@unif/react-native-design';
5
+ import { scanChrome } from "./scanChrome.js";
6
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
7
+ // 取景框下方提示。识别中显示 design 的 Spinner(白)+ "识别中…"。
8
+ export function ScanHint({
9
+ detecting,
10
+ text
11
+ }) {
12
+ return /*#__PURE__*/_jsxs(View, {
13
+ style: styles.row,
14
+ children: [detecting && /*#__PURE__*/_jsx(Spinner, {
15
+ size: r(15),
16
+ color: scanChrome.white
17
+ }), /*#__PURE__*/_jsx(Text, {
18
+ style: styles.text,
19
+ children: detecting ? '识别中…' : text
20
+ })]
21
+ });
22
+ }
23
+ const styles = StyleSheet.create({
24
+ row: {
25
+ marginTop: r(18),
26
+ flexDirection: 'row',
27
+ alignItems: 'center',
28
+ justifyContent: 'center',
29
+ columnGap: r(7)
30
+ },
31
+ text: {
32
+ color: scanChrome.hintText,
33
+ fontSize: rf(13.5),
34
+ fontWeight: fw.medium,
35
+ letterSpacing: 0.2,
36
+ textShadowColor: scanChrome.textShadow,
37
+ textShadowOffset: {
38
+ width: 0,
39
+ height: 1
40
+ },
41
+ textShadowRadius: 6
42
+ }
43
+ });
44
+ //# sourceMappingURL=ScanHint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["StyleSheet","Text","View","Spinner","r","rf","fw","scanChrome","jsx","_jsx","jsxs","_jsxs","ScanHint","detecting","text","style","styles","row","children","size","color","white","create","marginTop","flexDirection","alignItems","justifyContent","columnGap","hintText","fontSize","fontWeight","medium","letterSpacing","textShadowColor","textShadow","textShadowOffset","width","height","textShadowRadius"],"sourceRoot":"../../../src","sources":["Scanner/ScanHint.tsx"],"mappings":";;AAAA,SAASA,UAAU,EAAEC,IAAI,EAAEC,IAAI,QAAQ,cAAc;AACrD,SAASC,OAAO,EAAEC,CAAC,EAAEC,EAAE,EAAEC,EAAE,QAAQ,2BAA2B;AAC9D,SAASC,UAAU,QAAQ,iBAAc;AAAC,SAAAC,GAAA,IAAAC,IAAA,EAAAC,IAAA,IAAAC,KAAA;AAQ1C;AACA,OAAO,SAASC,QAAQA,CAAC;EAAEC,SAAS;EAAEC;AAAoB,CAAC,EAAE;EAC3D,oBACEH,KAAA,CAACT,IAAI;IAACa,KAAK,EAAEC,MAAM,CAACC,GAAI;IAAAC,QAAA,GACrBL,SAAS,iBAAIJ,IAAA,CAACN,OAAO;MAACgB,IAAI,EAAEf,CAAC,CAAC,EAAE,CAAE;MAACgB,KAAK,EAAEb,UAAU,CAACc;IAAM,CAAE,CAAC,eAC/DZ,IAAA,CAACR,IAAI;MAACc,KAAK,EAAEC,MAAM,CAACF,IAAK;MAAAI,QAAA,EAAEL,SAAS,GAAG,MAAM,GAAGC;IAAI,CAAO,CAAC;EAAA,CACxD,CAAC;AAEX;AAEA,MAAME,MAAM,GAAGhB,UAAU,CAACsB,MAAM,CAAC;EAC/BL,GAAG,EAAE;IACHM,SAAS,EAAEnB,CAAC,CAAC,EAAE,CAAC;IAChBoB,aAAa,EAAE,KAAK;IACpBC,UAAU,EAAE,QAAQ;IACpBC,cAAc,EAAE,QAAQ;IACxBC,SAAS,EAAEvB,CAAC,CAAC,CAAC;EAChB,CAAC;EACDU,IAAI,EAAE;IACJM,KAAK,EAAEb,UAAU,CAACqB,QAAQ;IAC1BC,QAAQ,EAAExB,EAAE,CAAC,IAAI,CAAC;IAClByB,UAAU,EAAExB,EAAE,CAACyB,MAAM;IACrBC,aAAa,EAAE,GAAG;IAClBC,eAAe,EAAE1B,UAAU,CAAC2B,UAAU;IACtCC,gBAAgB,EAAE;MAAEC,KAAK,EAAE,CAAC;MAAEC,MAAM,EAAE;IAAE,CAAC;IACzCC,gBAAgB,EAAE;EACpB;AACF,CAAC,CAAC","ignoreList":[]}
@@ -0,0 +1,103 @@
1
+ "use strict";
2
+
3
+ import { Pressable, StyleSheet, Text, View } from 'react-native';
4
+ import { Icon, useColors, r, rf, fw } from '@unif/react-native-design';
5
+ import { scanChrome } from "./scanChrome.js";
6
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
7
+ // 底部工具栏:手电筒 · 相册(按定稿,去掉了搜索 / 输入码)。点亮态用主题主色。
8
+ export function ScanToolbar({
9
+ flash,
10
+ bottomInset,
11
+ onFlash,
12
+ onAlbum
13
+ }) {
14
+ const c = useColors();
15
+ return /*#__PURE__*/_jsxs(View, {
16
+ style: [styles.bar, {
17
+ bottom: bottomInset + r(50)
18
+ }],
19
+ pointerEvents: "box-none",
20
+ children: [/*#__PURE__*/_jsx(ToolbarItem, {
21
+ icon: flash ? 'flash-on' : 'flash-off',
22
+ label: flash ? '已开灯' : '手电筒',
23
+ activeColor: flash ? c.primary : undefined,
24
+ onPress: onFlash
25
+ }), /*#__PURE__*/_jsx(ToolbarItem, {
26
+ icon: "image",
27
+ label: "\u76F8\u518C",
28
+ onPress: onAlbum
29
+ })]
30
+ });
31
+ }
32
+ function ToolbarItem({
33
+ icon,
34
+ label,
35
+ activeColor,
36
+ onPress
37
+ }) {
38
+ return /*#__PURE__*/_jsx(Pressable, {
39
+ onPress: onPress,
40
+ style: styles.item,
41
+ accessibilityRole: "button",
42
+ accessibilityLabel: label,
43
+ children: ({
44
+ pressed
45
+ }) => /*#__PURE__*/_jsxs(_Fragment, {
46
+ children: [/*#__PURE__*/_jsx(View, {
47
+ style: [styles.circle, activeColor ? {
48
+ backgroundColor: activeColor,
49
+ borderColor: scanChrome.glassBorderActive
50
+ } : {
51
+ backgroundColor: scanChrome.glassDisc2,
52
+ borderColor: scanChrome.glassBorder
53
+ }, pressed && {
54
+ opacity: 0.7
55
+ }],
56
+ children: /*#__PURE__*/_jsx(Icon, {
57
+ name: icon,
58
+ size: r(23),
59
+ color: scanChrome.white
60
+ })
61
+ }), /*#__PURE__*/_jsx(Text, {
62
+ style: styles.label,
63
+ children: label
64
+ })]
65
+ })
66
+ });
67
+ }
68
+ const styles = StyleSheet.create({
69
+ bar: {
70
+ position: 'absolute',
71
+ left: 0,
72
+ right: 0,
73
+ zIndex: 30,
74
+ flexDirection: 'row',
75
+ justifyContent: 'center',
76
+ columnGap: r(40)
77
+ },
78
+ item: {
79
+ width: r(72),
80
+ alignItems: 'center',
81
+ rowGap: r(7)
82
+ },
83
+ circle: {
84
+ width: r(54),
85
+ height: r(54),
86
+ borderRadius: 999,
87
+ alignItems: 'center',
88
+ justifyContent: 'center',
89
+ borderWidth: StyleSheet.hairlineWidth
90
+ },
91
+ label: {
92
+ fontSize: rf(12),
93
+ fontWeight: fw.medium,
94
+ color: scanChrome.toolbarLabel,
95
+ textShadowColor: 'rgba(0,0,0,0.4)',
96
+ textShadowOffset: {
97
+ width: 0,
98
+ height: 1
99
+ },
100
+ textShadowRadius: 4
101
+ }
102
+ });
103
+ //# sourceMappingURL=ScanToolbar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["Pressable","StyleSheet","Text","View","Icon","useColors","r","rf","fw","scanChrome","jsx","_jsx","jsxs","_jsxs","Fragment","_Fragment","ScanToolbar","flash","bottomInset","onFlash","onAlbum","c","style","styles","bar","bottom","pointerEvents","children","ToolbarItem","icon","label","activeColor","primary","undefined","onPress","item","accessibilityRole","accessibilityLabel","pressed","circle","backgroundColor","borderColor","glassBorderActive","glassDisc2","glassBorder","opacity","name","size","color","white","create","position","left","right","zIndex","flexDirection","justifyContent","columnGap","width","alignItems","rowGap","height","borderRadius","borderWidth","hairlineWidth","fontSize","fontWeight","medium","toolbarLabel","textShadowColor","textShadowOffset","textShadowRadius"],"sourceRoot":"../../../src","sources":["Scanner/ScanToolbar.tsx"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,87 @@
1
+ "use strict";
2
+
3
+ import { Pressable, StyleSheet, Text, View } from 'react-native';
4
+ import { Icon, r, rf, fw } from '@unif/react-native-design';
5
+ import { scanChrome } from "./scanChrome.js";
6
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
7
+ // 顶栏:关闭键 · 标题 · 尾部插槽。叠在深色相机预览之上,故文字/图标恒为白(不随主题)。
8
+ // 设计稿用了毛玻璃,RN 无内建模糊,这里以半透明深色底近似(design 的 BlurLayer 需额外原生模糊库)。
9
+ export function ScanTopBar({
10
+ title,
11
+ topInset,
12
+ onClose,
13
+ trailing
14
+ }) {
15
+ return /*#__PURE__*/_jsxs(View, {
16
+ style: [styles.bar, {
17
+ paddingTop: topInset
18
+ }],
19
+ pointerEvents: "box-none",
20
+ children: [/*#__PURE__*/_jsx(Pressable, {
21
+ onPress: onClose,
22
+ hitSlop: 8,
23
+ accessibilityRole: "button",
24
+ accessibilityLabel: "\u5173\u95ED",
25
+ style: ({
26
+ pressed
27
+ }) => [styles.disc, pressed && styles.pressed],
28
+ children: /*#__PURE__*/_jsx(Icon, {
29
+ name: "close",
30
+ size: r(20),
31
+ color: scanChrome.white
32
+ })
33
+ }), /*#__PURE__*/_jsx(Text, {
34
+ style: styles.title,
35
+ children: title
36
+ }), /*#__PURE__*/_jsx(View, {
37
+ style: styles.trailing,
38
+ children: trailing
39
+ })]
40
+ });
41
+ }
42
+ const styles = StyleSheet.create({
43
+ bar: {
44
+ position: 'absolute',
45
+ top: 0,
46
+ left: 0,
47
+ right: 0,
48
+ zIndex: 30,
49
+ paddingHorizontal: r(14),
50
+ paddingBottom: r(8),
51
+ flexDirection: 'row',
52
+ alignItems: 'center',
53
+ justifyContent: 'space-between'
54
+ },
55
+ disc: {
56
+ width: r(38),
57
+ height: r(38),
58
+ borderRadius: 999,
59
+ alignItems: 'center',
60
+ justifyContent: 'center',
61
+ backgroundColor: scanChrome.glassDisc,
62
+ borderWidth: StyleSheet.hairlineWidth,
63
+ borderColor: scanChrome.glassBorder
64
+ },
65
+ pressed: {
66
+ opacity: 0.6
67
+ },
68
+ title: {
69
+ color: scanChrome.white,
70
+ fontSize: rf(16),
71
+ fontWeight: fw.semi,
72
+ letterSpacing: 0.2,
73
+ textShadowColor: scanChrome.textShadow,
74
+ textShadowOffset: {
75
+ width: 0,
76
+ height: 1
77
+ },
78
+ textShadowRadius: 6
79
+ },
80
+ trailing: {
81
+ width: r(38),
82
+ height: r(38),
83
+ alignItems: 'center',
84
+ justifyContent: 'center'
85
+ }
86
+ });
87
+ //# sourceMappingURL=ScanTopBar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["Pressable","StyleSheet","Text","View","Icon","r","rf","fw","scanChrome","jsx","_jsx","jsxs","_jsxs","ScanTopBar","title","topInset","onClose","trailing","style","styles","bar","paddingTop","pointerEvents","children","onPress","hitSlop","accessibilityRole","accessibilityLabel","pressed","disc","name","size","color","white","create","position","top","left","right","zIndex","paddingHorizontal","paddingBottom","flexDirection","alignItems","justifyContent","width","height","borderRadius","backgroundColor","glassDisc","borderWidth","hairlineWidth","borderColor","glassBorder","opacity","fontSize","fontWeight","semi","letterSpacing","textShadowColor","textShadow","textShadowOffset","textShadowRadius"],"sourceRoot":"../../../src","sources":["Scanner/ScanTopBar.tsx"],"mappings":"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","ignoreList":[]}