omnipay-reactnative-sdk 1.2.2-beta.9 → 1.2.3-beta.10

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 (97) hide show
  1. package/README.md +58 -48
  2. package/android/build.gradle +4 -7
  3. package/android/src/main/AndroidManifest.xml +0 -5
  4. package/android/src/main/java/com/omniretail/omnipay/FaceVerificationFrameProcessor.kt +111 -0
  5. package/android/src/main/java/com/omniretail/omnipay/OmnipayActivityPackage.java +6 -4
  6. package/ios/FaceVerificationFrameProcessor.swift +138 -0
  7. package/ios/FaceVerificationFrameProcessorPlugin.m +4 -0
  8. package/ios/OmnipayReactnativeSdk.m +5 -0
  9. package/ios/OmnipayReactnativeSdk.swift +10 -0
  10. package/ios/omnipay_reactnative_sdk.h +6 -0
  11. package/lib/commonjs/components/Button.js +68 -0
  12. package/lib/commonjs/components/Button.js.map +1 -0
  13. package/lib/commonjs/components/OmnipayProvider.js +7 -23
  14. package/lib/commonjs/components/OmnipayProvider.js.map +1 -1
  15. package/lib/commonjs/components/biometrics/FaceVerification.js +294 -270
  16. package/lib/commonjs/components/biometrics/FaceVerification.js.map +1 -1
  17. package/lib/commonjs/components/biometrics/useFaceVerification.js +85 -0
  18. package/lib/commonjs/components/biometrics/useFaceVerification.js.map +1 -0
  19. package/lib/commonjs/components/biometrics/useFaceVerificationFlow.js +157 -0
  20. package/lib/commonjs/components/biometrics/useFaceVerificationFlow.js.map +1 -0
  21. package/lib/commonjs/index.js +0 -33
  22. package/lib/commonjs/index.js.map +1 -1
  23. package/lib/module/components/Button.js +61 -0
  24. package/lib/module/components/Button.js.map +1 -0
  25. package/lib/module/components/OmnipayProvider.js +7 -23
  26. package/lib/module/components/OmnipayProvider.js.map +1 -1
  27. package/lib/module/components/biometrics/FaceVerification.js +294 -271
  28. package/lib/module/components/biometrics/FaceVerification.js.map +1 -1
  29. package/lib/module/components/biometrics/useFaceVerification.js +78 -0
  30. package/lib/module/components/biometrics/useFaceVerification.js.map +1 -0
  31. package/lib/module/components/biometrics/useFaceVerificationFlow.js +150 -0
  32. package/lib/module/components/biometrics/useFaceVerificationFlow.js.map +1 -0
  33. package/lib/module/index.js +0 -6
  34. package/lib/module/index.js.map +1 -1
  35. package/lib/typescript/components/Button.d.ts +17 -0
  36. package/lib/typescript/components/Button.d.ts.map +1 -0
  37. package/lib/typescript/components/OmnipayProvider.d.ts.map +1 -1
  38. package/lib/typescript/components/biometrics/FaceVerification.d.ts +1 -3
  39. package/lib/typescript/components/biometrics/FaceVerification.d.ts.map +1 -1
  40. package/lib/typescript/components/biometrics/useFaceVerification.d.ts +38 -0
  41. package/lib/typescript/components/biometrics/useFaceVerification.d.ts.map +1 -0
  42. package/lib/typescript/components/biometrics/useFaceVerificationFlow.d.ts +29 -0
  43. package/lib/typescript/components/biometrics/useFaceVerificationFlow.d.ts.map +1 -0
  44. package/lib/typescript/index.d.ts +0 -2
  45. package/lib/typescript/index.d.ts.map +1 -1
  46. package/omnipay_reactnative_sdk.podspec +46 -0
  47. package/package.json +5 -8
  48. package/src/components/Button.tsx +86 -0
  49. package/src/components/OmnipayProvider.tsx +7 -24
  50. package/src/components/biometrics/FaceVerification.tsx +315 -309
  51. package/src/components/biometrics/useFaceVerification.ts +120 -0
  52. package/src/components/biometrics/useFaceVerificationFlow.ts +224 -0
  53. package/src/index.tsx +0 -7
  54. package/android/src/main/java/com/omniretail/omnipay/OmnipayLivenessCameraView.java +0 -153
  55. package/android/src/main/java/com/omniretail/omnipay/OmnipayLivenessCameraViewManager.java +0 -49
  56. package/android/src/main/java/com/omniretail/omnipay/OmnipayLivenessModule.java +0 -557
  57. package/ios/OmnipayLivenessCameraView.h +0 -15
  58. package/ios/OmnipayLivenessCameraView.m +0 -80
  59. package/ios/OmnipayLivenessCameraViewManager.m +0 -19
  60. package/ios/OmnipayLivenessModule.h +0 -38
  61. package/ios/OmnipayLivenessModule.m +0 -615
  62. package/lib/commonjs/components/biometrics/LivenessDetection.js +0 -149
  63. package/lib/commonjs/components/biometrics/LivenessDetection.js.map +0 -1
  64. package/lib/commonjs/components/biometrics/OmnipayLivenessCameraView.js +0 -15
  65. package/lib/commonjs/components/biometrics/OmnipayLivenessCameraView.js.map +0 -1
  66. package/lib/commonjs/components/biometrics/PermissionManager.js +0 -279
  67. package/lib/commonjs/components/biometrics/PermissionManager.js.map +0 -1
  68. package/lib/commonjs/components/biometrics/index.js +0 -45
  69. package/lib/commonjs/components/biometrics/index.js.map +0 -1
  70. package/lib/commonjs/components/biometrics/types.js +0 -17
  71. package/lib/commonjs/components/biometrics/types.js.map +0 -1
  72. package/lib/module/components/biometrics/LivenessDetection.js +0 -129
  73. package/lib/module/components/biometrics/LivenessDetection.js.map +0 -1
  74. package/lib/module/components/biometrics/OmnipayLivenessCameraView.js +0 -7
  75. package/lib/module/components/biometrics/OmnipayLivenessCameraView.js.map +0 -1
  76. package/lib/module/components/biometrics/PermissionManager.js +0 -272
  77. package/lib/module/components/biometrics/PermissionManager.js.map +0 -1
  78. package/lib/module/components/biometrics/index.js +0 -12
  79. package/lib/module/components/biometrics/index.js.map +0 -1
  80. package/lib/module/components/biometrics/types.js +0 -16
  81. package/lib/module/components/biometrics/types.js.map +0 -1
  82. package/lib/typescript/components/biometrics/LivenessDetection.d.ts +0 -33
  83. package/lib/typescript/components/biometrics/LivenessDetection.d.ts.map +0 -1
  84. package/lib/typescript/components/biometrics/OmnipayLivenessCameraView.d.ts +0 -18
  85. package/lib/typescript/components/biometrics/OmnipayLivenessCameraView.d.ts.map +0 -1
  86. package/lib/typescript/components/biometrics/PermissionManager.d.ts +0 -58
  87. package/lib/typescript/components/biometrics/PermissionManager.d.ts.map +0 -1
  88. package/lib/typescript/components/biometrics/index.d.ts +0 -5
  89. package/lib/typescript/components/biometrics/index.d.ts.map +0 -1
  90. package/lib/typescript/components/biometrics/types.d.ts +0 -73
  91. package/lib/typescript/components/biometrics/types.d.ts.map +0 -1
  92. package/omnipay-reactnative-sdk.podspec +0 -50
  93. package/src/components/biometrics/LivenessDetection.ts +0 -178
  94. package/src/components/biometrics/OmnipayLivenessCameraView.tsx +0 -19
  95. package/src/components/biometrics/PermissionManager.ts +0 -317
  96. package/src/components/biometrics/index.ts +0 -11
  97. package/src/components/biometrics/types.ts +0 -86
@@ -6,160 +6,119 @@ Object.defineProperty(exports, "__esModule", {
6
6
  exports.default = void 0;
7
7
  var _react = _interopRequireWildcard(require("react"));
8
8
  var _reactNative = require("react-native");
9
- var _LivenessDetection = require("./LivenessDetection");
10
- var _OmnipayLivenessCameraView = require("./OmnipayLivenessCameraView");
11
- var _PermissionManager = require("./PermissionManager");
12
- var _types = require("./types");
9
+ var _reactNativeVisionCamera = require("react-native-vision-camera");
10
+ var _Button = _interopRequireDefault(require("../Button"));
11
+ var _useFaceVerification = require("./useFaceVerification");
12
+ var _useFaceVerificationFlow = require("./useFaceVerificationFlow");
13
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
13
14
  function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
14
15
  const FaceVerification = ({
15
16
  onClose,
16
17
  onSuccess,
17
- primaryColor,
18
- config
18
+ primaryColor
19
19
  }) => {
20
- const [state, setState] = (0, _react.useState)('initializing');
21
- const [error, setError] = (0, _react.useState)(null);
22
- const [isSupported, setIsSupported] = (0, _react.useState)(false);
23
- const [currentChallenge, setCurrentChallenge] = (0, _react.useState)(null);
24
- const [challengeProgress, setChallengeProgress] = (0, _react.useState)('');
25
- (0, _react.useEffect)(() => {
26
- checkSupport();
27
- // eslint-disable-next-line react-hooks/exhaustive-deps
28
- }, []);
29
- const checkSupport = async () => {
30
- try {
31
- console.log('🔍 Starting liveness detection initialization...');
20
+ const device = (0, _reactNativeVisionCamera.useCameraDevice)('front');
21
+ const {
22
+ hasPermission,
23
+ requestPermission
24
+ } = (0, _reactNativeVisionCamera.useCameraPermission)();
25
+ const [isRequestingPermission, setIsRequestingPermission] = (0, _react.useState)(false);
32
26
 
33
- // Step 1: Request camera permission first
34
- console.log('📹 Requesting camera permission...');
35
- const permissionResponse = await _PermissionManager.CameraPermissionManager.requestCameraPermission();
36
- if (permissionResponse.result !== _PermissionManager.PermissionResult.GRANTED) {
37
- console.log('❌ Camera permission denied:', permissionResponse.result);
38
- setState('failed');
39
- setError(permissionResponse.result === _PermissionManager.PermissionResult.BLOCKED ? 'Camera permission is blocked. Please enable it in device settings.' : 'Camera permission is required for face verification.');
40
- return;
41
- }
42
- console.log('✅ Camera permission granted');
27
+ // Face verification flow
28
+ const {
29
+ state: flowState,
30
+ resetFlow,
31
+ isCompleted,
32
+ isFailed
33
+ } = (0, _useFaceVerificationFlow.useFaceVerificationFlow)();
43
34
 
44
- // Step 2: Check device support (hardware/framework capability)
45
- console.log('🔍 Checking device capabilities...');
46
- const supported = await _LivenessDetection.LivenessDetection.isSupported();
47
- console.log('📱 Device support result:', supported);
48
- setIsSupported(supported);
49
- if (supported) {
50
- console.log('✅ Device supports liveness detection, starting...');
51
- await startDetection();
52
- } else {
53
- console.log('❌ Device does not support liveness detection');
54
- setState('failed');
55
- setError('Liveness detection is not supported on this device');
56
- }
57
- } catch (err) {
58
- console.error('💥 Error during initialization:', err);
59
- setState('failed');
60
- setError('Failed to initialize liveness detection');
61
- }
62
- };
63
- const startDetection = async () => {
64
- if (!isSupported) {
65
- return;
35
+ // Frame processor
36
+ const frameProcessor = (0, _useFaceVerification.useFaceVerification)();
37
+
38
+ // Handle completion
39
+ (0, _react.useEffect)(() => {
40
+ if (isCompleted) {
41
+ setTimeout(() => {
42
+ onSuccess();
43
+ }, 1000); // Show success message briefly
66
44
  }
67
- setState('starting');
68
- setError(null);
45
+ }, [isCompleted, onSuccess]);
46
+ const handleRequestPermission = async () => {
47
+ setIsRequestingPermission(true);
69
48
  try {
70
- // Permission already checked in checkSupport(), proceed with detection
71
- console.log('🚀 Starting liveness detection with config...');
72
- const livenessConfig = {
73
- ..._LivenessDetection.LivenessDetection.getDefaultConfig(),
74
- ...config
75
- };
76
- const result = await _LivenessDetection.LivenessDetection.startDetection(livenessConfig, {
77
- onChallengeStart: challenge => {
78
- setCurrentChallenge(challenge);
79
- setState('running');
80
- setChallengeProgress(getChallengeInstruction(challenge));
81
- },
82
- onChallengeSuccess: (challenge, _challengeResult) => {
83
- setChallengeProgress(`✓ ${getChallengeInstruction(challenge)} completed`);
84
- },
85
- onChallengeFailure: (challenge, reason) => {
86
- setError(`Failed: ${reason}, ${challenge}`);
87
- },
88
- onAllChallengesComplete: () => {
89
- setChallengeProgress('All challenges completed! Taking final photo...');
90
- },
91
- onScreenshotCaptured: _screenshot => {
92
- // Screenshot captured, detection will complete soon
93
- },
94
- onDetectionFailed: reason => {
95
- setError(reason);
96
- setState('failed');
97
- }
98
- });
99
- if (result.success) {
100
- setState('completed');
101
- setTimeout(() => {
102
- onSuccess(result);
103
- }, 1000); // Brief delay to show success state
104
- } else {
105
- setState('failed');
106
- setError(result.failureReason || 'Face verification failed');
107
- }
108
- } catch (err) {
109
- setState('failed');
110
- setError(err instanceof Error ? err.message : 'Unknown error occurred');
111
- }
112
- };
113
- const getChallengeInstruction = challenge => {
114
- switch (challenge) {
115
- case _types.LivenessChallenge.SMILE:
116
- return 'Please smile';
117
- case _types.LivenessChallenge.BLINK:
118
- return 'Please blink';
119
- case _types.LivenessChallenge.TURN_LEFT:
120
- return 'Please turn your head left';
121
- case _types.LivenessChallenge.TURN_RIGHT:
122
- return 'Please turn your head right';
123
- default:
124
- return 'Follow the instruction';
49
+ await requestPermission();
50
+ } catch (error) {
51
+ console.error('Error requesting camera permission:', error);
52
+ } finally {
53
+ setIsRequestingPermission(false);
125
54
  }
126
55
  };
127
- const getStateMessage = () => {
128
- switch (state) {
129
- case 'initializing':
130
- return 'Initializing camera...';
131
- case 'starting':
132
- return 'Starting face verification...';
133
- case 'running':
134
- return challengeProgress || 'Look at the camera';
135
- case 'completed':
136
- return 'Face verification completed!';
137
- case 'failed':
138
- return error || 'Face verification failed';
139
- default:
140
- return 'Please wait...';
141
- }
142
- };
143
- const getStateColor = () => {
144
- switch (state) {
145
- case 'completed':
146
- return '#4CAF50';
147
- case 'failed':
148
- return '#F44336';
149
- case 'running':
150
- return primaryColor;
151
- default:
152
- return '#666';
153
- }
154
- };
155
- const handleRetry = () => {
156
- setState('initializing');
157
- setError(null);
158
- setCurrentChallenge(null);
159
- setChallengeProgress('');
160
- checkSupport();
56
+ const renderPermissionRequest = () => /*#__PURE__*/_react.default.createElement(_reactNative.View, {
57
+ style: styles.permissionContainer
58
+ }, /*#__PURE__*/_react.default.createElement(_reactNative.View, {
59
+ style: styles.permissionIconContainer
60
+ }, /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
61
+ style: styles.permissionIcon
62
+ }, "\uD83D\uDCF7")), /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
63
+ style: styles.permissionTitle
64
+ }, "Camera Permission Required"), /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
65
+ style: styles.permissionDescription
66
+ }, "To verify your identity, we need access to your camera. This allows us to capture your face for secure verification."), /*#__PURE__*/_react.default.createElement(_Button.default, {
67
+ title: "Allow Camera Access",
68
+ onPress: handleRequestPermission,
69
+ backgroundColor: primaryColor,
70
+ loading: isRequestingPermission
71
+ }));
72
+ const renderNoDevice = () => /*#__PURE__*/_react.default.createElement(_reactNative.View, {
73
+ style: styles.errorContainer
74
+ }, /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
75
+ style: styles.errorTitle
76
+ }, "Camera Not Available"), /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
77
+ style: styles.errorSubtitle
78
+ }, "No front camera detected on this device. Face verification requires a front-facing camera."));
79
+ const renderCamera = () => {
80
+ if (!device) return null;
81
+ return /*#__PURE__*/_react.default.createElement(_reactNative.View, {
82
+ style: styles.cameraContainer
83
+ }, /*#__PURE__*/_react.default.createElement(_reactNativeVisionCamera.Camera, {
84
+ device: device,
85
+ style: styles.camera,
86
+ isActive: true,
87
+ frameProcessor: frameProcessor
88
+ }), /*#__PURE__*/_react.default.createElement(_reactNative.View, {
89
+ style: styles.cameraOverlay
90
+ }, /*#__PURE__*/_react.default.createElement(_reactNative.View, {
91
+ style: styles.faceFrame
92
+ }), /*#__PURE__*/_react.default.createElement(_reactNative.View, {
93
+ style: styles.progressContainer
94
+ }, /*#__PURE__*/_react.default.createElement(_reactNative.View, {
95
+ style: [styles.progressBar, {
96
+ width: `${flowState.progress}%`,
97
+ backgroundColor: primaryColor
98
+ }]
99
+ })), /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
100
+ style: styles.instructionText
101
+ }, flowState.instruction), /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
102
+ style: styles.stepIndicator
103
+ }, "Step ", flowState.completedSteps.length + 1, " of 5"), isCompleted && /*#__PURE__*/_react.default.createElement(_reactNative.View, {
104
+ style: [styles.statusContainer, {
105
+ backgroundColor: primaryColor
106
+ }]
107
+ }, /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
108
+ style: styles.statusText
109
+ }, "\u2713 Verification Complete!")), isFailed && /*#__PURE__*/_react.default.createElement(_reactNative.View, {
110
+ style: [styles.statusContainer, styles.statusContainerError]
111
+ }, /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
112
+ style: styles.statusText
113
+ }, "\u2717 Verification Failed"), /*#__PURE__*/_react.default.createElement(_Button.default, {
114
+ title: "Try Again",
115
+ onPress: resetFlow,
116
+ backgroundColor: "white",
117
+ textColor: "#ff4444",
118
+ style: styles.retryButton
119
+ }))));
161
120
  };
162
- const showRetryButton = state === 'failed' && error !== 'Camera permission is blocked. Please enable it in device settings.';
121
+ console.log(onSuccess, primaryColor);
163
122
  return /*#__PURE__*/_react.default.createElement(_reactNative.Modal, {
164
123
  visible: true,
165
124
  transparent: true,
@@ -168,7 +127,7 @@ const FaceVerification = ({
168
127
  }, /*#__PURE__*/_react.default.createElement(_reactNative.TouchableOpacity, {
169
128
  style: styles.backdrop,
170
129
  activeOpacity: 1,
171
- onPress: () => {}
130
+ onPress: onClose
172
131
  }, /*#__PURE__*/_react.default.createElement(_reactNative.View, {
173
132
  style: [styles.container]
174
133
  }, /*#__PURE__*/_react.default.createElement(_reactNative.TouchableOpacity, {
@@ -179,178 +138,243 @@ const FaceVerification = ({
179
138
  style: styles.closeIcon
180
139
  })), /*#__PURE__*/_react.default.createElement(_reactNative.View, {
181
140
  style: styles.contentContainer
182
- }, /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
183
- style: styles.title
184
- }, "Face Verification"), /*#__PURE__*/_react.default.createElement(_reactNative.View, {
185
- style: styles.cameraContainer
186
- }, state === 'running' && isSupported ? /*#__PURE__*/_react.default.createElement(_OmnipayLivenessCameraView.OmnipayLivenessCameraView, {
187
- style: styles.camera
188
- }) : /*#__PURE__*/_react.default.createElement(_reactNative.View, {
189
- style: [styles.camera, styles.cameraPlaceholder]
190
- }, state === 'initializing' || state === 'starting' ? /*#__PURE__*/_react.default.createElement(_reactNative.ActivityIndicator, {
191
- size: "large",
192
- color: primaryColor
193
- }) : state === 'completed' ? /*#__PURE__*/_react.default.createElement(_reactNative.View, {
194
- style: styles.successIcon
195
- }, /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
196
- style: styles.successText
197
- }, "\u2713")) : /*#__PURE__*/_react.default.createElement(_reactNative.View, {
198
- style: styles.errorIcon
199
- }, /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
200
- style: styles.errorText
201
- }, "!"))), /*#__PURE__*/_react.default.createElement(_reactNative.View, {
202
- style: styles.overlay
203
- }, /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
204
- style: [styles.instruction, {
205
- color: getStateColor()
206
- }]
207
- }, getStateMessage()))), state === 'running' && currentChallenge && /*#__PURE__*/_react.default.createElement(_reactNative.View, {
208
- style: styles.progressContainer
209
- }, /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
210
- style: styles.challengeText
211
- }, getChallengeInstruction(currentChallenge))), /*#__PURE__*/_react.default.createElement(_reactNative.View, {
212
- style: styles.buttonContainer
213
- }, showRetryButton && /*#__PURE__*/_react.default.createElement(_reactNative.TouchableOpacity, {
214
- style: [styles.retryButton, {
215
- backgroundColor: primaryColor
216
- }],
217
- onPress: handleRetry
218
- }, /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
219
- style: styles.retryButtonText
220
- }, "Try Again")))))));
141
+ }, !hasPermission && renderPermissionRequest(), hasPermission && !device && renderNoDevice(), hasPermission && device && renderCamera()))));
221
142
  };
222
- const {
223
- width: screenWidth,
224
- height: screenHeight
225
- } = _reactNative.Dimensions.get('window');
143
+ var _default = exports.default = FaceVerification;
226
144
  const styles = _reactNative.StyleSheet.create({
227
- modal: {
228
- margin: 0
145
+ hide: {
146
+ display: 'none'
229
147
  },
230
- backdrop: {
148
+ full: {
149
+ flex: 1,
150
+ width: '100%',
151
+ height: '100%'
152
+ },
153
+ webview: {
231
154
  flex: 1,
232
- backgroundColor: 'rgba(0, 0, 0, 0.8)',
155
+ width: '100%',
156
+ height: _reactNative.Dimensions.get('window').height - 40,
157
+ backgroundColor: 'white',
158
+ borderTopRightRadius: 20,
159
+ borderTopLeftRadius: 20,
160
+ paddingTop: 150
161
+ },
162
+ webviewLoader: {
163
+ zIndex: 3,
164
+ backgroundColor: 'white',
165
+ alignItems: 'center',
233
166
  justifyContent: 'center',
234
- alignItems: 'center'
167
+ flex: 1,
168
+ width: '100%',
169
+ height: '100%',
170
+ position: 'absolute',
171
+ top: 0,
172
+ left: 0,
173
+ borderTopRightRadius: 20,
174
+ borderTopLeftRadius: 20
175
+ },
176
+ backdrop: {
177
+ backgroundColor: 'rgba(0,0,0,0.3)',
178
+ flex: 1,
179
+ justifyContent: 'flex-end',
180
+ position: 'relative',
181
+ height: '100%'
235
182
  },
236
183
  container: {
237
- width: screenWidth * 0.9,
238
- maxHeight: screenHeight * 0.8,
239
184
  backgroundColor: 'white',
240
- borderRadius: 16,
241
- padding: 20,
242
- alignItems: 'center'
185
+ borderTopRightRadius: 20,
186
+ borderTopLeftRadius: 20,
187
+ maxHeight: _reactNative.Dimensions.get('window').height - 120,
188
+ flex: 1,
189
+ position: 'relative',
190
+ ...(_reactNative.Platform.OS === 'android' && {
191
+ overflow: 'hidden'
192
+ })
193
+ },
194
+ modal: {
195
+ flex: 1,
196
+ backgroundColor: 'rgba(0,0,0,0.48)',
197
+ height: '100%',
198
+ width: '100%'
243
199
  },
244
200
  close: {
245
201
  position: 'absolute',
246
- top: 15,
247
- right: 15,
248
- zIndex: 10,
249
- padding: 5
202
+ top: 10,
203
+ right: 10,
204
+ backgroundColor: 'white',
205
+ height: 24,
206
+ width: 24,
207
+ borderRadius: 1000,
208
+ alignItems: 'center',
209
+ justifyContent: 'center',
210
+ zIndex: 2
250
211
  },
251
212
  closeIcon: {
252
- width: 20,
253
- height: 20,
254
- tintColor: '#666'
213
+ height: 12,
214
+ width: 12
255
215
  },
256
216
  contentContainer: {
257
- width: '100%',
258
- alignItems: 'center',
259
- paddingTop: 20
217
+ height: '100%',
218
+ position: 'relative',
219
+ borderTopRightRadius: 20,
220
+ borderTopLeftRadius: 20,
221
+ padding: 16
222
+ },
223
+ testContent: {
224
+ paddingTop: 30,
225
+ paddingLeft: 16
260
226
  },
261
- title: {
262
- fontSize: 24,
263
- fontWeight: 'bold',
264
- color: '#333',
227
+ testTwoContent: {
228
+ paddingTop: 10,
229
+ paddingLeft: 16
230
+ },
231
+ errorSubtitle: {
232
+ textAlign: 'center',
233
+ fontSize: 14,
234
+ color: '#5e7079',
265
235
  marginBottom: 20,
266
- textAlign: 'center'
236
+ paddingHorizontal: 8,
237
+ marginTop: 14
267
238
  },
268
- cameraContainer: {
269
- width: screenWidth * 0.7,
270
- height: screenWidth * 0.9,
271
- borderRadius: 12,
272
- overflow: 'hidden',
273
- backgroundColor: '#f0f0f0',
274
- position: 'relative',
275
- marginBottom: 20
239
+ errorContainer: {
240
+ flex: 1,
241
+ justifyContent: 'center',
242
+ alignItems: 'center',
243
+ width: _reactNative.Dimensions.get('window').width,
244
+ height: _reactNative.Dimensions.get('window').height,
245
+ zIndex: 2,
246
+ backgroundColor: 'white'
276
247
  },
277
248
  camera: {
278
- flex: 1,
279
249
  width: '100%',
280
- height: '100%'
250
+ height: 400
281
251
  },
282
- cameraPlaceholder: {
252
+ // Permission request styles
253
+ permissionContainer: {
254
+ flex: 1,
283
255
  justifyContent: 'center',
284
256
  alignItems: 'center',
285
- backgroundColor: '#f5f5f5'
257
+ paddingHorizontal: 24,
258
+ paddingVertical: 40
286
259
  },
287
- overlay: {
288
- position: 'absolute',
289
- bottom: 0,
290
- left: 0,
291
- right: 0,
292
- backgroundColor: 'rgba(0, 0, 0, 0.7)',
293
- padding: 15,
294
- alignItems: 'center'
260
+ permissionIconContainer: {
261
+ width: 80,
262
+ height: 80,
263
+ borderRadius: 40,
264
+ backgroundColor: '#f0f0f0',
265
+ justifyContent: 'center',
266
+ alignItems: 'center',
267
+ marginBottom: 24
295
268
  },
296
- instruction: {
297
- fontSize: 16,
269
+ permissionIcon: {
270
+ fontSize: 40
271
+ },
272
+ permissionTitle: {
273
+ fontSize: 20,
298
274
  fontWeight: '600',
275
+ color: '#1a1a1a',
299
276
  textAlign: 'center',
300
- color: 'white'
277
+ marginBottom: 12
301
278
  },
302
- progressContainer: {
303
- marginBottom: 20,
304
- alignItems: 'center'
279
+ permissionDescription: {
280
+ fontSize: 16,
281
+ color: '#666',
282
+ textAlign: 'center',
283
+ lineHeight: 22,
284
+ marginBottom: 32
305
285
  },
306
- challengeText: {
286
+ // Error styles
287
+ errorTitle: {
307
288
  fontSize: 18,
308
289
  fontWeight: '600',
309
- color: '#333',
310
- textAlign: 'center'
290
+ color: '#1a1a1a',
291
+ textAlign: 'center',
292
+ marginBottom: 8
311
293
  },
312
- buttonContainer: {
313
- flexDirection: 'row',
314
- justifyContent: 'center',
315
- gap: 15
294
+ // Camera styles
295
+ cameraContainer: {
296
+ flex: 1,
297
+ position: 'relative',
298
+ marginTop: 60
316
299
  },
317
- retryButton: {
318
- paddingHorizontal: 30,
319
- paddingVertical: 12,
320
- borderRadius: 8,
300
+ cameraOverlay: {
301
+ position: 'absolute',
302
+ top: 0,
303
+ left: 0,
304
+ right: 0,
305
+ bottom: 0,
306
+ justifyContent: 'center',
321
307
  alignItems: 'center'
322
308
  },
323
- retryButtonText: {
309
+ faceFrame: {
310
+ width: 200,
311
+ height: 250,
312
+ borderWidth: 3,
313
+ borderColor: 'white',
314
+ borderRadius: 100,
315
+ borderStyle: 'dashed',
316
+ backgroundColor: 'transparent'
317
+ },
318
+ instructionText: {
324
319
  color: 'white',
325
320
  fontSize: 16,
326
- fontWeight: '600'
321
+ fontWeight: '500',
322
+ textAlign: 'center',
323
+ marginTop: 20,
324
+ backgroundColor: 'rgba(0,0,0,0.7)',
325
+ paddingHorizontal: 16,
326
+ paddingVertical: 8,
327
+ borderRadius: 20
327
328
  },
328
- successIcon: {
329
- width: 60,
330
- height: 60,
331
- borderRadius: 30,
332
- backgroundColor: '#4CAF50',
333
- justifyContent: 'center',
334
- alignItems: 'center'
329
+ // Verification flow styles
330
+ progressContainer: {
331
+ position: 'absolute',
332
+ top: 20,
333
+ left: 20,
334
+ right: 20,
335
+ height: 4,
336
+ backgroundColor: 'rgba(255,255,255,0.3)',
337
+ borderRadius: 2,
338
+ overflow: 'hidden'
335
339
  },
336
- successText: {
337
- fontSize: 30,
340
+ progressBar: {
341
+ height: '100%',
342
+ borderRadius: 2
343
+ },
344
+ stepIndicator: {
338
345
  color: 'white',
339
- fontWeight: 'bold'
346
+ fontSize: 14,
347
+ fontWeight: '400',
348
+ textAlign: 'center',
349
+ marginTop: 8,
350
+ backgroundColor: 'rgba(0,0,0,0.5)',
351
+ paddingHorizontal: 12,
352
+ paddingVertical: 4,
353
+ borderRadius: 12,
354
+ alignSelf: 'center'
340
355
  },
341
- errorIcon: {
342
- width: 60,
343
- height: 60,
344
- borderRadius: 30,
345
- backgroundColor: '#F44336',
346
- justifyContent: 'center',
356
+ statusContainer: {
357
+ position: 'absolute',
358
+ bottom: 40,
359
+ left: 20,
360
+ right: 20,
361
+ padding: 20,
362
+ borderRadius: 12,
347
363
  alignItems: 'center'
348
364
  },
349
- errorText: {
350
- fontSize: 30,
365
+ statusContainerError: {
366
+ backgroundColor: '#ff4444'
367
+ },
368
+ statusText: {
351
369
  color: 'white',
352
- fontWeight: 'bold'
370
+ fontSize: 18,
371
+ fontWeight: '600',
372
+ textAlign: 'center',
373
+ marginBottom: 8
374
+ },
375
+ retryButton: {
376
+ marginTop: 12,
377
+ minWidth: 120
353
378
  }
354
379
  });
355
- var _default = exports.default = FaceVerification;
356
380
  //# sourceMappingURL=FaceVerification.js.map