@sanctum-key/react-native-sdk 1.0.8 → 1.0.9

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 (96) hide show
  1. package/README.md +4 -4
  2. package/android/build.gradle +2 -2
  3. package/android/src/main/AndroidManifest.xml +1 -1
  4. package/android/src/main/java/kyc/transfergratis/com/TransfergratisSdkModule.kt +6 -6
  5. package/android/src/main/java/kyc/transfergratis/com/TransfergratisSdkView.kt +2 -2
  6. package/build/package.json +5 -5
  7. package/build/src/App.d.ts +2 -2
  8. package/build/src/App.d.ts.map +1 -1
  9. package/build/src/App.js +2 -2
  10. package/build/src/App.js.map +1 -1
  11. package/build/src/{SanctumKeySdk.types.d.ts → TransfergratisSdk.types.d.ts} +3 -3
  12. package/build/src/TransfergratisSdk.types.d.ts.map +1 -0
  13. package/build/src/TransfergratisSdk.types.js +2 -0
  14. package/build/src/TransfergratisSdk.types.js.map +1 -0
  15. package/build/src/{SanctumKeySdkModule.d.ts → TransfergratisSdkModule.d.ts} +4 -4
  16. package/build/src/TransfergratisSdkModule.d.ts.map +1 -0
  17. package/build/src/{SanctumKeySdkModule.js → TransfergratisSdkModule.js} +2 -2
  18. package/build/src/TransfergratisSdkModule.js.map +1 -0
  19. package/build/src/{SanctumKeySdkModule.web.d.ts → TransfergratisSdkModule.web.d.ts} +4 -4
  20. package/build/src/TransfergratisSdkModule.web.d.ts.map +1 -0
  21. package/build/src/{SanctumKeySdkModule.web.js → TransfergratisSdkModule.web.js} +3 -3
  22. package/build/src/TransfergratisSdkModule.web.js.map +1 -0
  23. package/build/src/TransfergratisSdkView.d.ts +4 -0
  24. package/build/src/TransfergratisSdkView.d.ts.map +1 -0
  25. package/build/src/TransfergratisSdkView.js +7 -0
  26. package/build/src/TransfergratisSdkView.js.map +1 -0
  27. package/build/src/TransfergratisSdkView.web.d.ts +4 -0
  28. package/build/src/TransfergratisSdkView.web.d.ts.map +1 -0
  29. package/build/src/{SanctumKeySdkView.web.js → TransfergratisSdkView.web.js} +2 -2
  30. package/build/src/TransfergratisSdkView.web.js.map +1 -0
  31. package/build/src/api/axios.js +2 -2
  32. package/build/src/api/axios.js.map +1 -1
  33. package/build/src/components/EnhancedCameraView.d.ts.map +1 -1
  34. package/build/src/components/EnhancedCameraView.js +12 -61
  35. package/build/src/components/EnhancedCameraView.js.map +1 -1
  36. package/build/src/components/KYCElements/EmailVerificationTemplate.d.ts.map +1 -1
  37. package/build/src/components/KYCElements/EmailVerificationTemplate.js +11 -32
  38. package/build/src/components/KYCElements/EmailVerificationTemplate.js.map +1 -1
  39. package/build/src/components/KYCElements/IDCardCapture.js +2 -1
  40. package/build/src/components/KYCElements/IDCardCapture.js.map +1 -1
  41. package/build/src/components/KYCElements/PhoneVerificationTemplate.d.ts.map +1 -1
  42. package/build/src/components/KYCElements/PhoneVerificationTemplate.js +22 -163
  43. package/build/src/components/KYCElements/PhoneVerificationTemplate.js.map +1 -1
  44. package/build/src/components/NativeCameraView.js +1 -1
  45. package/build/src/components/NativeCameraView.js.map +1 -1
  46. package/build/src/config/KYCConfig.js +1 -1
  47. package/build/src/config/KYCConfig.js.map +1 -1
  48. package/build/src/config/allowedDomains.js +6 -6
  49. package/build/src/config/allowedDomains.js.map +1 -1
  50. package/build/src/index.d.ts +3 -3
  51. package/build/src/index.d.ts.map +1 -1
  52. package/build/src/index.js +3 -3
  53. package/build/src/index.js.map +1 -1
  54. package/build/src/modules/api/KYCService.d.ts +3 -3
  55. package/build/src/modules/api/KYCService.d.ts.map +1 -1
  56. package/build/src/modules/api/KYCService.js +25 -32
  57. package/build/src/modules/api/KYCService.js.map +1 -1
  58. package/build/src/modules/camera/NativeCameraModule.js +17 -17
  59. package/build/src/modules/camera/NativeCameraModule.js.map +1 -1
  60. package/expo-module.config.json +2 -2
  61. package/ios/TransfergratisSdk.podspec +2 -2
  62. package/ios/TransfergratisSdkModule.swift +12 -12
  63. package/package.json +5 -5
  64. package/src/App.tsx +2 -2
  65. package/src/{SanctumKeySdk.types.ts → TransfergratisSdk.types.ts} +2 -2
  66. package/src/{SanctumKeySdkModule.ts → TransfergratisSdkModule.ts} +3 -3
  67. package/src/{SanctumKeySdkModule.web.ts → TransfergratisSdkModule.web.ts} +3 -3
  68. package/src/TransfergratisSdkView.tsx +11 -0
  69. package/src/{SanctumKeySdkView.web.tsx → TransfergratisSdkView.web.tsx} +2 -2
  70. package/src/api/axios.ts +2 -2
  71. package/src/components/EnhancedCameraView.tsx +34 -99
  72. package/src/components/KYCElements/EmailVerificationTemplate.tsx +10 -36
  73. package/src/components/KYCElements/IDCardCapture.tsx +1 -1
  74. package/src/components/KYCElements/PhoneVerificationTemplate.tsx +30 -204
  75. package/src/components/NativeCameraView.tsx +1 -1
  76. package/src/config/KYCConfig.ts +1 -1
  77. package/src/config/allowedDomains.ts +6 -6
  78. package/src/i18n/README.md +1 -1
  79. package/src/index.ts +3 -3
  80. package/src/modules/api/KYCService.ts +26 -37
  81. package/src/modules/camera/NativeCameraModule.ts +17 -17
  82. package/build/src/SanctumKeySdk.types.d.ts.map +0 -1
  83. package/build/src/SanctumKeySdk.types.js +0 -2
  84. package/build/src/SanctumKeySdk.types.js.map +0 -1
  85. package/build/src/SanctumKeySdkModule.d.ts.map +0 -1
  86. package/build/src/SanctumKeySdkModule.js.map +0 -1
  87. package/build/src/SanctumKeySdkModule.web.d.ts.map +0 -1
  88. package/build/src/SanctumKeySdkModule.web.js.map +0 -1
  89. package/build/src/SanctumKeySdkView.d.ts +0 -4
  90. package/build/src/SanctumKeySdkView.d.ts.map +0 -1
  91. package/build/src/SanctumKeySdkView.js +0 -7
  92. package/build/src/SanctumKeySdkView.js.map +0 -1
  93. package/build/src/SanctumKeySdkView.web.d.ts +0 -4
  94. package/build/src/SanctumKeySdkView.web.d.ts.map +0 -1
  95. package/build/src/SanctumKeySdkView.web.js.map +0 -1
  96. package/src/SanctumKeySdkView.tsx +0 -11
package/README.md CHANGED
@@ -45,7 +45,7 @@ npm install @sanctum-key/react-native-sdk --legacy-peer-deps
45
45
  Use `npx expo install` so Expo automatically resolves the correct versions for your SDK build (e.g., SDK 53 or 54):
46
46
 
47
47
  ```bash
48
- npx expo install react-native-vision-camera expo-location expo-image-manipulator react-native-svg expo-file-system
48
+ npx expo install react-native-vision-camera expo-location expo-image-manipulator react-native-svg expo-file-system expo-dev-client
49
49
  ```
50
50
 
51
51
  ### Step 3 — Install Standard NPM Dependencies
@@ -130,7 +130,7 @@ The recommended approach is to use the JSON template system to configure your KY
130
130
  ```tsx
131
131
  import React, { useState } from 'react';
132
132
  import { Alert, View, StyleSheet } from 'react-native';
133
- import { LaunchSanctumKeyKYC, VerificationState } from '@sanctum-key/react-native-sdk';
133
+ import { LaunchTransferGratisKYC, VerificationState } from '@sanctum-key/react-native-sdk';
134
134
 
135
135
  export default function App() {
136
136
  const [showKYC, setShowKYC] = useState(true);
@@ -139,7 +139,7 @@ export default function App() {
139
139
 
140
140
  return (
141
141
  <View style={styles.container}>
142
- <LaunchSanctumKeyKYC
142
+ <LaunchTransferGratisKYC
143
143
  onComplete={(data: VerificationState) => {
144
144
  Alert.alert('Success', 'KYC Verification Completed');
145
145
  setShowKYC(false);
@@ -263,7 +263,7 @@ This project is licensed under the **MIT License** — see the [LICENSE](./LICEN
263
263
 
264
264
  ## Support
265
265
 
266
- For support, email [support@SanctumKey.com](mailto:support@sanctumkey.com) or open an issue on GitHub.
266
+ For support, email [support@transfergratis.com](mailto:support@sanctumkey.com) or open an issue on GitHub.
267
267
 
268
268
 
269
269
  Built with ❤️ by the [Sanctum Key](https://service.sanctumkey.com) Team
@@ -1,6 +1,6 @@
1
1
  apply plugin: 'com.android.library'
2
2
 
3
- group = 'kyc.SanctumKey.com'
3
+ group = 'kyc.transfergratis.com'
4
4
  version = '0.1.18'
5
5
 
6
6
  def expoModulesCorePlugin = new File(project(":expo-modules-core").projectDir.absolutePath, "ExpoModulesCorePlugin.gradle")
@@ -32,7 +32,7 @@ if (useManagedAndroidSdkVersions) {
32
32
  }
33
33
 
34
34
  android {
35
- namespace "kyc.SanctumKey.com"
35
+ namespace "kyc.transfergratis.com"
36
36
  defaultConfig {
37
37
  versionCode 1
38
38
  versionName "0.1.0"
@@ -1,7 +1,7 @@
1
1
  <?xml version="1.0" encoding="utf-8"?>
2
2
  <manifest xmlns:android="http://schemas.android.com/apk/res/android"
3
3
  xmlns:tools="http://schemas.android.com/tools"
4
- package="kyc.SanctumKey.com">
4
+ package="kyc.transfergratis.com">
5
5
 
6
6
  <!--
7
7
  Permissions nécessaires pour KYC:
@@ -1,4 +1,4 @@
1
- package kyc.SanctumKey.com
1
+ package kyc.transfergratis.com
2
2
 
3
3
  import android.Manifest
4
4
  import android.content.pm.PackageManager
@@ -8,12 +8,12 @@ import expo.modules.kotlin.modules.Module
8
8
  import expo.modules.kotlin.modules.ModuleDefinition
9
9
  import expo.modules.kotlin.Promise
10
10
 
11
- class SanctumKeySdkModule : Module() {
11
+ class TransfergratisSdkModule : Module() {
12
12
  private val CAMERA_PERMISSION_REQUEST = 100
13
13
  private var currentPhotoPath: String? = null
14
14
 
15
15
  override fun definition() = ModuleDefinition {
16
- Name("SanctumKeySdk")
16
+ Name("TransfergratisSdk")
17
17
 
18
18
  Constants(
19
19
  "PI" to Math.PI
@@ -114,12 +114,12 @@ class SanctumKeySdkModule : Module() {
114
114
 
115
115
 
116
116
  // Vue native pour la caméra avec instructions
117
- View(SanctumKeySdkView::class) {
118
- Prop("instructions") { view: SanctumKeySdkView, instructions: String ->
117
+ View(TransfergratisSdkView::class) {
118
+ Prop("instructions") { view: TransfergratisSdkView, instructions: String ->
119
119
  view.setInstructions(instructions)
120
120
  }
121
121
 
122
- Prop("showCamera") { view: SanctumKeySdkView, show: Boolean ->
122
+ Prop("showCamera") { view: TransfergratisSdkView, show: Boolean ->
123
123
  view.showCamera(show)
124
124
  }
125
125
 
@@ -1,4 +1,4 @@
1
- package kyc.SanctumKey.com
1
+ package kyc.transfergratis.com
2
2
 
3
3
  import android.content.Context
4
4
  import android.graphics.Color
@@ -13,7 +13,7 @@ import expo.modules.kotlin.AppContext
13
13
  import expo.modules.kotlin.viewevent.EventDispatcher
14
14
  import expo.modules.kotlin.views.ExpoView
15
15
 
16
- class SanctumKeySdkView(context: Context, appContext: AppContext) : ExpoView(context, appContext) {
16
+ class TransfergratisSdkView(context: Context, appContext: AppContext) : ExpoView(context, appContext) {
17
17
  private val onCapture by EventDispatcher()
18
18
  private val onError by EventDispatcher()
19
19
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sanctum-key/react-native-sdk",
3
- "version": "1.0.8",
3
+ "version": "1.0.9",
4
4
  "description": "Sanctum Key React Native SDK",
5
5
  "main": "build/src/index.js",
6
6
  "types": "build/src/index.d.ts",
@@ -25,13 +25,13 @@
25
25
  "kyc",
26
26
  "identity-verification"
27
27
  ],
28
- "repository": "https://github.com/SanctumKeyOrg/KYC-User-Frontend",
28
+ "repository": "https://github.com/TransfergratisOrg/KYC-User-Frontend",
29
29
  "bugs": {
30
- "url": "https://github.com/SanctumKeyOrg/KYC-User-Frontend/issues"
30
+ "url": "https://github.com/TransfergratisOrg/KYC-User-Frontend/issues"
31
31
  },
32
- "author": "mesha-SanctumKey <loic.lontchi@SanctumKey.com> (https://github.com/mesha-SanctumKey)",
32
+ "author": "mesha-transfergratis <loic.lontchi@transfergratis.com> (https://github.com/mesha-transfergratis)",
33
33
  "license": "MIT",
34
- "homepage": "https://github.com/SanctumKeyOrg/KYC-User-Frontend#readme",
34
+ "homepage": "https://github.com/TransfergratisOrg/KYC-User-Frontend#readme",
35
35
  "files": [
36
36
  "build",
37
37
  "src",
@@ -1,3 +1,3 @@
1
- declare const LaunchSanctumKeyKYC: () => import("react").JSX.Element;
2
- export default LaunchSanctumKeyKYC;
1
+ declare const LaunchTransferGratisKYC: () => import("react").JSX.Element;
2
+ export default LaunchTransferGratisKYC;
3
3
  //# sourceMappingURL=App.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../../src/App.tsx"],"names":[],"mappings":"AAIA,QAAA,MAAM,mBAAmB,mCAExB,CAAA;AAED,eAAe,mBAAmB,CAAC"}
1
+ {"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../../src/App.tsx"],"names":[],"mappings":"AAIA,QAAA,MAAM,uBAAuB,mCAE5B,CAAA;AAED,eAAe,uBAAuB,CAAC"}
package/build/src/App.js CHANGED
@@ -2,8 +2,8 @@ import CameraCaptureEx from "./components/example/CameraCaptureEx";
2
2
  // import SelfieCaptureEx from "./components/example/SelfieCaptureEx";
3
3
  // import { KYCExample } from "./components/KYCExample";
4
4
  // import { KYCFlow } from "./components/KYCFlow"
5
- const LaunchSanctumKeyKYC = () => {
5
+ const LaunchTransferGratisKYC = () => {
6
6
  return <CameraCaptureEx />;
7
7
  };
8
- export default LaunchSanctumKeyKYC;
8
+ export default LaunchTransferGratisKYC;
9
9
  //# sourceMappingURL=App.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"App.js","sourceRoot":"","sources":["../../src/App.tsx"],"names":[],"mappings":"AAAA,OAAO,eAAe,MAAM,sCAAsC,CAAC;AACnE,sEAAsE;AACtE,wDAAwD;AACxD,iDAAiD;AACjD,MAAM,mBAAmB,GAAG,GAAG,EAAE;IAC7B,OAAO,CAAC,eAAe,CAAA,EAAE,CAAA;AAC7B,CAAC,CAAA;AAED,eAAe,mBAAmB,CAAC","sourcesContent":["import CameraCaptureEx from \"./components/example/CameraCaptureEx\";\n// import SelfieCaptureEx from \"./components/example/SelfieCaptureEx\";\n// import { KYCExample } from \"./components/KYCExample\";\n// import { KYCFlow } from \"./components/KYCFlow\"\nconst LaunchSanctumKeyKYC = () =>{\n return <CameraCaptureEx/>\n}\n\nexport default LaunchSanctumKeyKYC;"]}
1
+ {"version":3,"file":"App.js","sourceRoot":"","sources":["../../src/App.tsx"],"names":[],"mappings":"AAAA,OAAO,eAAe,MAAM,sCAAsC,CAAC;AACnE,sEAAsE;AACtE,wDAAwD;AACxD,iDAAiD;AACjD,MAAM,uBAAuB,GAAG,GAAG,EAAE;IACjC,OAAO,CAAC,eAAe,CAAA,EAAE,CAAA;AAC7B,CAAC,CAAA;AAED,eAAe,uBAAuB,CAAC","sourcesContent":["import CameraCaptureEx from \"./components/example/CameraCaptureEx\";\n// import SelfieCaptureEx from \"./components/example/SelfieCaptureEx\";\n// import { KYCExample } from \"./components/KYCExample\";\n// import { KYCFlow } from \"./components/KYCFlow\"\nconst LaunchTransferGratisKYC = () =>{\n return <CameraCaptureEx/>\n}\n\nexport default LaunchTransferGratisKYC;"]}
@@ -11,12 +11,12 @@ export type FileSelectedEventPayload = {
11
11
  export type ErrorEventPayload = {
12
12
  message: string;
13
13
  };
14
- export type SanctumKeySdkModuleEvents = {
14
+ export type TransfergratisSdkModuleEvents = {
15
15
  onCameraCapture: (params: CameraCaptureEventPayload) => void;
16
16
  onFileSelected: (params: FileSelectedEventPayload) => void;
17
17
  onError: (params: ErrorEventPayload) => void;
18
18
  };
19
- export type SanctumKeySdkViewProps = {
19
+ export type TransfergratisSdkViewProps = {
20
20
  instructions: string;
21
21
  showCamera: boolean;
22
22
  onCapture?: (event: {
@@ -29,4 +29,4 @@ export type SanctumKeySdkViewProps = {
29
29
  }) => void;
30
30
  style?: StyleProp<ViewStyle>;
31
31
  };
32
- //# sourceMappingURL=SanctumKeySdk.types.d.ts.map
32
+ //# sourceMappingURL=TransfergratisSdk.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TransfergratisSdk.types.d.ts","sourceRoot":"","sources":["../../src/TransfergratisSdk.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzD,MAAM,MAAM,yBAAyB,GAAG;IACtC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,QAAQ,GAAG,UAAU,CAAC;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG;IACrC,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,6BAA6B,GAAG;IAC1C,eAAe,EAAE,CAAC,MAAM,EAAE,yBAAyB,KAAK,IAAI,CAAC;IAC7D,cAAc,EAAE,CAAC,MAAM,EAAE,wBAAwB,KAAK,IAAI,CAAC;IAC3D,OAAO,EAAE,CAAC,MAAM,EAAE,iBAAiB,KAAK,IAAI,CAAC;CAC9C,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG;IACvC,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,OAAO,CAAC;IACpB,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,WAAW,EAAE;YAAE,MAAM,EAAE,SAAS,GAAG,QAAQ,CAAA;SAAE,CAAA;KAAE,KAAK,IAAI,CAAC;IAC/E,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,WAAW,EAAE,iBAAiB,CAAA;KAAE,KAAK,IAAI,CAAC;IAC9D,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;CAC9B,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=TransfergratisSdk.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TransfergratisSdk.types.js","sourceRoot":"","sources":["../../src/TransfergratisSdk.types.ts"],"names":[],"mappings":"","sourcesContent":["import type { StyleProp, ViewStyle } from 'react-native';\n\nexport type CameraCaptureEventPayload = {\n instructions?: string;\n status: 'opened' | 'captured';\n path?: string;\n};\n\nexport type FileSelectedEventPayload = {\n uri: string;\n path: string;\n};\n\nexport type ErrorEventPayload = {\n message: string;\n};\n\nexport type TransfergratisSdkModuleEvents = {\n onCameraCapture: (params: CameraCaptureEventPayload) => void;\n onFileSelected: (params: FileSelectedEventPayload) => void;\n onError: (params: ErrorEventPayload) => void;\n};\n\nexport type TransfergratisSdkViewProps = {\n instructions: string;\n showCamera: boolean;\n onCapture?: (event: { nativeEvent: { action: 'capture' | 'retake' } }) => void;\n onError?: (event: { nativeEvent: ErrorEventPayload }) => void;\n style?: StyleProp<ViewStyle>;\n};\n"]}
@@ -1,6 +1,6 @@
1
1
  import { NativeModule } from 'expo';
2
- import { SanctumKeySdkModuleEvents } from './SanctumKeySdk.types';
3
- declare class SanctumKeySdkModule extends NativeModule<SanctumKeySdkModuleEvents> {
2
+ import { TransfergratisSdkModuleEvents } from './TransfergratisSdk.types';
3
+ declare class TransfergratisSdkModule extends NativeModule<TransfergratisSdkModuleEvents> {
4
4
  PI: number;
5
5
  testModule(): Promise<string>;
6
6
  requestCameraPermission(): Promise<boolean>;
@@ -16,6 +16,6 @@ declare class SanctumKeySdkModule extends NativeModule<SanctumKeySdkModuleEvents
16
16
  error?: string;
17
17
  }>;
18
18
  }
19
- declare const _default: SanctumKeySdkModule;
19
+ declare const _default: TransfergratisSdkModule;
20
20
  export default _default;
21
- //# sourceMappingURL=SanctumKeySdkModule.d.ts.map
21
+ //# sourceMappingURL=TransfergratisSdkModule.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TransfergratisSdkModule.d.ts","sourceRoot":"","sources":["../../src/TransfergratisSdkModule.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,MAAM,CAAC;AAEpC,OAAO,EAAE,6BAA6B,EAAE,MAAM,2BAA2B,CAAC;AAE1E,OAAO,OAAO,uBAAwB,SAAQ,YAAY,CAAC,6BAA6B,CAAC;IACvF,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC;IAC7B,uBAAuB,IAAI,OAAO,CAAC,OAAO,CAAC;IAC3C,0BAA0B,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9G,cAAc,CAAC,YAAY,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CACnH;;AAGD,wBAAiF"}
@@ -1,4 +1,4 @@
1
1
  import { requireNativeModule } from 'expo-modules-core';
2
2
  // This call loads the native module object from the JSI.
3
- export default requireNativeModule('SanctumKeySdk');
4
- //# sourceMappingURL=SanctumKeySdkModule.js.map
3
+ export default requireNativeModule('TransfergratisSdk');
4
+ //# sourceMappingURL=TransfergratisSdkModule.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TransfergratisSdkModule.js","sourceRoot":"","sources":["../../src/TransfergratisSdkModule.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAcxD,yDAAyD;AACzD,eAAe,mBAAmB,CAA0B,mBAAmB,CAAC,CAAC","sourcesContent":["import { requireNativeModule } from 'expo-modules-core';\n\nimport { NativeModule } from 'expo';\n\nimport { TransfergratisSdkModuleEvents } from './TransfergratisSdk.types';\n\ndeclare class TransfergratisSdkModule extends NativeModule<TransfergratisSdkModuleEvents> {\n PI: number;\n testModule(): Promise<string>;\n requestCameraPermission(): Promise<boolean>;\n openCameraWithInstructions(instructions: string): Promise<{ success: boolean; path?: string; error?: string }>;\n openFilePicker(allowedTypes: string[]): Promise<{ success: boolean; uri?: string; path?: string; error?: string }>;\n}\n\n// This call loads the native module object from the JSI.\nexport default requireNativeModule<TransfergratisSdkModule>('TransfergratisSdk');\n"]}
@@ -1,6 +1,6 @@
1
1
  import { NativeModule } from 'expo';
2
- import { SanctumKeySdkModuleEvents } from './SanctumKeySdk.types';
3
- declare class SanctumKeySdkModule extends NativeModule<SanctumKeySdkModuleEvents> {
2
+ import { TransfergratisSdkModuleEvents } from './TransfergratisSdk.types';
3
+ declare class TransfergratisSdkModule extends NativeModule<TransfergratisSdkModuleEvents> {
4
4
  PI: number;
5
5
  requestCameraPermission(): Promise<boolean>;
6
6
  openCameraWithInstructions(instructions: string): Promise<{
@@ -15,6 +15,6 @@ declare class SanctumKeySdkModule extends NativeModule<SanctumKeySdkModuleEvents
15
15
  error?: string;
16
16
  }>;
17
17
  }
18
- declare const _default: typeof SanctumKeySdkModule;
18
+ declare const _default: typeof TransfergratisSdkModule;
19
19
  export default _default;
20
- //# sourceMappingURL=SanctumKeySdkModule.web.d.ts.map
20
+ //# sourceMappingURL=TransfergratisSdkModule.web.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TransfergratisSdkModule.web.d.ts","sourceRoot":"","sources":["../../src/TransfergratisSdkModule.web.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,MAAM,CAAC;AAEpC,OAAO,EAAE,6BAA6B,EAAE,MAAM,2BAA2B,CAAC;AAE1E,cAAM,uBAAwB,SAAQ,YAAY,CAAC,6BAA6B,CAAC;IAC/E,EAAE,SAAW;IAEP,uBAAuB,IAAI,OAAO,CAAC,OAAO,CAAC;IAK3C,0BAA0B,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAQ9G,cAAc,CAAC,YAAY,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAOzH;;AAED,wBAAqF"}
@@ -1,6 +1,6 @@
1
1
  import { registerWebModule } from 'expo-modules-core';
2
2
  import { NativeModule } from 'expo';
3
- class SanctumKeySdkModule extends NativeModule {
3
+ class TransfergratisSdkModule extends NativeModule {
4
4
  PI = Math.PI;
5
5
  async requestCameraPermission() {
6
6
  console.warn('Camera permission not available on web');
@@ -21,5 +21,5 @@ class SanctumKeySdkModule extends NativeModule {
21
21
  };
22
22
  }
23
23
  }
24
- export default registerWebModule(SanctumKeySdkModule, 'SanctumKeySdkModule');
25
- //# sourceMappingURL=SanctumKeySdkModule.web.js.map
24
+ export default registerWebModule(TransfergratisSdkModule, 'TransfergratisSdkModule');
25
+ //# sourceMappingURL=TransfergratisSdkModule.web.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TransfergratisSdkModule.web.js","sourceRoot":"","sources":["../../src/TransfergratisSdkModule.web.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,MAAM,CAAC;AAIpC,MAAM,uBAAwB,SAAQ,YAA2C;IAC/E,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;IAEb,KAAK,CAAC,uBAAuB;QAC3B,OAAO,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;QACvD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK,CAAC,0BAA0B,CAAC,YAAoB;QACnD,OAAO,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;QAC5C,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,sCAAsC;SAC9C,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,YAAsB;QACzC,OAAO,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;QACjD,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,2CAA2C;SACnD,CAAC;IACJ,CAAC;CACF;AAED,eAAe,iBAAiB,CAAC,uBAAuB,EAAE,yBAAyB,CAAC,CAAC","sourcesContent":["import { registerWebModule } from 'expo-modules-core';\nimport { NativeModule } from 'expo';\n\nimport { TransfergratisSdkModuleEvents } from './TransfergratisSdk.types';\n\nclass TransfergratisSdkModule extends NativeModule<TransfergratisSdkModuleEvents> {\n PI = Math.PI;\n \n async requestCameraPermission(): Promise<boolean> {\n console.warn('Camera permission not available on web');\n return false;\n }\n \n async openCameraWithInstructions(instructions: string): Promise<{ success: boolean; path?: string; error?: string }> {\n console.warn('Camera not available on web');\n return {\n success: false,\n error: 'Camera not available on web platform'\n };\n }\n \n async openFilePicker(allowedTypes: string[]): Promise<{ success: boolean; uri?: string; path?: string; error?: string }> {\n console.warn('File picker not available on web');\n return {\n success: false,\n error: 'File picker not available on web platform'\n };\n }\n}\n\nexport default registerWebModule(TransfergratisSdkModule, 'TransfergratisSdkModule');\n"]}
@@ -0,0 +1,4 @@
1
+ import * as React from 'react';
2
+ import { TransfergratisSdkViewProps } from './TransfergratisSdk.types';
3
+ export default function TransfergratisSdkView(props: TransfergratisSdkViewProps): React.JSX.Element;
4
+ //# sourceMappingURL=TransfergratisSdkView.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TransfergratisSdkView.d.ts","sourceRoot":"","sources":["../../src/TransfergratisSdkView.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,EAAE,0BAA0B,EAAE,MAAM,2BAA2B,CAAC;AAKvE,MAAM,CAAC,OAAO,UAAU,qBAAqB,CAAC,KAAK,EAAE,0BAA0B,qBAE9E"}
@@ -0,0 +1,7 @@
1
+ import { requireNativeView } from 'expo';
2
+ import * as React from 'react';
3
+ const NativeView = requireNativeView('TransfergratisSdk');
4
+ export default function TransfergratisSdkView(props) {
5
+ return <NativeView {...props}/>;
6
+ }
7
+ //# sourceMappingURL=TransfergratisSdkView.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TransfergratisSdkView.js","sourceRoot":"","sources":["../../src/TransfergratisSdkView.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,MAAM,CAAC;AACzC,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,MAAM,UAAU,GACd,iBAAiB,CAAC,mBAAmB,CAAC,CAAC;AAEzC,MAAM,CAAC,OAAO,UAAU,qBAAqB,CAAC,KAAiC;IAC7E,OAAO,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,EAAG,CAAC;AACnC,CAAC","sourcesContent":["import { requireNativeView } from 'expo';\nimport * as React from 'react';\n\nimport { TransfergratisSdkViewProps } from './TransfergratisSdk.types';\n\nconst NativeView: React.ComponentType<TransfergratisSdkViewProps> =\n requireNativeView('TransfergratisSdk');\n\nexport default function TransfergratisSdkView(props: TransfergratisSdkViewProps) {\n return <NativeView {...props} />;\n}\n"]}
@@ -0,0 +1,4 @@
1
+ import * as React from 'react';
2
+ import { TransfergratisSdkViewProps } from './TransfergratisSdk.types';
3
+ export default function TransfergratisSdkView(props: TransfergratisSdkViewProps): React.JSX.Element;
4
+ //# sourceMappingURL=TransfergratisSdkView.web.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TransfergratisSdkView.web.d.ts","sourceRoot":"","sources":["../../src/TransfergratisSdkView.web.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,EAAE,0BAA0B,EAAE,MAAM,2BAA2B,CAAC;AAEvE,MAAM,CAAC,OAAO,UAAU,qBAAqB,CAAC,KAAK,EAAE,0BAA0B,qBAU9E"}
@@ -1,5 +1,5 @@
1
1
  import * as React from 'react';
2
- export default function SanctumKeySdkView(props) {
2
+ export default function TransfergratisSdkView(props) {
3
3
  return (<div>
4
4
  {/* <iframe
5
5
  style={{ flex: 1 }}
@@ -8,4 +8,4 @@ export default function SanctumKeySdkView(props) {
8
8
  /> */}
9
9
  </div>);
10
10
  }
11
- //# sourceMappingURL=SanctumKeySdkView.web.js.map
11
+ //# sourceMappingURL=TransfergratisSdkView.web.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TransfergratisSdkView.web.js","sourceRoot":"","sources":["../../src/TransfergratisSdkView.web.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,MAAM,CAAC,OAAO,UAAU,qBAAqB,CAAC,KAAiC;IAC7E,OAAO,CACL,CAAC,GAAG,CACF;MAAA,CAAC;;;;aAII,CACP;IAAA,EAAE,GAAG,CAAC,CACP,CAAC;AACJ,CAAC","sourcesContent":["import * as React from 'react';\n\nimport { TransfergratisSdkViewProps } from './TransfergratisSdk.types';\n\nexport default function TransfergratisSdkView(props: TransfergratisSdkViewProps) {\n return (\n <div>\n {/* <iframe\n style={{ flex: 1 }}\n src={props.url}\n onLoad={() => props.onLoad({ nativeEvent: { url: props.url } })}\n /> */}\n </div>\n );\n}\n"]}
@@ -81,12 +81,12 @@ export class HttpClient {
81
81
  export default HttpClient;
82
82
  // ml service api
83
83
  export const mlService = new HttpClient({
84
- baseURL: 'https://api.ml.SanctumKey.com',
84
+ baseURL: 'https://api.ml.transfergratis.com',
85
85
  apiKey: 'your-api-key',
86
86
  });
87
87
  // backedn service api
88
88
  export const backendService = new HttpClient({
89
- baseURL: 'https://api.backend.SanctumKey.com',
89
+ baseURL: 'https://api.backend.transfergratis.com',
90
90
  apiKey: 'your-api-key',
91
91
  });
92
92
  //# sourceMappingURL=axios.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"axios.js","sourceRoot":"","sources":["../../../src/api/axios.ts"],"names":[],"mappings":"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","sourcesContent":["import axios, {\n AxiosInstance,\n AxiosRequestConfig,\n InternalAxiosRequestConfig,\n AxiosResponse,\n} from 'axios';\n\nexport type ApiConfiguration = {\n baseURL: string;\n apiKey?: string;\n authToken?: string;\n timeoutMs?: number;\n};\n\nexport type ApiErrorData = {\n message?: string;\n code?: string | number;\n details?: unknown;\n};\n\nexport class HttpClient {\n private instance: AxiosInstance;\n private apiKey?: string;\n private authToken?: string;\n\n constructor(configuration: ApiConfiguration) {\n this.apiKey = configuration.apiKey;\n this.authToken = configuration.authToken;\n this.instance = axios.create({\n baseURL: configuration.baseURL,\n timeout: configuration.timeoutMs ?? 15000,\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n },\n });\n\n this.instance.interceptors.request.use(\n (request: InternalAxiosRequestConfig) => {\n const headers = request.headers ?? {};\n if (this.apiKey && !headers['x-api-key']) {\n headers['x-api-key'] = this.apiKey;\n }\n if (this.authToken && !headers.Authorization) {\n headers.Authorization = `Bearer ${this.authToken}`;\n }\n request.headers = headers;\n return request;\n },\n (error) => Promise.reject(error)\n );\n\n this.instance.interceptors.response.use(\n (response: AxiosResponse) => response,\n (error) => {\n if (!error.response) {\n return Promise.reject({\n message: 'Network error. Please check your connection.',\n code: 'network_error',\n details: error?.message,\n } as ApiErrorData);\n }\n const { status, data } = error.response as AxiosResponse<ApiErrorData>;\n if (status === 401) {\n return Promise.reject({\n message: data?.message || 'Unauthorized',\n code: 401,\n details: data,\n } as ApiErrorData);\n }\n return Promise.reject({\n message: data?.message || 'Request failed',\n code: status,\n details: data,\n } as ApiErrorData);\n }\n );\n }\n\n setAuthToken(token?: string): void {\n this.authToken = token;\n }\n\n setApiKey(key?: string): void {\n this.apiKey = key;\n }\n\n setBaseURL(url: string): void {\n this.instance.defaults.baseURL = url;\n }\n\n async get<T = unknown>(url: string, requestConfig?: AxiosRequestConfig): Promise<T> {\n const res = await this.instance.get<T>(url, requestConfig);\n return res.data as T;\n }\n\n async post<T = unknown, B = unknown>(\n url: string,\n body?: B,\n requestConfig?: AxiosRequestConfig\n ): Promise<T> {\n const res = await this.instance.post<T>(url, body, requestConfig);\n return res.data as T;\n }\n\n async put<T = unknown, B = unknown>(\n url: string,\n body?: B,\n requestConfig?: AxiosRequestConfig\n ): Promise<T> {\n const res = await this.instance.put<T>(url, body, requestConfig);\n return res.data as T;\n }\n\n async patch<T = unknown, B = unknown>(\n url: string,\n body?: B,\n requestConfig?: AxiosRequestConfig\n ): Promise<T> {\n const res = await this.instance.patch<T>(url, body, requestConfig);\n return res.data as T;\n }\n\n async delete<T = unknown>(url: string, requestConfig?: AxiosRequestConfig): Promise<T> {\n const res = await this.instance.delete<T>(url, requestConfig);\n return res.data as T;\n }\n}\n\nexport default HttpClient;\n\n\n// ml service api\nexport const mlService = new HttpClient({\n baseURL: 'https://api.ml.SanctumKey.com',\n apiKey: 'your-api-key',\n});\n// backedn service api\nexport const backendService = new HttpClient({\n baseURL: 'https://api.backend.SanctumKey.com',\n apiKey: 'your-api-key',\n});\n\n\n"]}
1
+ {"version":3,"file":"axios.js","sourceRoot":"","sources":["../../../src/api/axios.ts"],"names":[],"mappings":"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","sourcesContent":["import axios, {\n AxiosInstance,\n AxiosRequestConfig,\n InternalAxiosRequestConfig,\n AxiosResponse,\n} from 'axios';\n\nexport type ApiConfiguration = {\n baseURL: string;\n apiKey?: string;\n authToken?: string;\n timeoutMs?: number;\n};\n\nexport type ApiErrorData = {\n message?: string;\n code?: string | number;\n details?: unknown;\n};\n\nexport class HttpClient {\n private instance: AxiosInstance;\n private apiKey?: string;\n private authToken?: string;\n\n constructor(configuration: ApiConfiguration) {\n this.apiKey = configuration.apiKey;\n this.authToken = configuration.authToken;\n this.instance = axios.create({\n baseURL: configuration.baseURL,\n timeout: configuration.timeoutMs ?? 15000,\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n },\n });\n\n this.instance.interceptors.request.use(\n (request: InternalAxiosRequestConfig) => {\n const headers = request.headers ?? {};\n if (this.apiKey && !headers['x-api-key']) {\n headers['x-api-key'] = this.apiKey;\n }\n if (this.authToken && !headers.Authorization) {\n headers.Authorization = `Bearer ${this.authToken}`;\n }\n request.headers = headers;\n return request;\n },\n (error) => Promise.reject(error)\n );\n\n this.instance.interceptors.response.use(\n (response: AxiosResponse) => response,\n (error) => {\n if (!error.response) {\n return Promise.reject({\n message: 'Network error. Please check your connection.',\n code: 'network_error',\n details: error?.message,\n } as ApiErrorData);\n }\n const { status, data } = error.response as AxiosResponse<ApiErrorData>;\n if (status === 401) {\n return Promise.reject({\n message: data?.message || 'Unauthorized',\n code: 401,\n details: data,\n } as ApiErrorData);\n }\n return Promise.reject({\n message: data?.message || 'Request failed',\n code: status,\n details: data,\n } as ApiErrorData);\n }\n );\n }\n\n setAuthToken(token?: string): void {\n this.authToken = token;\n }\n\n setApiKey(key?: string): void {\n this.apiKey = key;\n }\n\n setBaseURL(url: string): void {\n this.instance.defaults.baseURL = url;\n }\n\n async get<T = unknown>(url: string, requestConfig?: AxiosRequestConfig): Promise<T> {\n const res = await this.instance.get<T>(url, requestConfig);\n return res.data as T;\n }\n\n async post<T = unknown, B = unknown>(\n url: string,\n body?: B,\n requestConfig?: AxiosRequestConfig\n ): Promise<T> {\n const res = await this.instance.post<T>(url, body, requestConfig);\n return res.data as T;\n }\n\n async put<T = unknown, B = unknown>(\n url: string,\n body?: B,\n requestConfig?: AxiosRequestConfig\n ): Promise<T> {\n const res = await this.instance.put<T>(url, body, requestConfig);\n return res.data as T;\n }\n\n async patch<T = unknown, B = unknown>(\n url: string,\n body?: B,\n requestConfig?: AxiosRequestConfig\n ): Promise<T> {\n const res = await this.instance.patch<T>(url, body, requestConfig);\n return res.data as T;\n }\n\n async delete<T = unknown>(url: string, requestConfig?: AxiosRequestConfig): Promise<T> {\n const res = await this.instance.delete<T>(url, requestConfig);\n return res.data as T;\n }\n}\n\nexport default HttpClient;\n\n\n// ml service api\nexport const mlService = new HttpClient({\n baseURL: 'https://api.ml.transfergratis.com',\n apiKey: 'your-api-key',\n});\n// backedn service api\nexport const backendService = new HttpClient({\n baseURL: 'https://api.backend.transfergratis.com',\n apiKey: 'your-api-key',\n});\n\n\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"EnhancedCameraView.d.ts","sourceRoot":"","sources":["../../../src/components/EnhancedCameraView.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmD,MAAM,OAAO,CAAC;AAKxE,OAAO,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AAGzD,eAAO,MAAM,kBAAkB,EAAE,KAAK,CAAC,EAAE,CAAC,uBAAuB,CA6MhE,CAAC"}
1
+ {"version":3,"file":"EnhancedCameraView.d.ts","sourceRoot":"","sources":["../../../src/components/EnhancedCameraView.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmD,MAAM,OAAO,CAAC;AAKxE,OAAO,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AAGzD,eAAO,MAAM,kBAAkB,EAAE,KAAK,CAAC,EAAE,CAAC,uBAAuB,CAqJhE,CAAC"}
@@ -1,5 +1,5 @@
1
1
  import React, { useCallback, useEffect, useRef, useState } from 'react';
2
- import { View, StyleSheet, Text, AppState, ActivityIndicator } from 'react-native';
2
+ import { View, StyleSheet, Text, AppState } from 'react-native';
3
3
  import { Camera, useCameraDevice } from 'react-native-vision-camera';
4
4
  import VisionCameraModule from '../modules/camera/VisionCameraModule';
5
5
  import { useI18n } from '../hooks/useI18n';
@@ -10,11 +10,10 @@ export const EnhancedCameraView = ({ showCamera, cameraType: initialCameraType =
10
10
  const isCapturingRef = useRef(false);
11
11
  const isProcessingRef = useRef(isProcessing);
12
12
  const [cameraType] = useState(initialCameraType);
13
+ // 🚨 BUG FIX: Initialize to null to prevent the "Flicker" on retake
13
14
  const [hasPermission, setHasPermission] = useState(null);
14
15
  const [isInitialized, setIsInitialized] = useState(false);
15
16
  const [refreshCamera, setRefreshCamera] = useState(false);
16
- // 🚨 ADDED: A timeout state to show a refresh button if the camera gets stuck booting
17
- const [showInitTimeout, setShowInitTimeout] = useState(false);
18
17
  const device = useCameraDevice(cameraType);
19
18
  useEffect(() => {
20
19
  isProcessingRef.current = isProcessing;
@@ -38,10 +37,8 @@ export const EnhancedCameraView = ({ showCamera, cameraType: initialCameraType =
38
37
  }
39
38
  };
40
39
  useEffect(() => {
41
- if (showCamera) {
42
- setIsInitialized(false); // Reset init state when checking permissions/refreshing
40
+ if (showCamera)
43
41
  checkPermissions();
44
- }
45
42
  }, [showCamera, refreshCamera]);
46
43
  useEffect(() => {
47
44
  const subscription = AppState.addEventListener('change', nextAppState => {
@@ -51,23 +48,7 @@ export const EnhancedCameraView = ({ showCamera, cameraType: initialCameraType =
51
48
  });
52
49
  return () => subscription.remove();
53
50
  }, [showCamera, hasPermission]);
54
- useEffect(() => {
55
- let timer;
56
- if (hasPermission && device && showCamera && !isInitialized) {
57
- timer = setTimeout(() => setShowInitTimeout(true), 3000);
58
- }
59
- else {
60
- setShowInitTimeout(false);
61
- }
62
- return () => {
63
- if (timer)
64
- clearTimeout(timer);
65
- };
66
- }, [hasPermission, device, showCamera, isInitialized]);
67
- const onInitialized = useCallback(() => {
68
- setIsInitialized(true);
69
- setShowInitTimeout(false);
70
- }, []);
51
+ const onInitialized = useCallback(() => setIsInitialized(true), []);
71
52
  const onCameraError = useCallback((error) => {
72
53
  onError?.({ message: error.message || t('camera.errorOccurred') });
73
54
  }, [onError, t]);
@@ -95,6 +76,7 @@ export const EnhancedCameraView = ({ showCamera, cameraType: initialCameraType =
95
76
  isCapturingRef.current = false;
96
77
  }
97
78
  }, [isInitialized, onSilentCapture, silentCaptureResult]);
79
+ // 🚨 BUG FIX: The Warm-up Timer (Fixes Blurry Images)
98
80
  useEffect(() => {
99
81
  if (!showCamera || !isInitialized || isProcessing)
100
82
  return;
@@ -105,7 +87,7 @@ export const EnhancedCameraView = ({ showCamera, cameraType: initialCameraType =
105
87
  return;
106
88
  intervalId = setInterval(() => {
107
89
  captureSilentPhoto();
108
- }, 1500);
90
+ }, 1500); // 1.5s gives the hardware more time to stabilize between shots
109
91
  }, 1000);
110
92
  return () => {
111
93
  isActive = false;
@@ -115,56 +97,25 @@ export const EnhancedCameraView = ({ showCamera, cameraType: initialCameraType =
115
97
  };
116
98
  }, [showCamera, isInitialized, isProcessing, captureSilentPhoto]);
117
99
  // --- RENDERERS ---
100
+ // 🚨 BUG FIX: Show nothing while checking permissions (Stops flicker)
118
101
  if (hasPermission === null) {
119
102
  return <View style={[styles.container, style]}/>;
120
103
  }
121
104
  if (hasPermission === false) {
122
- return (<View style={[styles.container, style, styles.centerContent]}>
105
+ return (<View style={[styles.container, style, { justifyContent: 'center', alignItems: 'center' }]}>
123
106
  <Text style={styles.permissionMessage}>{t('camera.permissionRequired')}</Text>
124
107
  <Button title="Refresh Camera" onPress={() => setRefreshCamera(prev => !prev)} variant="primary"/>
125
108
  </View>);
126
109
  }
127
- // 🚨 FIX: Don't return an invisible blank screen if the device is loading!
128
- // Give them a UI and a way out.
129
- if (!device || !showCamera) {
130
- return (<View style={[styles.container, style, styles.centerContent]}>
131
- <ActivityIndicator size="large" color="#2DBD60" style={{ marginBottom: 16 }}/>
132
- <Text style={styles.permissionMessage}>Loading Camera Hardware...</Text>
133
- <Button title="Refresh" onPress={() => setRefreshCamera(prev => !prev)} variant="outline"/>
134
- </View>);
135
- }
110
+ if (!device || !showCamera)
111
+ return <View style={[styles.container, style]}/>;
136
112
  return (<View style={[styles.container, style]}>
137
- <Camera
138
- // 🚨 FIX: This key forces the native component to completely remount
139
- // when permissions are granted or when manually refreshed.
140
- key={`cam-${hasPermission}-${refreshCamera ? '1' : '0'}`} ref={camera} style={StyleSheet.absoluteFill} device={device} isActive={showCamera && !isProcessing} photo={true} video={false} audio={false} onInitialized={onInitialized} onError={onCameraError}/>
141
-
142
- {/* 🚨 FIX: Floating Refresh Button if the hardware freezes on a black screen */}
143
- {!isInitialized && showInitTimeout && (<View style={styles.stuckOverlay}>
144
- <ActivityIndicator size="large" color="#2DBD60" style={{ marginBottom: 16 }}/>
145
- <Text style={{ color: 'white', marginBottom: 16, fontWeight: 'bold' }}>
146
- Camera is taking a while to start...
147
- </Text>
148
- <Button title="Restart Camera" onPress={() => {
149
- setIsInitialized(false);
150
- setRefreshCamera(prev => !prev);
151
- }} variant="primary"/>
152
- </View>)}
153
-
113
+ <Camera ref={camera} style={StyleSheet.absoluteFill} device={device} isActive={showCamera && !isProcessing} photo={true} video={false} audio={false} onInitialized={onInitialized} onError={onCameraError}/>
154
114
  {overlayComponent}
155
115
  </View>);
156
116
  };
157
117
  const styles = StyleSheet.create({
158
118
  container: { flex: 1, backgroundColor: 'black' },
159
- centerContent: { justifyContent: 'center', alignItems: 'center', padding: 20 },
160
- permissionMessage: { color: 'white', textAlign: 'center', marginBottom: 20, fontSize: 16, fontWeight: '600' },
161
- stuckOverlay: {
162
- ...StyleSheet.absoluteFillObject,
163
- justifyContent: 'center',
164
- alignItems: 'center',
165
- backgroundColor: 'rgba(0,0,0,0.85)',
166
- zIndex: 1000,
167
- padding: 20
168
- }
119
+ permissionMessage: { color: 'white', textAlign: 'center', margin: 20, fontSize: 16 },
169
120
  });
170
121
  //# sourceMappingURL=EnhancedCameraView.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"EnhancedCameraView.js","sourceRoot":"","sources":["../../../src/components/EnhancedCameraView.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useCallback, useEffect, useRef, useState } from 'react';\nimport { View, StyleSheet, Text, AppState, ActivityIndicator } from 'react-native';\nimport { Camera, useCameraDevice } from 'react-native-vision-camera';\nimport VisionCameraModule from '../modules/camera/VisionCameraModule';\nimport { useI18n } from '../hooks/useI18n';\nimport { EnhancedCameraViewProps } from './OverLay/type';\nimport { Button } from './ui/Button';\n\nexport const EnhancedCameraView: React.FC<EnhancedCameraViewProps> = ({\n showCamera,\n cameraType: initialCameraType = 'front',\n style,\n onError,\n onSilentCapture,\n silentCaptureResult,\n isProcessing = false,\n overlayComponent,\n}) => {\n const { t } = useI18n();\n const camera = useRef<Camera>(null);\n\n const isCapturingRef = useRef(false);\n const isProcessingRef = useRef(isProcessing);\n\n const [cameraType] = useState<'front' | 'back'>(initialCameraType);\n\n const [hasPermission, setHasPermission] = useState<boolean | null>(null);\n const [isInitialized, setIsInitialized] = useState(false);\n const [refreshCamera, setRefreshCamera] = useState(false);\n \n // 🚨 ADDED: A timeout state to show a refresh button if the camera gets stuck booting\n const [showInitTimeout, setShowInitTimeout] = useState(false);\n\n const device = useCameraDevice(cameraType);\n\n useEffect(() => {\n isProcessingRef.current = isProcessing;\n }, [isProcessing]);\n\n const checkPermissions = async () => {\n try {\n const hasAllPermissions = await VisionCameraModule.hasAllPermissions();\n if (!hasAllPermissions) {\n const granted = await VisionCameraModule.requestAllPermissions();\n if (!granted) {\n setHasPermission(false);\n onError?.({ message: t('camera.permissionRequired') });\n return;\n }\n }\n setHasPermission(true);\n } catch (error) {\n setHasPermission(false);\n onError?.({ message: t('camera.errorOccurred') });\n }\n };\n\n useEffect(() => {\n if (showCamera) {\n setIsInitialized(false); // Reset init state when checking permissions/refreshing\n checkPermissions();\n }\n }, [showCamera, refreshCamera]);\n\n useEffect(() => {\n const subscription = AppState.addEventListener('change', nextAppState => {\n if (nextAppState === 'active' && showCamera && hasPermission === false) {\n checkPermissions();\n }\n });\n return () => subscription.remove();\n }, [showCamera, hasPermission]);\n\n\n useEffect(() => {\n let timer: ReturnType<typeof setTimeout>;\n\n if (hasPermission && device && showCamera && !isInitialized) {\n timer = setTimeout(() => setShowInitTimeout(true), 3000); \n } else {\n setShowInitTimeout(false);\n }\n\n return () => {\n if (timer) clearTimeout(timer);\n };\n }, [hasPermission, device, showCamera, isInitialized]);\n\n const onInitialized = useCallback(() => {\n setIsInitialized(true);\n setShowInitTimeout(false);\n }, []);\n\n const onCameraError = useCallback((error: any) => {\n onError?.({ message: error.message || t('camera.errorOccurred') });\n }, [onError, t]);\n\n const captureSilentPhoto = useCallback(async () => {\n if (!camera.current || !isInitialized || isProcessingRef.current || isCapturingRef.current) return;\n if (silentCaptureResult?.isAnalyzing) return;\n\n try {\n isCapturingRef.current = true;\n const photo = await camera.current.takePhoto({\n enableShutterSound: false,\n flash: 'off',\n });\n const result = await VisionCameraModule.processPhotoResult(photo);\n\n onSilentCapture?.({\n ...result,\n path: result.path || photo.path,\n });\n } catch (error) {\n // Silent background fail\n } finally {\n isCapturingRef.current = false;\n }\n }, [isInitialized, onSilentCapture, silentCaptureResult]);\n\n useEffect(() => {\n if (!showCamera || !isInitialized || isProcessing) return;\n\n let isActive = true;\n let intervalId: ReturnType<typeof setInterval>;\n\n const warmupTimer = setTimeout(() => {\n if (!isActive) return;\n intervalId = setInterval(() => {\n captureSilentPhoto();\n }, 1500); \n }, 1000);\n\n return () => {\n isActive = false;\n clearTimeout(warmupTimer);\n if (intervalId) clearInterval(intervalId);\n };\n }, [showCamera, isInitialized, isProcessing, captureSilentPhoto]);\n\n // --- RENDERERS ---\n\n if (hasPermission === null) {\n return <View style={[styles.container, style]} />;\n }\n\n if (hasPermission === false) {\n return (\n <View style={[styles.container, style, styles.centerContent]}>\n <Text style={styles.permissionMessage}>{t('camera.permissionRequired')}</Text>\n <Button\n title=\"Refresh Camera\"\n onPress={() => setRefreshCamera(prev => !prev)}\n variant=\"primary\"\n />\n </View>\n );\n }\n\n // 🚨 FIX: Don't return an invisible blank screen if the device is loading! \n // Give them a UI and a way out.\n if (!device || !showCamera) {\n return (\n <View style={[styles.container, style, styles.centerContent]}>\n <ActivityIndicator size=\"large\" color=\"#2DBD60\" style={{ marginBottom: 16 }} />\n <Text style={styles.permissionMessage}>Loading Camera Hardware...</Text>\n <Button \n title=\"Refresh\" \n onPress={() => setRefreshCamera(prev => !prev)} \n variant=\"outline\" \n />\n </View>\n );\n }\n\n return (\n <View style={[styles.container, style]}>\n <Camera\n // 🚨 FIX: This key forces the native component to completely remount \n // when permissions are granted or when manually refreshed.\n key={`cam-${hasPermission}-${refreshCamera ? '1' : '0'}`} \n ref={camera}\n style={StyleSheet.absoluteFill}\n device={device}\n isActive={showCamera && !isProcessing}\n photo={true}\n video={false}\n audio={false}\n onInitialized={onInitialized}\n onError={onCameraError}\n />\n \n {/* 🚨 FIX: Floating Refresh Button if the hardware freezes on a black screen */}\n {!isInitialized && showInitTimeout && (\n <View style={styles.stuckOverlay}>\n <ActivityIndicator size=\"large\" color=\"#2DBD60\" style={{ marginBottom: 16 }} />\n <Text style={{ color: 'white', marginBottom: 16, fontWeight: 'bold' }}>\n Camera is taking a while to start...\n </Text>\n <Button \n title=\"Restart Camera\" \n onPress={() => {\n setIsInitialized(false);\n setRefreshCamera(prev => !prev);\n }} \n variant=\"primary\" \n />\n </View>\n )}\n\n {overlayComponent}\n </View>\n );\n};\n\nconst styles = StyleSheet.create({\n container: { flex: 1, backgroundColor: 'black' },\n centerContent: { justifyContent: 'center', alignItems: 'center', padding: 20 },\n permissionMessage: { color: 'white', textAlign: 'center', marginBottom: 20, fontSize: 16, fontWeight: '600' },\n stuckOverlay: {\n ...StyleSheet.absoluteFillObject,\n justifyContent: 'center',\n alignItems: 'center',\n backgroundColor: 'rgba(0,0,0,0.85)',\n zIndex: 1000,\n padding: 20\n }\n});"]}
1
+ {"version":3,"file":"EnhancedCameraView.js","sourceRoot":"","sources":["../../../src/components/EnhancedCameraView.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useCallback, useEffect, useRef, useState } from 'react';\nimport { View, StyleSheet, Text, AppState } from 'react-native';\nimport { Camera, useCameraDevice } from 'react-native-vision-camera';\nimport VisionCameraModule from '../modules/camera/VisionCameraModule';\nimport { useI18n } from '../hooks/useI18n';\nimport { EnhancedCameraViewProps } from './OverLay/type';\nimport { Button } from './ui/Button';\n\nexport const EnhancedCameraView: React.FC<EnhancedCameraViewProps> = ({ \n showCamera,\n cameraType: initialCameraType = 'front',\n style,\n onError,\n onSilentCapture, \n silentCaptureResult,\n isProcessing = false, \n overlayComponent,\n}) => {\n const { t } = useI18n();\n const camera = useRef<Camera>(null);\n \n const isCapturingRef = useRef(false);\n const isProcessingRef = useRef(isProcessing);\n\n const [cameraType] = useState<'front' | 'back'>(initialCameraType);\n \n // 🚨 BUG FIX: Initialize to null to prevent the \"Flicker\" on retake\n const [hasPermission, setHasPermission] = useState<boolean | null>(null);\n const [isInitialized, setIsInitialized] = useState(false);\n const [refreshCamera, setRefreshCamera] = useState(false);\n\n const device = useCameraDevice(cameraType);\n\n useEffect(() => {\n isProcessingRef.current = isProcessing;\n }, [isProcessing]);\n\n const checkPermissions = async () => {\n try {\n const hasAllPermissions = await VisionCameraModule.hasAllPermissions();\n if (!hasAllPermissions) {\n const granted = await VisionCameraModule.requestAllPermissions();\n if (!granted) {\n setHasPermission(false);\n onError?.({ message: t('camera.permissionRequired') });\n return;\n }\n }\n setHasPermission(true);\n } catch (error) {\n setHasPermission(false);\n onError?.({ message: t('camera.errorOccurred') });\n }\n };\n\n useEffect(() => {\n if (showCamera) checkPermissions();\n }, [showCamera, refreshCamera]);\n\n useEffect(() => {\n const subscription = AppState.addEventListener('change', nextAppState => {\n if (nextAppState === 'active' && showCamera && hasPermission === false) {\n checkPermissions();\n }\n });\n return () => subscription.remove();\n }, [showCamera, hasPermission]);\n\n const onInitialized = useCallback(() => setIsInitialized(true), []);\n const onCameraError = useCallback((error: any) => {\n onError?.({ message: error.message || t('camera.errorOccurred') });\n }, [onError, t]);\n\n const captureSilentPhoto = useCallback(async () => {\n if (!camera.current || !isInitialized || isProcessingRef.current || isCapturingRef.current) return;\n if (silentCaptureResult?.isAnalyzing) return;\n\n try {\n isCapturingRef.current = true; \n const photo = await camera.current.takePhoto({\n enableShutterSound: false, \n flash: 'off', \n });\n\n const result = await VisionCameraModule.processPhotoResult(photo);\n \n onSilentCapture?.({\n ...result,\n path: result.path || photo.path, \n });\n\n } catch (error) {\n // Silent background fail\n } finally {\n isCapturingRef.current = false; \n }\n }, [isInitialized, onSilentCapture, silentCaptureResult]);\n\n // 🚨 BUG FIX: The Warm-up Timer (Fixes Blurry Images)\n useEffect(() => {\n if (!showCamera || !isInitialized || isProcessing) return;\n \n let isActive = true;\n let intervalId: ReturnType<typeof setInterval>;\n\n const warmupTimer = setTimeout(() => {\n if (!isActive) return;\n intervalId = setInterval(() => {\n captureSilentPhoto();\n }, 1500); // 1.5s gives the hardware more time to stabilize between shots\n }, 1000); \n \n return () => {\n isActive = false;\n clearTimeout(warmupTimer);\n if (intervalId) clearInterval(intervalId);\n };\n }, [showCamera, isInitialized, isProcessing, captureSilentPhoto]);\n\n // --- RENDERERS ---\n \n // 🚨 BUG FIX: Show nothing while checking permissions (Stops flicker)\n if (hasPermission === null) {\n return <View style={[styles.container, style]} />;\n }\n\n if (hasPermission === false) {\n return (\n <View style={[styles.container, style, { justifyContent: 'center', alignItems: 'center' }]}>\n <Text style={styles.permissionMessage}>{t('camera.permissionRequired')}</Text>\n <Button \n title=\"Refresh Camera\" \n onPress={() => setRefreshCamera(prev => !prev)} \n variant=\"primary\"\n />\n </View>\n );\n }\n\n if (!device || !showCamera) return <View style={[styles.container, style]} />;\n\n return (\n <View style={[styles.container, style]}>\n <Camera\n ref={camera}\n style={StyleSheet.absoluteFill}\n device={device}\n isActive={showCamera && !isProcessing}\n photo={true}\n video={false} \n audio={false} \n onInitialized={onInitialized}\n onError={onCameraError}\n />\n {overlayComponent}\n </View>\n );\n};\n\nconst styles = StyleSheet.create({\n container: { flex: 1, backgroundColor: 'black' },\n permissionMessage: { color: 'white', textAlign: 'center', margin: 20, fontSize: 16 },\n});"]}
@@ -1 +1 @@
1
- {"version":3,"file":"EmailVerificationTemplate.d.ts","sourceRoot":"","sources":["../../../../src/components/KYCElements/EmailVerificationTemplate.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAsC,MAAM,OAAO,CAAC;AAE3D,OAAO,EAAE,iBAAiB,EAAiB,MAAM,uBAAuB,CAAC;AAMzE,UAAU,8BAA8B;IACpC,SAAS,EAAE,iBAAiB,CAAC;IAC7B,KAAK,CAAC,EAAE,GAAG,CAAC;IACZ,aAAa,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI,CAAC;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACrB;AASD,eAAO,MAAM,yBAAyB,EAAE,KAAK,CAAC,EAAE,CAAC,8BAA8B,CAkP9E,CAAC"}
1
+ {"version":3,"file":"EmailVerificationTemplate.d.ts","sourceRoot":"","sources":["../../../../src/components/KYCElements/EmailVerificationTemplate.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAsC,MAAM,OAAO,CAAC;AAE3D,OAAO,EAAE,iBAAiB,EAAiB,MAAM,uBAAuB,CAAC;AAMzE,UAAU,8BAA8B;IACpC,SAAS,EAAE,iBAAiB,CAAC;IAC7B,KAAK,CAAC,EAAE,GAAG,CAAC;IACZ,aAAa,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI,CAAC;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACrB;AASD,eAAO,MAAM,yBAAyB,EAAE,KAAK,CAAC,EAAE,CAAC,8BAA8B,CAwN9E,CAAC"}