@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 @@
1
+ {"version":3,"names":["ALL_BARCODE_FORMATS","HmsScanError","Error","constructor","code","message","name","Object","setPrototypeOf","prototype"],"sourceRoot":"../../src","sources":["types.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAkBA;AACA,OAAO,MAAMA,mBAA6C,GAAG,CAC3D,SAAS,EACT,OAAO,EACP,aAAa,EACb,QAAQ,EACR,SAAS,EACT,SAAS,EACT,SAAS,EACT,UAAU,EACV,OAAO,EACP,QAAQ,EACR,OAAO,EACP,OAAO,EACP,OAAO,EACP,kBAAkB,CACV;;AAEV;AACA;AACA;AACA;;AAgBA;;AAMA;;AAYA;;AAMA;;AAOA;;AAUA;AACA,OAAO,MAAMC,YAAY,SAASC,KAAK,CAAC;EAEtCC,WAAWA,CAACC,IAAsB,EAAEC,OAAgB,EAAE;IACpD,KAAK,CAACA,OAAO,IAAID,IAAI,CAAC;IACtB,IAAI,CAACE,IAAI,GAAG,cAAc;IAC1B,IAAI,CAACF,IAAI,GAAGA,IAAI;IAChB;IACAG,MAAM,CAACC,cAAc,CAAC,IAAI,EAAEP,YAAY,CAACQ,SAAS,CAAC;EACrD;AACF;;AAEA;AACA;AACA;AACA","ignoreList":[]}
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=jest.setup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jest.setup.d.ts","sourceRoot":"","sources":["../../jest.setup.ts"],"names":[],"mappings":""}
@@ -0,0 +1 @@
1
+ {"type":"module"}
@@ -0,0 +1,36 @@
1
+ import type { ViewProps } from 'react-native';
2
+ import type { BarcodeFormat, ScanResult } from './types';
3
+ /** 暗光提示 / 手电状态。 */
4
+ export interface TorchStatus {
5
+ /** 环境暗到建议显示手电按钮(仅 Android 上报)。 */
6
+ available: boolean;
7
+ /** 手电当前是否点亮。 */
8
+ on: boolean;
9
+ }
10
+ export interface HmsScanViewProps extends ViewProps {
11
+ /** 限定码制;不传 = 全部。 */
12
+ formats?: 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: {
23
+ code: string;
24
+ message: string;
25
+ }) => void;
26
+ /** 暗光提示 / 手电状态变化时回调。 */
27
+ onTorchStatus?: (status: TorchStatus) => void;
28
+ }
29
+ /**
30
+ * 底层 headless 扫码相机组件:只渲染相机预览并发出扫码结果事件。
31
+ * 取景框 / 扫描线 / 手电按钮等 UI 由上层(如 `<Scanner>`)用普通 RN 视图叠加绘制。
32
+ *
33
+ * Android = 华为 RemoteView,iOS = HmsCustomScanViewController(Scan SDK-Plus / ScanKitFrameWork)。
34
+ */
35
+ export declare const HmsScanView: import("react").ForwardRefExoticComponent<HmsScanViewProps & import("react").RefAttributes<import("react").Component<import("./HmsScanViewNativeComponent").NativeProps, {}, any> & import("react-native").ReactNativeElement>>;
36
+ //# sourceMappingURL=HmsScanView.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HmsScanView.d.ts","sourceRoot":"","sources":["../../../src/HmsScanView.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAG9C,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAEzD,mBAAmB;AACnB,MAAM,WAAW,WAAW;IAC1B,kCAAkC;IAClC,SAAS,EAAE,OAAO,CAAC;IACnB,gBAAgB;IAChB,EAAE,EAAE,OAAO,CAAC;CACb;AAED,MAAM,WAAW,gBAAiB,SAAQ,SAAS;IACjD,oBAAoB;IACpB,OAAO,CAAC,EAAE,aAAa,EAAE,CAAC;IAC1B,oBAAoB;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,wBAAwB;IACxB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,+BAA+B;IAC/B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,4BAA4B;IAC5B,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,UAAU,EAAE,KAAK,IAAI,CAAC;IAC/C,kBAAkB;IAClB,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IACjE,wBAAwB;IACxB,aAAa,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,IAAI,CAAC;CAC/C;AAED;;;;;GAKG;AACH,eAAO,MAAM,WAAW,iOAiDtB,CAAC"}
@@ -0,0 +1,32 @@
1
+ import type { ViewProps } from 'react-native';
2
+ import type { DirectEventHandler, WithDefault } from 'react-native/Libraries/Types/CodegenTypes';
3
+ type ScanResultEvent = Readonly<{
4
+ /** JSON 编码的 ScanResult[]。 */
5
+ resultsJson: string;
6
+ }>;
7
+ type ScanErrorEvent = Readonly<{
8
+ code: string;
9
+ message: string;
10
+ }>;
11
+ type TorchStatusEvent = Readonly<{
12
+ /** 环境是否暗到建议显示手电按钮(Android OnLightVisibleCallBack)。 */
13
+ available: boolean;
14
+ /** 手电当前是否点亮。 */
15
+ on: boolean;
16
+ }>;
17
+ export interface NativeProps extends ViewProps {
18
+ /** 限定码制(逗号分隔的 BarcodeFormat),空串 = 全部。 */
19
+ formatsCsv?: WithDefault<string, ''>;
20
+ /** 连续扫码(命中后继续,不自动停)。 */
21
+ continuous?: WithDefault<boolean, true>;
22
+ /** 暂停/恢复扫码(命中后想停在结果卡时用)。 */
23
+ paused?: WithDefault<boolean, false>;
24
+ /** 手电筒(Android 直接控制;iOS 走 AVCaptureDevice 尽力补)。 */
25
+ torch?: WithDefault<boolean, false>;
26
+ onScanResult?: DirectEventHandler<ScanResultEvent>;
27
+ onScanError?: DirectEventHandler<ScanErrorEvent>;
28
+ onTorchStatus?: DirectEventHandler<TorchStatusEvent>;
29
+ }
30
+ declare const _default: import("react-native/Libraries/Utilities/codegenNativeComponent").NativeComponentType<NativeProps>;
31
+ export default _default;
32
+ //# sourceMappingURL=HmsScanViewNativeComponent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HmsScanViewNativeComponent.d.ts","sourceRoot":"","sources":["../../../src/HmsScanViewNativeComponent.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EACV,kBAAkB,EAClB,WAAW,EACZ,MAAM,2CAA2C,CAAC;AAOnD,KAAK,eAAe,GAAG,QAAQ,CAAC;IAC9B,6BAA6B;IAC7B,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC,CAAC;AAEH,KAAK,cAAc,GAAG,QAAQ,CAAC;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC,CAAC;AAEH,KAAK,gBAAgB,GAAG,QAAQ,CAAC;IAC/B,sDAAsD;IACtD,SAAS,EAAE,OAAO,CAAC;IACnB,gBAAgB;IAChB,EAAE,EAAE,OAAO,CAAC;CACb,CAAC,CAAC;AAEH,MAAM,WAAW,WAAY,SAAQ,SAAS;IAC5C,yCAAyC;IACzC,UAAU,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACrC,wBAAwB;IACxB,UAAU,CAAC,EAAE,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACxC,4BAA4B;IAC5B,MAAM,CAAC,EAAE,WAAW,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACrC,mDAAmD;IACnD,KAAK,CAAC,EAAE,WAAW,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAEpC,YAAY,CAAC,EAAE,kBAAkB,CAAC,eAAe,CAAC,CAAC;IACnD,WAAW,CAAC,EAAE,kBAAkB,CAAC,cAAc,CAAC,CAAC;IACjD,aAAa,CAAC,EAAE,kBAAkB,CAAC,gBAAgB,CAAC,CAAC;CACtD;;AAED,wBAAkE"}
@@ -0,0 +1,17 @@
1
+ import type { TurboModule } from 'react-native';
2
+ export interface Spec extends TurboModule {
3
+ /**
4
+ * 解码本地图片里的条码 / 二维码。
5
+ * @param uri 本地图片:file:// / content:// / ph:// / 绝对路径(不下载远程 URL)。
6
+ * @param formatsCsv 限定码制(逗号分隔的 BarcodeFormat),空串 = 全部。
7
+ * @returns JSON 编码的 ScanResult[](可能为空数组)。
8
+ */
9
+ decodeImage(uri: string, formatsCsv: string): Promise<string>;
10
+ /** 当前相机权限:'granted' | 'denied' | 'blocked' | 'undetermined'。 */
11
+ getCameraPermissionStatus(): Promise<string>;
12
+ /** 发起相机权限请求,返回请求后的状态字符串。 */
13
+ requestCameraPermission(): Promise<string>;
14
+ }
15
+ declare const _default: Spec;
16
+ export default _default;
17
+ //# sourceMappingURL=NativeHmsScan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NativeHmsScan.d.ts","sourceRoot":"","sources":["../../../src/NativeHmsScan.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAOhD,MAAM,WAAW,IAAK,SAAQ,WAAW;IACvC;;;;;OAKG;IACH,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAE9D,gEAAgE;IAChE,yBAAyB,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAE7C,4BAA4B;IAC5B,uBAAuB,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;CAC5C;;AAED,wBAAiE"}
@@ -0,0 +1,7 @@
1
+ interface DeniedOverlayProps {
2
+ onClose?: () => void;
3
+ onSettings: () => void;
4
+ }
5
+ export declare function DeniedOverlay({ onClose, onSettings }: DeniedOverlayProps): import("react/jsx-runtime").JSX.Element;
6
+ export {};
7
+ //# sourceMappingURL=DeniedOverlay.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DeniedOverlay.d.ts","sourceRoot":"","sources":["../../../../src/Scanner/DeniedOverlay.tsx"],"names":[],"mappings":"AASA,UAAU,kBAAkB;IAC1B,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,UAAU,EAAE,MAAM,IAAI,CAAC;CACxB;AAGD,wBAAgB,aAAa,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE,kBAAkB,2CAqBxE"}
@@ -0,0 +1,7 @@
1
+ interface ResultFailProps {
2
+ bottomInset: number;
3
+ onRetry: () => void;
4
+ }
5
+ export declare function ResultFail({ bottomInset, onRetry }: ResultFailProps): import("react/jsx-runtime").JSX.Element;
6
+ export {};
7
+ //# sourceMappingURL=ResultFail.d.ts.map
@@ -0,0 +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,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAID,wBAAgB,UAAU,CAAC,EAAE,WAAW,EAAE,OAAO,EAAE,EAAE,eAAe,2CAyBnE"}
@@ -0,0 +1,12 @@
1
+ import type { ScanProduct } from '../types';
2
+ interface ResultFocusProps {
3
+ product: ScanProduct;
4
+ /** 识别耗时(ms),用于 "已识别 · 0.6s"。<=0 则只显示 "已识别"。 */
5
+ detectMs: number;
6
+ bottomInset: number;
7
+ onContinue: () => void;
8
+ onConfirm: () => void;
9
+ }
10
+ export declare function ResultFocus({ product, detectMs, bottomInset, onContinue, onConfirm, }: ResultFocusProps): import("react/jsx-runtime").JSX.Element;
11
+ export {};
12
+ //# sourceMappingURL=ResultFocus.d.ts.map
@@ -0,0 +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,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,SAAS,EAAE,MAAM,IAAI,CAAC;CACvB;AAGD,wBAAgB,WAAW,CAAC,EAC1B,OAAO,EACP,QAAQ,EACR,WAAW,EACX,UAAU,EACV,SAAS,GACV,EAAE,gBAAgB,2CAgElB"}
@@ -0,0 +1,8 @@
1
+ interface ScanHintProps {
2
+ detecting: boolean;
3
+ /** 取景态提示文案。 */
4
+ text: string;
5
+ }
6
+ export declare function ScanHint({ detecting, text }: ScanHintProps): import("react/jsx-runtime").JSX.Element;
7
+ export {};
8
+ //# sourceMappingURL=ScanHint.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ScanHint.d.ts","sourceRoot":"","sources":["../../../../src/Scanner/ScanHint.tsx"],"names":[],"mappings":"AAIA,UAAU,aAAa;IACrB,SAAS,EAAE,OAAO,CAAC;IACnB,eAAe;IACf,IAAI,EAAE,MAAM,CAAC;CACd;AAGD,wBAAgB,QAAQ,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,aAAa,2CAO1D"}
@@ -0,0 +1,9 @@
1
+ interface ScanToolbarProps {
2
+ flash: boolean;
3
+ bottomInset: number;
4
+ onFlash: () => void;
5
+ onAlbum: () => void;
6
+ }
7
+ export declare function ScanToolbar({ flash, bottomInset, onFlash, onAlbum }: ScanToolbarProps): import("react/jsx-runtime").JSX.Element;
8
+ export {};
9
+ //# sourceMappingURL=ScanToolbar.d.ts.map
@@ -0,0 +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,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAGD,wBAAgB,WAAW,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,gBAAgB,2CAarF"}
@@ -0,0 +1,10 @@
1
+ import type { ReactNode } from 'react';
2
+ interface ScanTopBarProps {
3
+ title: string;
4
+ topInset: number;
5
+ onClose?: () => void;
6
+ trailing?: ReactNode;
7
+ }
8
+ export declare function ScanTopBar({ title, topInset, onClose, trailing }: ScanTopBarProps): import("react/jsx-runtime").JSX.Element;
9
+ export {};
10
+ //# sourceMappingURL=ScanTopBar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ScanTopBar.d.ts","sourceRoot":"","sources":["../../../../src/Scanner/ScanTopBar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAKvC,UAAU,eAAe;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAID,wBAAgB,UAAU,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,eAAe,2CAkBjF"}
@@ -0,0 +1,34 @@
1
+ import type { BarcodeFormat, ScanProduct, ScanResult } from '../types';
2
+ export interface ScannerProps {
3
+ /** 顶栏标题,默认 "扫一扫"。 */
4
+ title?: string;
5
+ /** 限定识别码制;不传 = 全部。 */
6
+ formats?: BarcodeFormat[];
7
+ /** 取景态提示文案。 */
8
+ hintText?: string;
9
+ /** 顶部安全区(默认 54)。用 react-native-safe-area-context 时可传 insets.top。 */
10
+ topInset?: number;
11
+ /** 底部安全区(默认 34)。 */
12
+ bottomInset?: number;
13
+ /** 左上角关闭。 */
14
+ onClose?: () => void;
15
+ /**
16
+ * 扫到条码后由宿主解析商品信息(用于浮层确认卡)。
17
+ * 返回 null/undefined 视为"未识别",抛错亦然。不传则默认用扫到的原文当商品名。
18
+ */
19
+ resolveProduct?: (result: ScanResult) => ScanProduct | null | undefined | Promise<ScanProduct | null | undefined>;
20
+ /** 用户点"确认":把结果带回上一级(宿主通常在此导航返回)。 */
21
+ onConfirm?: (product: ScanProduct, result: ScanResult) => void;
22
+ /**
23
+ * 点"相册":宿主用自己的图片选择器选图并返回本地 uri(取消则返回 null)。
24
+ * 不传则相册按钮不可用。
25
+ */
26
+ pickImage?: () => Promise<string | null>;
27
+ }
28
+ /**
29
+ * 成品「扫一扫」界面(聚焦款)。底层 <HmsScanView> 出相机画面,取景框 / 工具栏 / 结果卡
30
+ * 全用 @unif/react-native-design 的主题令牌与组件绘制(统一风格)。自带 ThemeProvider +
31
+ * ToastHost,可直接整屏接入;放进宿主已有的 ThemeProvider 里也兼容。
32
+ */
33
+ export declare function Scanner(props: ScannerProps): import("react/jsx-runtime").JSX.Element;
34
+ //# sourceMappingURL=Scanner.d.ts.map
@@ -0,0 +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,aAAa;IACb,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"}
@@ -0,0 +1,11 @@
1
+ interface ViewfinderProps {
2
+ /** 取景窗边长(px)。窗高 = size × 0.82。 */
3
+ size: number;
4
+ /** 识别中(停止呼吸/脉冲动画,准星与边框变淡)。 */
5
+ detecting: boolean;
6
+ /** 取景态提示文案。 */
7
+ hintText: string;
8
+ }
9
+ export declare function Viewfinder({ size, detecting, hintText }: ViewfinderProps): import("react/jsx-runtime").JSX.Element;
10
+ export {};
11
+ //# sourceMappingURL=Viewfinder.d.ts.map
@@ -0,0 +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;AAID,wBAAgB,UAAU,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,eAAe,2CA0DxE"}
@@ -0,0 +1,19 @@
1
+ export declare const scanChrome: {
2
+ /** 相机未就绪时的底色(深色实景占位)。 */
3
+ readonly cameraBg: "#0c0b0a";
4
+ readonly white: "#FFFFFF";
5
+ /** 顶栏关闭键玻璃底。 */
6
+ readonly glassDisc: "rgba(20,18,16,0.42)";
7
+ /** 工具栏未点亮玻璃底。 */
8
+ readonly glassDisc2: "rgba(28,26,24,0.5)";
9
+ readonly glassBorder: "rgba(255,255,255,0.16)";
10
+ readonly glassBorderActive: "rgba(255,255,255,0.25)";
11
+ /** 取景提示文字。 */
12
+ readonly hintText: "rgba(255,255,255,0.86)";
13
+ readonly toolbarLabel: "rgba(255,255,255,0.82)";
14
+ /** 取景窗白色描边。 */
15
+ readonly windowBorder: "rgba(255,255,255,0.55)";
16
+ readonly crosshair: "rgba(255,255,255,0.9)";
17
+ readonly textShadow: "rgba(0,0,0,0.55)";
18
+ };
19
+ //# sourceMappingURL=scanChrome.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scanChrome.d.ts","sourceRoot":"","sources":["../../../../src/Scanner/scanChrome.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,UAAU;IACrB,yBAAyB;;;IAGzB,gBAAgB;;IAEhB,iBAAiB;;;;IAIjB,cAAc;;;IAGd,eAAe;;;;CAIP,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { type DecodeImageOptions, type ScanResult } from './types';
2
+ /**
3
+ * 从本地图片解码条码 / 二维码(华为 Bitmap 模式)。
4
+ *
5
+ * @param uri 本地图片:file:// / content:// / ph:// / 绝对路径。**不下载远程 URL**,
6
+ * 如需识别网络图请宿主先下载到本地再传入。
7
+ * @param options 可选;formats 限定码制,不传 = 全部。
8
+ * @returns 命中的结果数组(可能为空)。
9
+ * @throws HmsScanError 图片加载失败 / 读权限缺失等。
10
+ */
11
+ export declare function decodeImage(uri: string, options?: DecodeImageOptions): Promise<ScanResult[]>;
12
+ //# sourceMappingURL=decodeImage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decodeImage.d.ts","sourceRoot":"","sources":["../../../src/decodeImage.ts"],"names":[],"mappings":"AAEA,OAAO,EAAgB,KAAK,kBAAkB,EAAE,KAAK,UAAU,EAAE,MAAM,SAAS,CAAC;AAEjF;;;;;;;;GAQG;AACH,wBAAsB,WAAW,CAC/B,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,kBAAkB,GAC3B,OAAO,CAAC,UAAU,EAAE,CAAC,CAmBvB"}
@@ -0,0 +1,13 @@
1
+ import { type BarcodeContentType, type BarcodeFormat, type ScanResult } from './types';
2
+ /** 把任意字符串安全收敛成 BarcodeFormat(未知归 UNKNOWN)。 */
3
+ export declare function coerceFormat(value: unknown): BarcodeFormat;
4
+ /** 把任意字符串安全收敛成 BarcodeContentType(未知/缺省 → undefined)。 */
5
+ export declare function coerceContentType(value: unknown): BarcodeContentType | undefined;
6
+ /** formats[] → 逗号分隔 CSV(传给原生);空/未传 → ''(= 全部码制)。 */
7
+ export declare function formatsToCsv(formats?: readonly BarcodeFormat[]): string;
8
+ /**
9
+ * 解析原生回传的 JSON 字符串 → 强类型 ScanResult[]。
10
+ * 任何脏数据都被安全过滤;解析失败返回空数组而非抛错。
11
+ */
12
+ export declare function parseResultsJson(json: string): ScanResult[];
13
+ //# sourceMappingURL=format.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../../src/format.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,kBAAkB,EACvB,KAAK,aAAa,EAElB,KAAK,UAAU,EAChB,MAAM,SAAS,CAAC;AAqBjB,8CAA8C;AAC9C,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,aAAa,CAI1D;AAED,yDAAyD;AACzD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,kBAAkB,GAAG,SAAS,CAIhF;AAED,oDAAoD;AACpD,wBAAgB,YAAY,CAAC,OAAO,CAAC,EAAE,SAAS,aAAa,EAAE,GAAG,MAAM,CAEvE;AA6BD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,EAAE,CAe3D"}
@@ -0,0 +1,10 @@
1
+ export { ALL_BARCODE_FORMATS, HmsScanError, } from './types';
2
+ export type { BarcodeFormat, BarcodeContentType, ScanCornerPoint, ScanResult, DecodeImageOptions, CameraPermissionStatus, HmsScanErrorCode, ScanProduct, } from './types';
3
+ export { coerceFormat, coerceContentType, formatsToCsv } from './format';
4
+ export { HmsScanView } from './HmsScanView';
5
+ export type { HmsScanViewProps, TorchStatus } from './HmsScanView';
6
+ export { decodeImage } from './decodeImage';
7
+ export { getCameraPermissionStatus, requestCameraPermission } from './permissions';
8
+ export { Scanner } from './Scanner/Scanner';
9
+ export type { ScannerProps } from './Scanner/Scanner';
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.tsx"],"names":[],"mappings":"AAIA,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"}
@@ -0,0 +1,12 @@
1
+ import type { FC } from 'react';
2
+ import type { CameraPermissionStatus, DecodeImageOptions, ScanResult } from './types';
3
+ import type { HmsScanViewProps } from './HmsScanView';
4
+ import type { ScannerProps } from './Scanner/Scanner';
5
+ export * from './types';
6
+ export { coerceFormat, coerceContentType, formatsToCsv } from './format';
7
+ export declare const decodeImage: jest.Mock<Promise<ScanResult[]>, [_uri: string, _options?: DecodeImageOptions | undefined], any>;
8
+ export declare const getCameraPermissionStatus: jest.Mock<Promise<CameraPermissionStatus>, [], any>;
9
+ export declare const requestCameraPermission: jest.Mock<Promise<CameraPermissionStatus>, [], any>;
10
+ export declare const HmsScanView: FC<HmsScanViewProps>;
11
+ export declare const Scanner: FC<ScannerProps>;
12
+ //# sourceMappingURL=mock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mock.d.ts","sourceRoot":"","sources":["../../../src/mock.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAChC,OAAO,KAAK,EACV,sBAAsB,EACtB,kBAAkB,EAClB,UAAU,EACX,MAAM,SAAS,CAAC;AACjB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAGtD,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAGzE,eAAO,MAAM,WAAW,kGAGvB,CAAC;AAGF,eAAO,MAAM,yBAAyB,qDAErC,CAAC;AACF,eAAO,MAAM,uBAAuB,qDAEnC,CAAC;AAGF,eAAO,MAAM,WAAW,EAAE,EAAE,CAAC,gBAAgB,CAAc,CAAC;AAC5D,eAAO,MAAM,OAAO,EAAE,EAAE,CAAC,YAAY,CAAc,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { CameraPermissionStatus } from './types';
2
+ /** 查询当前相机权限状态(不弹窗)。 */
3
+ export declare function getCameraPermissionStatus(): Promise<CameraPermissionStatus>;
4
+ /**
5
+ * 发起相机权限请求(必要时弹系统授权框),返回请求后的状态。
6
+ * 若用户已永久拒绝(blocked),需引导去系统设置开启。
7
+ */
8
+ export declare function requestCameraPermission(): Promise<CameraPermissionStatus>;
9
+ //# sourceMappingURL=permissions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permissions.d.ts","sourceRoot":"","sources":["../../../src/permissions.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,SAAS,CAAC;AActD,uBAAuB;AACvB,wBAAsB,yBAAyB,IAAI,OAAO,CAAC,sBAAsB,CAAC,CAEjF;AAED;;;GAGG;AACH,wBAAsB,uBAAuB,IAAI,OAAO,CAAC,sBAAsB,CAAC,CAE/E"}
@@ -0,0 +1,62 @@
1
+ /** 统一码制枚举(两端归一)。 */
2
+ export type BarcodeFormat = 'QR_CODE' | 'AZTEC' | 'DATA_MATRIX' | 'PDF417' | 'CODABAR' | 'CODE_39' | 'CODE_93' | 'CODE_128' | 'EAN_8' | 'EAN_13' | 'UPC_A' | 'UPC_E' | 'ITF14' | 'MULTI_FUNCTIONAL' | 'UNKNOWN';
3
+ /** 所有可用码制(不含 UNKNOWN)。传给原生即"识别全部码制"。 */
4
+ export declare const ALL_BARCODE_FORMATS: readonly BarcodeFormat[];
5
+ /**
6
+ * 码内容语义类型(尽力归一)。
7
+ * Android 来自 HmsScan.getScanTypeForm(),iOS 来自 sceneType(精度有限,未知归 OTHER)。
8
+ */
9
+ export type BarcodeContentType = 'TEXT' | 'URL' | 'EMAIL' | 'PHONE' | 'SMS' | 'WIFI' | 'CONTACT' | 'EVENT' | 'LOCATION' | 'DRIVER' | 'ISBN' | 'ARTICLE' | 'OTHER';
10
+ /** 取景框/解码命中的角点(图像坐标系,单位 px)。 */
11
+ export interface ScanCornerPoint {
12
+ x: number;
13
+ y: number;
14
+ }
15
+ /** 一次扫码/解码命中的结果。 */
16
+ export interface ScanResult {
17
+ /** 原始解码文本(Android getOriginalValue / iOS text)。 */
18
+ value: string;
19
+ /** 码制。 */
20
+ format: BarcodeFormat;
21
+ /** 内容语义类型(可能缺省)。 */
22
+ contentType?: BarcodeContentType;
23
+ /** 条码四角点(可能缺省)。 */
24
+ cornerPoints?: ScanCornerPoint[];
25
+ }
26
+ /** decodeImage 选项。 */
27
+ export interface DecodeImageOptions {
28
+ /** 限定识别码制;不传 = 全部。 */
29
+ formats?: BarcodeFormat[];
30
+ }
31
+ /** 相机权限状态。 */
32
+ export type CameraPermissionStatus = 'granted' | 'denied' | 'blocked' | 'undetermined';
33
+ /** 错误码。 */
34
+ export type HmsScanErrorCode = 'E_NO_CAMERA_PERMISSION' | 'E_NO_READ_PERMISSION' | 'E_CAMERA_INIT' | 'E_DECODE_FAILED' | 'E_IMAGE_LOAD_FAILED' | 'E_NO_RESULT' | 'E_UNKNOWN';
35
+ /** 库统一抛出的错误类型。 */
36
+ export declare class HmsScanError extends Error {
37
+ readonly code: HmsScanErrorCode;
38
+ constructor(code: HmsScanErrorCode, message?: string);
39
+ }
40
+ /**
41
+ * 业务层商品信息——`<Scanner>` 扫到条码后,由宿主通过 resolveProduct 解析返回,
42
+ * 用于聚焦款"浮层确认卡"展示。仅 name 必填,其余可缺省。
43
+ */
44
+ export interface ScanProduct {
45
+ /** 商品名(必填)。 */
46
+ name: string;
47
+ /** 品牌(如 "统一")。 */
48
+ brand?: string;
49
+ /** 字母牌字符;缺省时取 brand 或 name 的首字。 */
50
+ brandChar?: string;
51
+ /** 条码;缺省时取扫到的 value。 */
52
+ barcode?: string;
53
+ /** 规格(如 "500ml × 15 瓶/箱")。 */
54
+ spec?: string;
55
+ /** 库存短描述(如 "充足")。 */
56
+ stockShort?: string;
57
+ /** 价格展示串(如 "¥5.50")。 */
58
+ price?: string;
59
+ /** 价格下方副标题,默认 "建议零售"。 */
60
+ priceCaption?: string;
61
+ }
62
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/types.ts"],"names":[],"mappings":"AAQA,oBAAoB;AACpB,MAAM,MAAM,aAAa,GACrB,SAAS,GACT,OAAO,GACP,aAAa,GACb,QAAQ,GACR,SAAS,GACT,SAAS,GACT,SAAS,GACT,UAAU,GACV,OAAO,GACP,QAAQ,GACR,OAAO,GACP,OAAO,GACP,OAAO,GACP,kBAAkB,GAClB,SAAS,CAAC;AAEd,wCAAwC;AACxC,eAAO,MAAM,mBAAmB,EAAE,SAAS,aAAa,EAe9C,CAAC;AAEX;;;GAGG;AACH,MAAM,MAAM,kBAAkB,GAC1B,MAAM,GACN,KAAK,GACL,OAAO,GACP,OAAO,GACP,KAAK,GACL,MAAM,GACN,SAAS,GACT,OAAO,GACP,UAAU,GACV,QAAQ,GACR,MAAM,GACN,SAAS,GACT,OAAO,CAAC;AAEZ,gCAAgC;AAChC,MAAM,WAAW,eAAe;IAC9B,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX;AAED,oBAAoB;AACpB,MAAM,WAAW,UAAU;IACzB,mDAAmD;IACnD,KAAK,EAAE,MAAM,CAAC;IACd,UAAU;IACV,MAAM,EAAE,aAAa,CAAC;IACtB,oBAAoB;IACpB,WAAW,CAAC,EAAE,kBAAkB,CAAC;IACjC,mBAAmB;IACnB,YAAY,CAAC,EAAE,eAAe,EAAE,CAAC;CAClC;AAED,sBAAsB;AACtB,MAAM,WAAW,kBAAkB;IACjC,sBAAsB;IACtB,OAAO,CAAC,EAAE,aAAa,EAAE,CAAC;CAC3B;AAED,cAAc;AACd,MAAM,MAAM,sBAAsB,GAC9B,SAAS,GACT,QAAQ,GACR,SAAS,GACT,cAAc,CAAC;AAEnB,WAAW;AACX,MAAM,MAAM,gBAAgB,GACxB,wBAAwB,GACxB,sBAAsB,GACtB,eAAe,GACf,iBAAiB,GACjB,qBAAqB,GACrB,aAAa,GACb,WAAW,CAAC;AAEhB,kBAAkB;AAClB,qBAAa,YAAa,SAAQ,KAAK;IACrC,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC;gBACpB,IAAI,EAAE,gBAAgB,EAAE,OAAO,CAAC,EAAE,MAAM;CAOrD;AAED;;;GAGG;AACH,MAAM,WAAW,WAAW;IAC1B,eAAe;IACf,IAAI,EAAE,MAAM,CAAC;IACb,kBAAkB;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,mCAAmC;IACnC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wBAAwB;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,8BAA8B;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,qBAAqB;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,wBAAwB;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,yBAAyB;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB"}
package/package.json ADDED
@@ -0,0 +1,174 @@
1
+ {
2
+ "name": "@unif/react-native-hms-scan",
3
+ "version": "0.1.0",
4
+ "description": "华为 HMS 统一扫码服务 React Native bridge:定制视图扫码 + 图片识别 (Scan SDK-Plus / ScanKitFrameWork,@unif 私有)",
5
+ "main": "./lib/module/index.js",
6
+ "types": "./lib/typescript/src/index.d.ts",
7
+ "exports": {
8
+ ".": {
9
+ "source": "./src/index.tsx",
10
+ "types": "./lib/typescript/src/index.d.ts",
11
+ "default": "./lib/module/index.js"
12
+ },
13
+ "./mock": {
14
+ "source": "./src/mock.ts",
15
+ "types": "./lib/typescript/src/mock.d.ts",
16
+ "default": "./lib/module/mock.js"
17
+ },
18
+ "./package.json": "./package.json"
19
+ },
20
+ "files": [
21
+ "src",
22
+ "lib",
23
+ "android",
24
+ "ios",
25
+ "*.podspec",
26
+ "react-native.config.js",
27
+ "!ios/build",
28
+ "!android/build",
29
+ "!android/gradle",
30
+ "!android/gradlew",
31
+ "!android/gradlew.bat",
32
+ "!android/local.properties",
33
+ "!**/__tests__",
34
+ "!**/__fixtures__",
35
+ "!**/__mocks__",
36
+ "!**/.*"
37
+ ],
38
+ "scripts": {
39
+ "example": "yarn workspace @unif/react-native-hms-scan-example",
40
+ "clean": "del-cli android/build example/android/build example/android/app/build example/ios/build lib",
41
+ "prepare": "bob build",
42
+ "typecheck": "tsc",
43
+ "test": "jest",
44
+ "lint": "eslint \"**/*.{js,ts,tsx}\""
45
+ },
46
+ "keywords": [
47
+ "react-native",
48
+ "ios",
49
+ "android",
50
+ "huawei",
51
+ "hms",
52
+ "scan",
53
+ "scankit",
54
+ "barcode",
55
+ "qrcode",
56
+ "扫码"
57
+ ],
58
+ "repository": {
59
+ "type": "git",
60
+ "url": "git+https://github.com/unif-design/react-native-hms-scan.git"
61
+ },
62
+ "author": "unif-design <382724935@qq.com> (https://github.com/unif-design)",
63
+ "license": "MIT",
64
+ "bugs": {
65
+ "url": "https://github.com/unif-design/react-native-hms-scan/issues"
66
+ },
67
+ "homepage": "https://github.com/unif-design/react-native-hms-scan#readme",
68
+ "publishConfig": {
69
+ "registry": "https://registry.npmjs.org/"
70
+ },
71
+ "devDependencies": {
72
+ "@commitlint/config-conventional": "^20.5.0",
73
+ "@eslint/js": "^9.39.0",
74
+ "@gorhom/bottom-sheet": "^5.2.14",
75
+ "@react-native/babel-preset": "0.85.0",
76
+ "@react-native/eslint-config": "0.85.0",
77
+ "@react-native/jest-preset": "0.85.0",
78
+ "@sbaiahmed1/react-native-blur": "^4.6.2",
79
+ "@testing-library/react-native": "^13.3.3",
80
+ "@types/jest": "^29.5.0",
81
+ "@types/react": "^19.2.0",
82
+ "@types/react-test-renderer": "^19",
83
+ "@unif/react-native-design": "^0.4.35",
84
+ "commitlint": "^20.5.0",
85
+ "del-cli": "^7.0.0",
86
+ "eslint": "^9.39.4",
87
+ "eslint-config-prettier": "^10.1.8",
88
+ "eslint-plugin-prettier": "^5.5.5",
89
+ "jest": "^29.7.0",
90
+ "prettier": "^3.8.1",
91
+ "react": "19.2.3",
92
+ "react-native": "0.85.0",
93
+ "react-native-builder-bob": "^0.41.0",
94
+ "react-native-gesture-handler": "^2.21.0",
95
+ "react-native-reanimated": "^4.0.0",
96
+ "react-native-reanimated-carousel": "^5.0.0-beta.5",
97
+ "react-native-safe-area-context": "^5.0.0",
98
+ "react-native-svg": "^15.15.5",
99
+ "react-native-worklets": "*",
100
+ "react-test-renderer": "19.2.3",
101
+ "typescript": "^6.0.2",
102
+ "typescript-eslint": "^8.20.0"
103
+ },
104
+ "peerDependencies": {
105
+ "@gorhom/bottom-sheet": ">=5",
106
+ "@sbaiahmed1/react-native-blur": ">=4",
107
+ "@unif/react-native-design": ">=0.4.0",
108
+ "react": ">=19.0.0",
109
+ "react-native": ">=0.80.0",
110
+ "react-native-gesture-handler": ">=2.21.0",
111
+ "react-native-reanimated": ">=4.0.0",
112
+ "react-native-reanimated-carousel": ">=5.0.0-beta.0",
113
+ "react-native-safe-area-context": ">=5.0.0",
114
+ "react-native-svg": ">=15",
115
+ "react-native-worklets": "*"
116
+ },
117
+ "workspaces": [
118
+ "example"
119
+ ],
120
+ "packageManager": "yarn@4.11.0",
121
+ "codegenConfig": {
122
+ "name": "ReactNativeHmsScanSpec",
123
+ "type": "all",
124
+ "jsSrcsDir": "src",
125
+ "android": {
126
+ "javaPackageName": "com.unif.reactnativehmsscan"
127
+ }
128
+ },
129
+ "react-native-builder-bob": {
130
+ "source": "src",
131
+ "output": "lib",
132
+ "targets": [
133
+ [
134
+ "module",
135
+ {
136
+ "esm": true
137
+ }
138
+ ],
139
+ [
140
+ "typescript",
141
+ {
142
+ "project": "tsconfig.build.json"
143
+ }
144
+ ]
145
+ ]
146
+ },
147
+ "commitlint": {
148
+ "extends": [
149
+ "@commitlint/config-conventional"
150
+ ]
151
+ },
152
+ "jest": {
153
+ "preset": "@react-native/jest-preset",
154
+ "modulePathIgnorePatterns": [
155
+ "<rootDir>/example/node_modules",
156
+ "<rootDir>/lib/"
157
+ ],
158
+ "setupFiles": [
159
+ "./jest.setup.ts"
160
+ ]
161
+ },
162
+ "prettier": {
163
+ "quoteProps": "consistent",
164
+ "singleQuote": true,
165
+ "tabWidth": 2,
166
+ "trailingComma": "es5",
167
+ "useTabs": false
168
+ },
169
+ "create-react-native-library": {
170
+ "type": "fabric-view",
171
+ "languages": "kotlin-objc",
172
+ "version": "0.62.0"
173
+ }
174
+ }