@unif/react-native-hms-scan 0.3.0 → 0.4.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/lib/module/Scanner/ResultFail.js +4 -5
- package/lib/module/Scanner/ResultFail.js.map +1 -1
- package/lib/module/Scanner/ResultFocus.js +4 -4
- package/lib/module/Scanner/ResultFocus.js.map +1 -1
- package/lib/module/Scanner/ScanToolbar.js +8 -3
- package/lib/module/Scanner/ScanToolbar.js.map +1 -1
- package/lib/module/Scanner/ScanTopBar.js +10 -47
- package/lib/module/Scanner/ScanTopBar.js.map +1 -1
- package/lib/module/Scanner/Scanner.js +9 -8
- package/lib/module/Scanner/Scanner.js.map +1 -1
- package/lib/module/Scanner/Viewfinder.js +43 -45
- package/lib/module/Scanner/Viewfinder.js.map +1 -1
- package/lib/module/index.js +1 -0
- package/lib/module/index.js.map +1 -1
- package/lib/typescript/src/Scanner/ResultFail.d.ts +3 -2
- package/lib/typescript/src/Scanner/ResultFail.d.ts.map +1 -1
- package/lib/typescript/src/Scanner/ResultFocus.d.ts +4 -2
- package/lib/typescript/src/Scanner/ResultFocus.d.ts.map +1 -1
- package/lib/typescript/src/Scanner/ScanToolbar.d.ts +3 -1
- package/lib/typescript/src/Scanner/ScanToolbar.d.ts.map +1 -1
- package/lib/typescript/src/Scanner/ScanTopBar.d.ts +1 -4
- package/lib/typescript/src/Scanner/ScanTopBar.d.ts.map +1 -1
- package/lib/typescript/src/Scanner/Scanner.d.ts +1 -1
- package/lib/typescript/src/Scanner/Scanner.d.ts.map +1 -1
- package/lib/typescript/src/Scanner/Viewfinder.d.ts.map +1 -1
- package/lib/typescript/src/index.d.ts.map +1 -1
- package/package.json +3 -3
- package/src/Scanner/ResultFail.tsx +5 -4
- package/src/Scanner/ResultFocus.tsx +7 -5
- package/src/Scanner/ScanToolbar.tsx +11 -2
- package/src/Scanner/ScanTopBar.tsx +5 -37
- package/src/Scanner/Scanner.tsx +9 -7
- package/src/Scanner/Viewfinder.tsx +45 -26
- package/src/index.tsx +1 -0
|
@@ -4,11 +4,11 @@ import { useEffect, useRef } from 'react';
|
|
|
4
4
|
import { Animated, StyleSheet, View } from 'react-native';
|
|
5
5
|
import { Button, Empty, useThemedStyles, r } from '@unif/react-native-design';
|
|
6
6
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
7
|
-
// 未识别失败的底部弹层:design 的 Empty(error-alert)+ Button
|
|
7
|
+
// 未识别失败的底部弹层:design 的 Empty(error-alert)+ Button(重扫)。
|
|
8
8
|
// 聚焦款不加背景遮罩,与浮层确认卡保持一致。
|
|
9
9
|
export function ResultFail({
|
|
10
10
|
bottomInset,
|
|
11
|
-
|
|
11
|
+
onRescan
|
|
12
12
|
}) {
|
|
13
13
|
const s = useThemedStyles(makeStyles);
|
|
14
14
|
const anim = useRef(new Animated.Value(0)).current;
|
|
@@ -39,11 +39,10 @@ export function ResultFail({
|
|
|
39
39
|
title: "\u672A\u8BC6\u522B\u5230\u6761\u7801",
|
|
40
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
41
|
}), /*#__PURE__*/_jsx(Button, {
|
|
42
|
-
label: "\u91CD\
|
|
43
|
-
leftIcon: "retry",
|
|
42
|
+
label: "\u91CD\u626B",
|
|
44
43
|
variant: "primary",
|
|
45
44
|
block: true,
|
|
46
|
-
onPress:
|
|
45
|
+
onPress: onRescan
|
|
47
46
|
})]
|
|
48
47
|
})]
|
|
49
48
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["useEffect","useRef","Animated","StyleSheet","View","Button","Empty","useThemedStyles","r","jsx","_jsx","jsxs","_jsxs","ResultFail","bottomInset","
|
|
1
|
+
{"version":3,"names":["useEffect","useRef","Animated","StyleSheet","View","Button","Empty","useThemedStyles","r","jsx","_jsx","jsxs","_jsxs","ResultFail","bottomInset","onRescan","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","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":[]}
|
|
@@ -9,7 +9,7 @@ export function ResultFocus({
|
|
|
9
9
|
product,
|
|
10
10
|
detectMs,
|
|
11
11
|
bottomInset,
|
|
12
|
-
|
|
12
|
+
onRescan,
|
|
13
13
|
onConfirm
|
|
14
14
|
}) {
|
|
15
15
|
const c = useColors();
|
|
@@ -86,12 +86,12 @@ export function ResultFocus({
|
|
|
86
86
|
}), /*#__PURE__*/_jsxs(View, {
|
|
87
87
|
style: styles.actions,
|
|
88
88
|
children: [/*#__PURE__*/_jsx(Button, {
|
|
89
|
-
label: "\
|
|
89
|
+
label: "\u91CD\u626B",
|
|
90
90
|
variant: "secondary",
|
|
91
|
-
onPress:
|
|
91
|
+
onPress: onRescan,
|
|
92
92
|
style: styles.btn
|
|
93
93
|
}), /*#__PURE__*/_jsx(Button, {
|
|
94
|
-
label: "\u786E\
|
|
94
|
+
label: "\u786E\u5B9A",
|
|
95
95
|
variant: "primary",
|
|
96
96
|
onPress: onConfirm,
|
|
97
97
|
style: styles.btn
|
|
@@ -1 +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","
|
|
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","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":[]}
|
|
@@ -4,12 +4,13 @@ import { Pressable, StyleSheet, Text, View } from 'react-native';
|
|
|
4
4
|
import { Icon, useColors, r, rf, fw } from '@unif/react-native-design';
|
|
5
5
|
import { scanChrome } from "./scanChrome.js";
|
|
6
6
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
7
|
-
//
|
|
7
|
+
// 底部工具栏:返回 · 手电筒 · 相册。点亮态用主题主色。
|
|
8
8
|
export function ScanToolbar({
|
|
9
9
|
flash,
|
|
10
10
|
bottomInset,
|
|
11
11
|
onFlash,
|
|
12
|
-
onAlbum
|
|
12
|
+
onAlbum,
|
|
13
|
+
onClose
|
|
13
14
|
}) {
|
|
14
15
|
const c = useColors();
|
|
15
16
|
return /*#__PURE__*/_jsxs(View, {
|
|
@@ -17,7 +18,11 @@ export function ScanToolbar({
|
|
|
17
18
|
bottom: bottomInset + r(50)
|
|
18
19
|
}],
|
|
19
20
|
pointerEvents: "box-none",
|
|
20
|
-
children: [
|
|
21
|
+
children: [onClose && /*#__PURE__*/_jsx(ToolbarItem, {
|
|
22
|
+
icon: "undo",
|
|
23
|
+
label: "\u8FD4\u56DE",
|
|
24
|
+
onPress: onClose
|
|
25
|
+
}), onFlash && /*#__PURE__*/_jsx(ToolbarItem, {
|
|
21
26
|
icon: flash ? 'flash-on' : 'flash-off',
|
|
22
27
|
label: flash ? '已开灯' : '手电筒',
|
|
23
28
|
activeColor: flash ? c.primary : undefined,
|
|
@@ -1 +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","
|
|
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","onClose","c","style","styles","bar","bottom","pointerEvents","children","ToolbarItem","icon","label","onPress","activeColor","primary","undefined","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":[]}
|
|
@@ -1,42 +1,24 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
3
|
+
import { StyleSheet, Text, View } from 'react-native';
|
|
4
|
+
import { r, rf, fw } from '@unif/react-native-design';
|
|
5
5
|
import { scanChrome } from "./scanChrome.js";
|
|
6
|
-
import { jsx as _jsx
|
|
7
|
-
//
|
|
8
|
-
//
|
|
6
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
7
|
+
// 顶栏:仅居中标题。关闭键已移到底部工具栏,与手电筒并排(见 ScanToolbar)。
|
|
8
|
+
// 叠在深色相机预览之上,故文字恒为白(不随主题)。
|
|
9
9
|
export function ScanTopBar({
|
|
10
10
|
title,
|
|
11
|
-
topInset
|
|
12
|
-
onClose,
|
|
13
|
-
trailing
|
|
11
|
+
topInset
|
|
14
12
|
}) {
|
|
15
|
-
return /*#__PURE__*/
|
|
13
|
+
return /*#__PURE__*/_jsx(View, {
|
|
16
14
|
style: [styles.bar, {
|
|
17
15
|
paddingTop: topInset
|
|
18
16
|
}],
|
|
19
17
|
pointerEvents: "box-none",
|
|
20
|
-
children:
|
|
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, {
|
|
18
|
+
children: /*#__PURE__*/_jsx(Text, {
|
|
34
19
|
style: styles.title,
|
|
35
20
|
children: title
|
|
36
|
-
})
|
|
37
|
-
style: styles.trailing,
|
|
38
|
-
children: trailing
|
|
39
|
-
})]
|
|
21
|
+
})
|
|
40
22
|
});
|
|
41
23
|
}
|
|
42
24
|
const styles = StyleSheet.create({
|
|
@@ -50,20 +32,7 @@ const styles = StyleSheet.create({
|
|
|
50
32
|
paddingBottom: r(8),
|
|
51
33
|
flexDirection: 'row',
|
|
52
34
|
alignItems: 'center',
|
|
53
|
-
justifyContent: '
|
|
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
|
|
35
|
+
justifyContent: 'center'
|
|
67
36
|
},
|
|
68
37
|
title: {
|
|
69
38
|
color: scanChrome.white,
|
|
@@ -76,12 +45,6 @@ const styles = StyleSheet.create({
|
|
|
76
45
|
height: 1
|
|
77
46
|
},
|
|
78
47
|
textShadowRadius: 6
|
|
79
|
-
},
|
|
80
|
-
trailing: {
|
|
81
|
-
width: r(38),
|
|
82
|
-
height: r(38),
|
|
83
|
-
alignItems: 'center',
|
|
84
|
-
justifyContent: 'center'
|
|
85
48
|
}
|
|
86
49
|
});
|
|
87
50
|
//# sourceMappingURL=ScanTopBar.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["
|
|
1
|
+
{"version":3,"names":["StyleSheet","Text","View","r","rf","fw","scanChrome","jsx","_jsx","ScanTopBar","title","topInset","style","styles","bar","paddingTop","pointerEvents","children","create","position","top","left","right","zIndex","paddingHorizontal","paddingBottom","flexDirection","alignItems","justifyContent","color","white","fontSize","fontWeight","semi","letterSpacing","textShadowColor","textShadow","textShadowOffset","width","height","textShadowRadius"],"sourceRoot":"../../../src","sources":["Scanner/ScanTopBar.tsx"],"mappings":";;AAAA,SAASA,UAAU,EAAEC,IAAI,EAAEC,IAAI,QAAQ,cAAc;AACrD,SAASC,CAAC,EAAEC,EAAE,EAAEC,EAAE,QAAQ,2BAA2B;AACrD,SAASC,UAAU,QAAQ,iBAAc;AAAC,SAAAC,GAAA,IAAAC,IAAA;AAO1C;AACA;AACA,OAAO,SAASC,UAAUA,CAAC;EAAEC,KAAK;EAAEC;AAA0B,CAAC,EAAE;EAC/D,oBACEH,IAAA,CAACN,IAAI;IAACU,KAAK,EAAE,CAACC,MAAM,CAACC,GAAG,EAAE;MAAEC,UAAU,EAAEJ;IAAS,CAAC,CAAE;IAACK,aAAa,EAAC,UAAU;IAAAC,QAAA,eAC3ET,IAAA,CAACP,IAAI;MAACW,KAAK,EAAEC,MAAM,CAACH,KAAM;MAAAO,QAAA,EAAEP;IAAK,CAAO;EAAC,CACrC,CAAC;AAEX;AAEA,MAAMG,MAAM,GAAGb,UAAU,CAACkB,MAAM,CAAC;EAC/BJ,GAAG,EAAE;IACHK,QAAQ,EAAE,UAAU;IACpBC,GAAG,EAAE,CAAC;IACNC,IAAI,EAAE,CAAC;IACPC,KAAK,EAAE,CAAC;IACRC,MAAM,EAAE,EAAE;IACVC,iBAAiB,EAAErB,CAAC,CAAC,EAAE,CAAC;IACxBsB,aAAa,EAAEtB,CAAC,CAAC,CAAC,CAAC;IACnBuB,aAAa,EAAE,KAAK;IACpBC,UAAU,EAAE,QAAQ;IACpBC,cAAc,EAAE;EAClB,CAAC;EACDlB,KAAK,EAAE;IACLmB,KAAK,EAAEvB,UAAU,CAACwB,KAAK;IACvBC,QAAQ,EAAE3B,EAAE,CAAC,EAAE,CAAC;IAChB4B,UAAU,EAAE3B,EAAE,CAAC4B,IAAI;IACnBC,aAAa,EAAE,GAAG;IAClBC,eAAe,EAAE7B,UAAU,CAAC8B,UAAU;IACtCC,gBAAgB,EAAE;MAAEC,KAAK,EAAE,CAAC;MAAEC,MAAM,EAAE;IAAE,CAAC;IACzCC,gBAAgB,EAAE;EACpB;AACF,CAAC,CAAC","ignoreList":[]}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
import { useCallback, useEffect, useRef, useState } from 'react';
|
|
4
4
|
import { Linking, StyleSheet, View } from 'react-native';
|
|
5
|
-
import { ThemeProvider, ToastHost
|
|
5
|
+
import { ThemeProvider, ToastHost } 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";
|
|
@@ -135,7 +135,8 @@ function ScannerInner({
|
|
|
135
135
|
const r = lastResultRef.current;
|
|
136
136
|
const p = product;
|
|
137
137
|
if (p && r) onConfirm?.(p, r);
|
|
138
|
-
toast
|
|
138
|
+
// 不在此 toast:确认页已展示结果,且 toast 是宿主职责(onConfirm 回调里宿主自己提示)——
|
|
139
|
+
// 避免重复 toast,也避免宿主导航离开后依赖 Scanner 自带 ToastHost 存活的隐患。
|
|
139
140
|
reset();
|
|
140
141
|
}, [product, onConfirm, reset]);
|
|
141
142
|
const showChrome = phase === 'scan' || phase === 'detecting';
|
|
@@ -154,22 +155,22 @@ function ScannerInner({
|
|
|
154
155
|
hintText: hintText
|
|
155
156
|
}), phase !== 'denied' && phase !== 'init' && /*#__PURE__*/_jsx(ScanTopBar, {
|
|
156
157
|
title: title,
|
|
157
|
-
topInset: topInset
|
|
158
|
-
|
|
159
|
-
}), showChrome && (showTorch || !!pickImage) && /*#__PURE__*/_jsx(ScanToolbar, {
|
|
158
|
+
topInset: topInset
|
|
159
|
+
}), showChrome && (showTorch || !!pickImage || !!onClose) && /*#__PURE__*/_jsx(ScanToolbar, {
|
|
160
160
|
flash: torch,
|
|
161
161
|
bottomInset: bottomInset,
|
|
162
162
|
onFlash: showTorch ? () => setTorch(t => !t) : undefined,
|
|
163
|
-
onAlbum: pickImage ? onAlbum : undefined
|
|
163
|
+
onAlbum: pickImage ? onAlbum : undefined,
|
|
164
|
+
onClose: onClose
|
|
164
165
|
}), phase === 'success' && product && /*#__PURE__*/_jsx(ResultFocus, {
|
|
165
166
|
product: product,
|
|
166
167
|
detectMs: detectMs,
|
|
167
168
|
bottomInset: bottomInset,
|
|
168
|
-
|
|
169
|
+
onRescan: reset,
|
|
169
170
|
onConfirm: onConfirmPress
|
|
170
171
|
}), phase === 'fail' && /*#__PURE__*/_jsx(ResultFail, {
|
|
171
172
|
bottomInset: bottomInset,
|
|
172
|
-
|
|
173
|
+
onRescan: reset
|
|
173
174
|
}), phase === 'denied' && /*#__PURE__*/_jsx(DeniedOverlay, {
|
|
174
175
|
onClose: onClose,
|
|
175
176
|
onSettings: () => Linking.openSettings()
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["useCallback","useEffect","useRef","useState","Linking","StyleSheet","View","ThemeProvider","ToastHost","
|
|
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","pickImage","phase","setPhase","torch","setTorch","product","setProduct","detectMs","setDetectMs","handlingRef","detectStartRef","lastResultRef","mountedRef","current","status","reset","finalize","result","resolved","name","value","barcode","Date","now","onCameraResult","results","first","onScanError","error","code","onAlbum","uri","undefined","onConfirmPress","r","p","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":[]}
|
|
@@ -6,8 +6,13 @@ import { Icon, useColors, r } from '@unif/react-native-design';
|
|
|
6
6
|
import { scanChrome } from "./scanChrome.js";
|
|
7
7
|
import { ScanHint } from "./ScanHint.js";
|
|
8
8
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
9
|
+
// 取景窗圆角半径——窗口本体、白描边、脉冲准星环三者必须一致,圆角才严丝合缝。
|
|
10
|
+
const WINDOW_RADIUS = r(22);
|
|
11
|
+
|
|
9
12
|
// 聚焦款取景:圆角窗 + 白描边 + 主题主色脉冲准星环 + 中心十字(design 的 scan 图标)。
|
|
10
|
-
//
|
|
13
|
+
// 窗外暗化用窗口自身一圈超大 spread 的 boxShadow(blur 0 → 硬边纯色,向四周铺满主题 scrim)。
|
|
14
|
+
// 这样「洞」直接带圆角、与圆角描边对齐;旧版用「上/中(左+窗+右)/下」三段挖的是矩形洞,
|
|
15
|
+
// 四角会漏出未暗化的实景三角、与圆角描边错位(即「框四周没 radius」的观感来源)。
|
|
11
16
|
export function Viewfinder({
|
|
12
17
|
size,
|
|
13
18
|
detecting,
|
|
@@ -53,48 +58,44 @@ export function Viewfinder({
|
|
|
53
58
|
reticle.stop();
|
|
54
59
|
};
|
|
55
60
|
}, [detecting, scale, pulse]);
|
|
56
|
-
const scrim = {
|
|
57
|
-
backgroundColor: c.scrim
|
|
58
|
-
};
|
|
59
61
|
return /*#__PURE__*/_jsxs(View, {
|
|
60
62
|
style: styles.overlay,
|
|
61
63
|
pointerEvents: "none",
|
|
62
64
|
children: [/*#__PURE__*/_jsx(View, {
|
|
63
|
-
style:
|
|
64
|
-
}), /*#__PURE__*/_jsxs(View, {
|
|
65
|
-
style: [styles.
|
|
66
|
-
|
|
65
|
+
style: styles.spacerTop
|
|
66
|
+
}), /*#__PURE__*/_jsxs(Animated.View, {
|
|
67
|
+
style: [styles.window, {
|
|
68
|
+
width: size,
|
|
69
|
+
height: windowH,
|
|
70
|
+
transform: [{
|
|
71
|
+
scale
|
|
72
|
+
}],
|
|
73
|
+
// spread 铺满全屏的纯色硬边阴影 = 圆角洞之外的暗化遮罩(blur 0 → 不晕开)。
|
|
74
|
+
boxShadow: [{
|
|
75
|
+
offsetX: 0,
|
|
76
|
+
offsetY: 0,
|
|
77
|
+
blurRadius: 0,
|
|
78
|
+
spreadDistance: 9999,
|
|
79
|
+
color: c.scrim
|
|
80
|
+
}]
|
|
67
81
|
}],
|
|
68
82
|
children: [/*#__PURE__*/_jsx(View, {
|
|
69
|
-
style:
|
|
70
|
-
}), /*#__PURE__*/
|
|
71
|
-
style: {
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
scale
|
|
76
|
-
}]
|
|
77
|
-
},
|
|
78
|
-
children: [/*#__PURE__*/_jsx(View, {
|
|
79
|
-
style: styles.windowBorder
|
|
80
|
-
}), /*#__PURE__*/_jsx(Animated.View, {
|
|
81
|
-
style: [styles.reticle, {
|
|
82
|
-
borderColor: c.primary,
|
|
83
|
-
opacity: pulse
|
|
84
|
-
}]
|
|
85
|
-
}), /*#__PURE__*/_jsx(View, {
|
|
86
|
-
style: styles.crosshair,
|
|
87
|
-
children: /*#__PURE__*/_jsx(Icon, {
|
|
88
|
-
name: "scan",
|
|
89
|
-
size: r(30),
|
|
90
|
-
color: scanChrome.crosshair
|
|
91
|
-
})
|
|
92
|
-
})]
|
|
83
|
+
style: styles.windowBorder
|
|
84
|
+
}), /*#__PURE__*/_jsx(Animated.View, {
|
|
85
|
+
style: [styles.reticle, {
|
|
86
|
+
borderColor: c.primary,
|
|
87
|
+
opacity: pulse
|
|
88
|
+
}]
|
|
93
89
|
}), /*#__PURE__*/_jsx(View, {
|
|
94
|
-
style:
|
|
90
|
+
style: styles.crosshair,
|
|
91
|
+
children: /*#__PURE__*/_jsx(Icon, {
|
|
92
|
+
name: "scan",
|
|
93
|
+
size: r(30),
|
|
94
|
+
color: scanChrome.crosshair
|
|
95
|
+
})
|
|
95
96
|
})]
|
|
96
97
|
}), /*#__PURE__*/_jsx(View, {
|
|
97
|
-
style:
|
|
98
|
+
style: styles.spacerBottom,
|
|
98
99
|
children: /*#__PURE__*/_jsx(ScanHint, {
|
|
99
100
|
detecting: detecting,
|
|
100
101
|
text: hintText
|
|
@@ -109,21 +110,18 @@ const styles = StyleSheet.create({
|
|
|
109
110
|
left: 0,
|
|
110
111
|
right: 0,
|
|
111
112
|
bottom: 0,
|
|
112
|
-
zIndex: 15
|
|
113
|
+
zIndex: 15,
|
|
114
|
+
alignItems: 'center'
|
|
113
115
|
},
|
|
114
|
-
|
|
115
|
-
scrimTop: {
|
|
116
|
+
spacerTop: {
|
|
116
117
|
flex: 1
|
|
117
118
|
},
|
|
118
|
-
|
|
119
|
+
spacerBottom: {
|
|
119
120
|
flex: 1.35,
|
|
120
121
|
alignItems: 'center'
|
|
121
122
|
},
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
},
|
|
125
|
-
scrimSide: {
|
|
126
|
-
flex: 1
|
|
123
|
+
window: {
|
|
124
|
+
borderRadius: WINDOW_RADIUS
|
|
127
125
|
},
|
|
128
126
|
windowBorder: {
|
|
129
127
|
position: 'absolute',
|
|
@@ -131,7 +129,7 @@ const styles = StyleSheet.create({
|
|
|
131
129
|
left: 0,
|
|
132
130
|
right: 0,
|
|
133
131
|
bottom: 0,
|
|
134
|
-
borderRadius:
|
|
132
|
+
borderRadius: WINDOW_RADIUS,
|
|
135
133
|
borderWidth: 1.5,
|
|
136
134
|
borderColor: scanChrome.windowBorder
|
|
137
135
|
},
|
|
@@ -141,7 +139,7 @@ const styles = StyleSheet.create({
|
|
|
141
139
|
left: 0,
|
|
142
140
|
right: 0,
|
|
143
141
|
bottom: 0,
|
|
144
|
-
borderRadius:
|
|
142
|
+
borderRadius: WINDOW_RADIUS,
|
|
145
143
|
borderWidth: 2
|
|
146
144
|
},
|
|
147
145
|
crosshair: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["useEffect","useRef","Animated","Easing","StyleSheet","View","Icon","useColors","r","scanChrome","ScanHint","jsx","_jsx","jsxs","_jsxs","Viewfinder","size","detecting","hintText","c","windowH","Math","round","scale","Value","current","pulse","setValue","ease","inOut","breathe","loop","sequence","timing","toValue","duration","easing","useNativeDriver","reticle","start","stop","
|
|
1
|
+
{"version":3,"names":["useEffect","useRef","Animated","Easing","StyleSheet","View","Icon","useColors","r","scanChrome","ScanHint","jsx","_jsx","jsxs","_jsxs","WINDOW_RADIUS","Viewfinder","size","detecting","hintText","c","windowH","Math","round","scale","Value","current","pulse","setValue","ease","inOut","breathe","loop","sequence","timing","toValue","duration","easing","useNativeDriver","reticle","start","stop","style","styles","overlay","pointerEvents","children","spacerTop","window","width","height","transform","boxShadow","offsetX","offsetY","blurRadius","spreadDistance","color","scrim","windowBorder","borderColor","primary","opacity","crosshair","name","spacerBottom","text","create","position","top","left","right","bottom","zIndex","alignItems","flex","borderRadius","borderWidth","marginTop","marginLeft","justifyContent"],"sourceRoot":"../../../src","sources":["Scanner/Viewfinder.tsx"],"mappings":"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","ignoreList":[]}
|
package/lib/module/index.js
CHANGED
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
// @unif/react-native-hms-scan —— 华为 HMS 统一扫码服务 RN bridge(Fabric 新架构)
|
|
4
4
|
// 能力:定制视图扫码(底层 <HmsScanView> + 成品 <Scanner> 扫一扫页)+ 图片识别(decodeImage)+ 相机权限。
|
|
5
5
|
// 0.2.1:package.json#files 补 scripts/,修 pod install 缺 prepare-scankit-xcframework.sh(podspec prepare_command 调用)。
|
|
6
|
+
// 文档站:https://unif-design.github.io/react-native-hms-scan/(版本随发版自动部署)。
|
|
6
7
|
|
|
7
8
|
// ── 类型与常量 ──
|
|
8
9
|
export { ALL_BARCODE_FORMATS, HmsScanError } from "./types.js";
|
package/lib/module/index.js.map
CHANGED
|
@@ -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;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,7 +1,8 @@
|
|
|
1
1
|
interface ResultFailProps {
|
|
2
2
|
bottomInset: number;
|
|
3
|
-
|
|
3
|
+
/** 重扫:回到取景重新扫描。(退出扫码页是外层工具栏「返回」的事。) */
|
|
4
|
+
onRescan: () => void;
|
|
4
5
|
}
|
|
5
|
-
export declare function ResultFail({ bottomInset,
|
|
6
|
+
export declare function ResultFail({ bottomInset, onRescan }: ResultFailProps): import("react/jsx-runtime").JSX.Element;
|
|
6
7
|
export {};
|
|
7
8
|
//# sourceMappingURL=ResultFail.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ResultFail.d.ts","sourceRoot":"","sources":["../../../../src/Scanner/ResultFail.tsx"],"names":[],"mappings":"AAWA,UAAU,eAAe;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,
|
|
1
|
+
{"version":3,"file":"ResultFail.d.ts","sourceRoot":"","sources":["../../../../src/Scanner/ResultFail.tsx"],"names":[],"mappings":"AAWA,UAAU,eAAe;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,uCAAuC;IACvC,QAAQ,EAAE,MAAM,IAAI,CAAC;CACtB;AAID,wBAAgB,UAAU,CAAC,EAAE,WAAW,EAAE,QAAQ,EAAE,EAAE,eAAe,2CAyBpE"}
|
|
@@ -4,9 +4,11 @@ interface ResultFocusProps {
|
|
|
4
4
|
/** 识别耗时(ms),用于 "已识别 · 0.6s"。<=0 则只显示 "已识别"。 */
|
|
5
5
|
detectMs: number;
|
|
6
6
|
bottomInset: number;
|
|
7
|
-
|
|
7
|
+
/** 重扫:放弃本次结果,回到取景重新扫描。(退出扫码页是外层工具栏「返回」的事。) */
|
|
8
|
+
onRescan: () => void;
|
|
9
|
+
/** 确定:确认本次结果并带回上一级。 */
|
|
8
10
|
onConfirm: () => void;
|
|
9
11
|
}
|
|
10
|
-
export declare function ResultFocus({ product, detectMs, bottomInset,
|
|
12
|
+
export declare function ResultFocus({ product, detectMs, bottomInset, onRescan, onConfirm, }: ResultFocusProps): import("react/jsx-runtime").JSX.Element;
|
|
11
13
|
export {};
|
|
12
14
|
//# sourceMappingURL=ResultFocus.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
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,
|
|
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,2CAgElB"}
|
|
@@ -5,7 +5,9 @@ interface ScanToolbarProps {
|
|
|
5
5
|
onFlash?: () => void;
|
|
6
6
|
/** 不传则不显示相册按钮(库不内置图片选择器,需宿主提供 pickImage)。 */
|
|
7
7
|
onAlbum?: () => void;
|
|
8
|
+
/** 返回按钮(退出扫码页,与手电筒并排);不传则不显示。 */
|
|
9
|
+
onClose?: () => void;
|
|
8
10
|
}
|
|
9
|
-
export declare function ScanToolbar({ flash, bottomInset, onFlash, onAlbum }: ScanToolbarProps): import("react/jsx-runtime").JSX.Element;
|
|
11
|
+
export declare function ScanToolbar({ flash, bottomInset, onFlash, onAlbum, onClose, }: ScanToolbarProps): import("react/jsx-runtime").JSX.Element;
|
|
10
12
|
export {};
|
|
11
13
|
//# sourceMappingURL=ScanToolbar.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ScanToolbar.d.ts","sourceRoot":"","sources":["../../../../src/Scanner/ScanToolbar.tsx"],"names":[],"mappings":"AAIA,UAAU,gBAAgB;IACxB,KAAK,EAAE,OAAO,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,mBAAmB;IACnB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,6CAA6C;IAC7C,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB;AAGD,wBAAgB,WAAW,CAAC,
|
|
1
|
+
{"version":3,"file":"ScanToolbar.d.ts","sourceRoot":"","sources":["../../../../src/Scanner/ScanToolbar.tsx"],"names":[],"mappings":"AAIA,UAAU,gBAAgB;IACxB,KAAK,EAAE,OAAO,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,mBAAmB;IACnB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,6CAA6C;IAC7C,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,iCAAiC;IACjC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB;AAGD,wBAAgB,WAAW,CAAC,EAC1B,KAAK,EACL,WAAW,EACX,OAAO,EACP,OAAO,EACP,OAAO,GACR,EAAE,gBAAgB,2CAgBlB"}
|
|
@@ -1,10 +1,7 @@
|
|
|
1
|
-
import type { ReactNode } from 'react';
|
|
2
1
|
interface ScanTopBarProps {
|
|
3
2
|
title: string;
|
|
4
3
|
topInset: number;
|
|
5
|
-
onClose?: () => void;
|
|
6
|
-
trailing?: ReactNode;
|
|
7
4
|
}
|
|
8
|
-
export declare function ScanTopBar({ title, topInset
|
|
5
|
+
export declare function ScanTopBar({ title, topInset }: ScanTopBarProps): import("react/jsx-runtime").JSX.Element;
|
|
9
6
|
export {};
|
|
10
7
|
//# sourceMappingURL=ScanTopBar.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ScanTopBar.d.ts","sourceRoot":"","sources":["../../../../src/Scanner/ScanTopBar.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ScanTopBar.d.ts","sourceRoot":"","sources":["../../../../src/Scanner/ScanTopBar.tsx"],"names":[],"mappings":"AAIA,UAAU,eAAe;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;CAClB;AAID,wBAAgB,UAAU,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,eAAe,2CAM9D"}
|
|
@@ -12,7 +12,7 @@ export interface ScannerProps {
|
|
|
12
12
|
bottomInset?: number;
|
|
13
13
|
/** 是否显示手电筒按钮,默认 true。手电由库内自管(Android 可用;iOS 为 best-effort,可在 iOS 上关掉)。 */
|
|
14
14
|
showTorch?: boolean;
|
|
15
|
-
/**
|
|
15
|
+
/** 返回回调(退出扫码页,回到上一级);按钮在底部工具栏,与手电筒并排。 */
|
|
16
16
|
onClose?: () => void;
|
|
17
17
|
/**
|
|
18
18
|
* 扫到条码后由宿主解析商品信息(用于浮层确认卡)。
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Scanner.d.ts","sourceRoot":"","sources":["../../../../src/Scanner/Scanner.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAcvE,MAAM,WAAW,YAAY;IAC3B,qBAAqB;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,sBAAsB;IACtB,OAAO,CAAC,EAAE,aAAa,EAAE,CAAC;IAC1B,eAAe;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,oEAAoE;IACpE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,oBAAoB;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,0EAA0E;IAC1E,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,
|
|
1
|
+
{"version":3,"file":"Scanner.d.ts","sourceRoot":"","sources":["../../../../src/Scanner/Scanner.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAcvE,MAAM,WAAW,YAAY;IAC3B,qBAAqB;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,sBAAsB;IACtB,OAAO,CAAC,EAAE,aAAa,EAAE,CAAC;IAC1B,eAAe;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,oEAAoE;IACpE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,oBAAoB;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,0EAA0E;IAC1E,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,yCAAyC;IACzC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB;;;OAGG;IACH,cAAc,CAAC,EAAE,CACf,MAAM,EAAE,UAAU,KACf,WAAW,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC;IAC9E,oCAAoC;IACpC,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,KAAK,IAAI,CAAC;IAC/D;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;CAC1C;AAED;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,YAAY,2CAO1C"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Viewfinder.d.ts","sourceRoot":"","sources":["../../../../src/Scanner/Viewfinder.tsx"],"names":[],"mappings":"AAMA,UAAU,eAAe;IACvB,kCAAkC;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,8BAA8B;IAC9B,SAAS,EAAE,OAAO,CAAC;IACnB,eAAe;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB;
|
|
1
|
+
{"version":3,"file":"Viewfinder.d.ts","sourceRoot":"","sources":["../../../../src/Scanner/Viewfinder.tsx"],"names":[],"mappings":"AAMA,UAAU,eAAe;IACvB,kCAAkC;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,8BAA8B;IAC9B,SAAS,EAAE,OAAO,CAAC;IACnB,eAAe;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB;AASD,wBAAgB,UAAU,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,eAAe,2CAkExE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.tsx"],"names":[],"mappings":"AAMA,OAAO,EACL,mBAAmB,EACnB,YAAY,GACb,MAAM,SAAS,CAAC;AACjB,YAAY,EACV,aAAa,EACb,kBAAkB,EAClB,eAAe,EACf,UAAU,EACV,kBAAkB,EAClB,sBAAsB,EACtB,gBAAgB,EAChB,WAAW,GACZ,MAAM,SAAS,CAAC;AAGjB,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAGzE,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,YAAY,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAGnE,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAG5C,OAAO,EAAE,yBAAyB,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AAGnF,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,YAAY,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@unif/react-native-hms-scan",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
4
4
|
"description": "华为 HMS 统一扫码服务 React Native bridge:定制视图扫码 + 图片识别 (Scan SDK-Plus / ScanKitFrameWork,@unif 私有)",
|
|
5
5
|
"main": "./lib/module/index.js",
|
|
6
6
|
"types": "./lib/typescript/src/index.d.ts",
|
|
@@ -82,7 +82,7 @@
|
|
|
82
82
|
"@types/jest": "^29.5.0",
|
|
83
83
|
"@types/react": "^19.2.0",
|
|
84
84
|
"@types/react-test-renderer": "^19",
|
|
85
|
-
"@unif/react-native-design": "0.
|
|
85
|
+
"@unif/react-native-design": "0.8.0",
|
|
86
86
|
"commitlint": "^20.5.0",
|
|
87
87
|
"del-cli": "^7.0.0",
|
|
88
88
|
"eslint": "^9.39.4",
|
|
@@ -108,7 +108,7 @@
|
|
|
108
108
|
"peerDependencies": {
|
|
109
109
|
"@gorhom/bottom-sheet": ">=5",
|
|
110
110
|
"@sbaiahmed1/react-native-blur": ">=4",
|
|
111
|
-
"@unif/react-native-design": ">=0.
|
|
111
|
+
"@unif/react-native-design": ">=0.8.0",
|
|
112
112
|
"react": ">=19.0.0",
|
|
113
113
|
"react-native": ">=0.80.0",
|
|
114
114
|
"react-native-gesture-handler": ">=2.21.0",
|
|
@@ -11,12 +11,13 @@ import {
|
|
|
11
11
|
|
|
12
12
|
interface ResultFailProps {
|
|
13
13
|
bottomInset: number;
|
|
14
|
-
|
|
14
|
+
/** 重扫:回到取景重新扫描。(退出扫码页是外层工具栏「返回」的事。) */
|
|
15
|
+
onRescan: () => void;
|
|
15
16
|
}
|
|
16
17
|
|
|
17
|
-
// 未识别失败的底部弹层:design 的 Empty(error-alert)+ Button
|
|
18
|
+
// 未识别失败的底部弹层:design 的 Empty(error-alert)+ Button(重扫)。
|
|
18
19
|
// 聚焦款不加背景遮罩,与浮层确认卡保持一致。
|
|
19
|
-
export function ResultFail({ bottomInset,
|
|
20
|
+
export function ResultFail({ bottomInset, onRescan }: ResultFailProps) {
|
|
20
21
|
const s = useThemedStyles(makeStyles);
|
|
21
22
|
const anim = useRef(new Animated.Value(0)).current;
|
|
22
23
|
useEffect(() => {
|
|
@@ -37,7 +38,7 @@ export function ResultFail({ bottomInset, onRetry }: ResultFailProps) {
|
|
|
37
38
|
title="未识别到条码"
|
|
38
39
|
desc="请将条码完整置于框内、保持平整并对准光线后重试。"
|
|
39
40
|
/>
|
|
40
|
-
<Button label="
|
|
41
|
+
<Button label="重扫" variant="primary" block onPress={onRescan} />
|
|
41
42
|
</View>
|
|
42
43
|
</Animated.View>
|
|
43
44
|
);
|
|
@@ -19,7 +19,9 @@ interface ResultFocusProps {
|
|
|
19
19
|
/** 识别耗时(ms),用于 "已识别 · 0.6s"。<=0 则只显示 "已识别"。 */
|
|
20
20
|
detectMs: number;
|
|
21
21
|
bottomInset: number;
|
|
22
|
-
|
|
22
|
+
/** 重扫:放弃本次结果,回到取景重新扫描。(退出扫码页是外层工具栏「返回」的事。) */
|
|
23
|
+
onRescan: () => void;
|
|
24
|
+
/** 确定:确认本次结果并带回上一级。 */
|
|
23
25
|
onConfirm: () => void;
|
|
24
26
|
}
|
|
25
27
|
|
|
@@ -28,7 +30,7 @@ export function ResultFocus({
|
|
|
28
30
|
product,
|
|
29
31
|
detectMs,
|
|
30
32
|
bottomInset,
|
|
31
|
-
|
|
33
|
+
onRescan,
|
|
32
34
|
onConfirm,
|
|
33
35
|
}: ResultFocusProps) {
|
|
34
36
|
const c = useColors();
|
|
@@ -86,10 +88,10 @@ export function ResultFocus({
|
|
|
86
88
|
)}
|
|
87
89
|
</View>
|
|
88
90
|
|
|
89
|
-
{/*
|
|
91
|
+
{/* 操作:重扫(回取景)· 确定(确认带回) */}
|
|
90
92
|
<View style={styles.actions}>
|
|
91
|
-
<Button label="
|
|
92
|
-
<Button label="
|
|
93
|
+
<Button label="重扫" variant="secondary" onPress={onRescan} style={styles.btn} />
|
|
94
|
+
<Button label="确定" variant="primary" onPress={onConfirm} style={styles.btn} />
|
|
93
95
|
</View>
|
|
94
96
|
</Card>
|
|
95
97
|
</Animated.View>
|
|
@@ -9,13 +9,22 @@ interface ScanToolbarProps {
|
|
|
9
9
|
onFlash?: () => void;
|
|
10
10
|
/** 不传则不显示相册按钮(库不内置图片选择器,需宿主提供 pickImage)。 */
|
|
11
11
|
onAlbum?: () => void;
|
|
12
|
+
/** 返回按钮(退出扫码页,与手电筒并排);不传则不显示。 */
|
|
13
|
+
onClose?: () => void;
|
|
12
14
|
}
|
|
13
15
|
|
|
14
|
-
//
|
|
15
|
-
export function ScanToolbar({
|
|
16
|
+
// 底部工具栏:返回 · 手电筒 · 相册。点亮态用主题主色。
|
|
17
|
+
export function ScanToolbar({
|
|
18
|
+
flash,
|
|
19
|
+
bottomInset,
|
|
20
|
+
onFlash,
|
|
21
|
+
onAlbum,
|
|
22
|
+
onClose,
|
|
23
|
+
}: ScanToolbarProps) {
|
|
16
24
|
const c = useColors();
|
|
17
25
|
return (
|
|
18
26
|
<View style={[styles.bar, { bottom: bottomInset + r(50) }]} pointerEvents="box-none">
|
|
27
|
+
{onClose && <ToolbarItem icon="undo" label="返回" onPress={onClose} />}
|
|
19
28
|
{onFlash && (
|
|
20
29
|
<ToolbarItem
|
|
21
30
|
icon={flash ? 'flash-on' : 'flash-off'}
|
|
@@ -1,33 +1,18 @@
|
|
|
1
|
-
import
|
|
2
|
-
import {
|
|
3
|
-
import { Icon, r, rf, fw } from '@unif/react-native-design';
|
|
1
|
+
import { StyleSheet, Text, View } from 'react-native';
|
|
2
|
+
import { r, rf, fw } from '@unif/react-native-design';
|
|
4
3
|
import { scanChrome } from './scanChrome';
|
|
5
4
|
|
|
6
5
|
interface ScanTopBarProps {
|
|
7
6
|
title: string;
|
|
8
7
|
topInset: number;
|
|
9
|
-
onClose?: () => void;
|
|
10
|
-
trailing?: ReactNode;
|
|
11
8
|
}
|
|
12
9
|
|
|
13
|
-
//
|
|
14
|
-
//
|
|
15
|
-
export function ScanTopBar({ title, topInset
|
|
10
|
+
// 顶栏:仅居中标题。关闭键已移到底部工具栏,与手电筒并排(见 ScanToolbar)。
|
|
11
|
+
// 叠在深色相机预览之上,故文字恒为白(不随主题)。
|
|
12
|
+
export function ScanTopBar({ title, topInset }: ScanTopBarProps) {
|
|
16
13
|
return (
|
|
17
14
|
<View style={[styles.bar, { paddingTop: topInset }]} pointerEvents="box-none">
|
|
18
|
-
<Pressable
|
|
19
|
-
onPress={onClose}
|
|
20
|
-
hitSlop={8}
|
|
21
|
-
accessibilityRole="button"
|
|
22
|
-
accessibilityLabel="关闭"
|
|
23
|
-
style={({ pressed }) => [styles.disc, pressed && styles.pressed]}
|
|
24
|
-
>
|
|
25
|
-
<Icon name="close" size={r(20)} color={scanChrome.white} />
|
|
26
|
-
</Pressable>
|
|
27
|
-
|
|
28
15
|
<Text style={styles.title}>{title}</Text>
|
|
29
|
-
|
|
30
|
-
<View style={styles.trailing}>{trailing}</View>
|
|
31
16
|
</View>
|
|
32
17
|
);
|
|
33
18
|
}
|
|
@@ -43,19 +28,8 @@ const styles = StyleSheet.create({
|
|
|
43
28
|
paddingBottom: r(8),
|
|
44
29
|
flexDirection: 'row',
|
|
45
30
|
alignItems: 'center',
|
|
46
|
-
justifyContent: 'space-between',
|
|
47
|
-
},
|
|
48
|
-
disc: {
|
|
49
|
-
width: r(38),
|
|
50
|
-
height: r(38),
|
|
51
|
-
borderRadius: 999,
|
|
52
|
-
alignItems: 'center',
|
|
53
31
|
justifyContent: 'center',
|
|
54
|
-
backgroundColor: scanChrome.glassDisc,
|
|
55
|
-
borderWidth: StyleSheet.hairlineWidth,
|
|
56
|
-
borderColor: scanChrome.glassBorder,
|
|
57
32
|
},
|
|
58
|
-
pressed: { opacity: 0.6 },
|
|
59
33
|
title: {
|
|
60
34
|
color: scanChrome.white,
|
|
61
35
|
fontSize: rf(16),
|
|
@@ -65,10 +39,4 @@ const styles = StyleSheet.create({
|
|
|
65
39
|
textShadowOffset: { width: 0, height: 1 },
|
|
66
40
|
textShadowRadius: 6,
|
|
67
41
|
},
|
|
68
|
-
trailing: {
|
|
69
|
-
width: r(38),
|
|
70
|
-
height: r(38),
|
|
71
|
-
alignItems: 'center',
|
|
72
|
-
justifyContent: 'center',
|
|
73
|
-
},
|
|
74
42
|
});
|
package/src/Scanner/Scanner.tsx
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { useCallback, useEffect, useRef, useState } from 'react';
|
|
2
2
|
import { Linking, StyleSheet, View } from 'react-native';
|
|
3
|
-
import { ThemeProvider, ToastHost
|
|
3
|
+
import { ThemeProvider, ToastHost } from '@unif/react-native-design';
|
|
4
4
|
import { HmsScanView } from '../HmsScanView';
|
|
5
5
|
import { decodeImage } from '../decodeImage';
|
|
6
6
|
import {
|
|
@@ -34,7 +34,7 @@ export interface ScannerProps {
|
|
|
34
34
|
bottomInset?: number;
|
|
35
35
|
/** 是否显示手电筒按钮,默认 true。手电由库内自管(Android 可用;iOS 为 best-effort,可在 iOS 上关掉)。 */
|
|
36
36
|
showTorch?: boolean;
|
|
37
|
-
/**
|
|
37
|
+
/** 返回回调(退出扫码页,回到上一级);按钮在底部工具栏,与手电筒并排。 */
|
|
38
38
|
onClose?: () => void;
|
|
39
39
|
/**
|
|
40
40
|
* 扫到条码后由宿主解析商品信息(用于浮层确认卡)。
|
|
@@ -181,7 +181,8 @@ function ScannerInner({
|
|
|
181
181
|
const r = lastResultRef.current;
|
|
182
182
|
const p = product;
|
|
183
183
|
if (p && r) onConfirm?.(p, r);
|
|
184
|
-
toast
|
|
184
|
+
// 不在此 toast:确认页已展示结果,且 toast 是宿主职责(onConfirm 回调里宿主自己提示)——
|
|
185
|
+
// 避免重复 toast,也避免宿主导航离开后依赖 Scanner 自带 ToastHost 存活的隐患。
|
|
185
186
|
reset();
|
|
186
187
|
}, [product, onConfirm, reset]);
|
|
187
188
|
|
|
@@ -205,15 +206,16 @@ function ScannerInner({
|
|
|
205
206
|
)}
|
|
206
207
|
|
|
207
208
|
{phase !== 'denied' && phase !== 'init' && (
|
|
208
|
-
<ScanTopBar title={title} topInset={topInset}
|
|
209
|
+
<ScanTopBar title={title} topInset={topInset} />
|
|
209
210
|
)}
|
|
210
211
|
|
|
211
|
-
{showChrome && (showTorch || !!pickImage) && (
|
|
212
|
+
{showChrome && (showTorch || !!pickImage || !!onClose) && (
|
|
212
213
|
<ScanToolbar
|
|
213
214
|
flash={torch}
|
|
214
215
|
bottomInset={bottomInset}
|
|
215
216
|
onFlash={showTorch ? () => setTorch((t) => !t) : undefined}
|
|
216
217
|
onAlbum={pickImage ? onAlbum : undefined}
|
|
218
|
+
onClose={onClose}
|
|
217
219
|
/>
|
|
218
220
|
)}
|
|
219
221
|
|
|
@@ -222,12 +224,12 @@ function ScannerInner({
|
|
|
222
224
|
product={product}
|
|
223
225
|
detectMs={detectMs}
|
|
224
226
|
bottomInset={bottomInset}
|
|
225
|
-
|
|
227
|
+
onRescan={reset}
|
|
226
228
|
onConfirm={onConfirmPress}
|
|
227
229
|
/>
|
|
228
230
|
)}
|
|
229
231
|
|
|
230
|
-
{phase === 'fail' && <ResultFail bottomInset={bottomInset}
|
|
232
|
+
{phase === 'fail' && <ResultFail bottomInset={bottomInset} onRescan={reset} />}
|
|
231
233
|
|
|
232
234
|
{phase === 'denied' && (
|
|
233
235
|
<DeniedOverlay onClose={onClose} onSettings={() => Linking.openSettings()} />
|
|
@@ -13,8 +13,13 @@ interface ViewfinderProps {
|
|
|
13
13
|
hintText: string;
|
|
14
14
|
}
|
|
15
15
|
|
|
16
|
+
// 取景窗圆角半径——窗口本体、白描边、脉冲准星环三者必须一致,圆角才严丝合缝。
|
|
17
|
+
const WINDOW_RADIUS = r(22);
|
|
18
|
+
|
|
16
19
|
// 聚焦款取景:圆角窗 + 白描边 + 主题主色脉冲准星环 + 中心十字(design 的 scan 图标)。
|
|
17
|
-
//
|
|
20
|
+
// 窗外暗化用窗口自身一圈超大 spread 的 boxShadow(blur 0 → 硬边纯色,向四周铺满主题 scrim)。
|
|
21
|
+
// 这样「洞」直接带圆角、与圆角描边对齐;旧版用「上/中(左+窗+右)/下」三段挖的是矩形洞,
|
|
22
|
+
// 四角会漏出未暗化的实景三角、与圆角描边错位(即「框四周没 radius」的观感来源)。
|
|
18
23
|
export function Viewfinder({ size, detecting, hintText }: ViewfinderProps) {
|
|
19
24
|
const c = useColors();
|
|
20
25
|
const windowH = Math.round(size * 0.82);
|
|
@@ -48,27 +53,35 @@ export function Viewfinder({ size, detecting, hintText }: ViewfinderProps) {
|
|
|
48
53
|
};
|
|
49
54
|
}, [detecting, scale, pulse]);
|
|
50
55
|
|
|
51
|
-
const scrim = { backgroundColor: c.scrim };
|
|
52
|
-
|
|
53
56
|
return (
|
|
54
57
|
<View style={styles.overlay} pointerEvents="none">
|
|
55
|
-
|
|
58
|
+
{/* 上:下 = 1:1.35,使取景窗略高于屏幕中线 */}
|
|
59
|
+
<View style={styles.spacerTop} />
|
|
56
60
|
|
|
57
|
-
<View
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
61
|
+
<Animated.View
|
|
62
|
+
style={[
|
|
63
|
+
styles.window,
|
|
64
|
+
{
|
|
65
|
+
width: size,
|
|
66
|
+
height: windowH,
|
|
67
|
+
transform: [{ scale }],
|
|
68
|
+
// spread 铺满全屏的纯色硬边阴影 = 圆角洞之外的暗化遮罩(blur 0 → 不晕开)。
|
|
69
|
+
boxShadow: [
|
|
70
|
+
{ offsetX: 0, offsetY: 0, blurRadius: 0, spreadDistance: 9999, color: c.scrim },
|
|
71
|
+
],
|
|
72
|
+
},
|
|
73
|
+
]}
|
|
74
|
+
>
|
|
75
|
+
<View style={styles.windowBorder} />
|
|
76
|
+
<Animated.View
|
|
77
|
+
style={[styles.reticle, { borderColor: c.primary, opacity: pulse }]}
|
|
78
|
+
/>
|
|
79
|
+
<View style={styles.crosshair}>
|
|
80
|
+
<Icon name="scan" size={r(30)} color={scanChrome.crosshair} />
|
|
81
|
+
</View>
|
|
82
|
+
</Animated.View>
|
|
70
83
|
|
|
71
|
-
<View style={
|
|
84
|
+
<View style={styles.spacerBottom}>
|
|
72
85
|
<ScanHint detecting={detecting} text={hintText} />
|
|
73
86
|
</View>
|
|
74
87
|
</View>
|
|
@@ -76,19 +89,25 @@ export function Viewfinder({ size, detecting, hintText }: ViewfinderProps) {
|
|
|
76
89
|
}
|
|
77
90
|
|
|
78
91
|
const styles = StyleSheet.create({
|
|
79
|
-
overlay: {
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
92
|
+
overlay: {
|
|
93
|
+
position: 'absolute',
|
|
94
|
+
top: 0,
|
|
95
|
+
left: 0,
|
|
96
|
+
right: 0,
|
|
97
|
+
bottom: 0,
|
|
98
|
+
zIndex: 15,
|
|
99
|
+
alignItems: 'center',
|
|
100
|
+
},
|
|
101
|
+
spacerTop: { flex: 1 },
|
|
102
|
+
spacerBottom: { flex: 1.35, alignItems: 'center' },
|
|
103
|
+
window: { borderRadius: WINDOW_RADIUS },
|
|
85
104
|
windowBorder: {
|
|
86
105
|
position: 'absolute',
|
|
87
106
|
top: 0,
|
|
88
107
|
left: 0,
|
|
89
108
|
right: 0,
|
|
90
109
|
bottom: 0,
|
|
91
|
-
borderRadius:
|
|
110
|
+
borderRadius: WINDOW_RADIUS,
|
|
92
111
|
borderWidth: 1.5,
|
|
93
112
|
borderColor: scanChrome.windowBorder,
|
|
94
113
|
},
|
|
@@ -98,7 +117,7 @@ const styles = StyleSheet.create({
|
|
|
98
117
|
left: 0,
|
|
99
118
|
right: 0,
|
|
100
119
|
bottom: 0,
|
|
101
|
-
borderRadius:
|
|
120
|
+
borderRadius: WINDOW_RADIUS,
|
|
102
121
|
borderWidth: 2,
|
|
103
122
|
},
|
|
104
123
|
crosshair: {
|
package/src/index.tsx
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
// @unif/react-native-hms-scan —— 华为 HMS 统一扫码服务 RN bridge(Fabric 新架构)
|
|
2
2
|
// 能力:定制视图扫码(底层 <HmsScanView> + 成品 <Scanner> 扫一扫页)+ 图片识别(decodeImage)+ 相机权限。
|
|
3
3
|
// 0.2.1:package.json#files 补 scripts/,修 pod install 缺 prepare-scankit-xcframework.sh(podspec prepare_command 调用)。
|
|
4
|
+
// 文档站:https://unif-design.github.io/react-native-hms-scan/(版本随发版自动部署)。
|
|
4
5
|
|
|
5
6
|
// ── 类型与常量 ──
|
|
6
7
|
export {
|