@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
|
@@ -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"}
|
package/src/HmsScanView.tsx
DELETED
|
@@ -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
|
-
});
|