omnipay-reactnative-sdk 1.2.2-beta.3 → 1.2.2-beta.6

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 (135) hide show
  1. package/README.md +93 -43
  2. package/android/build.gradle +16 -15
  3. package/android/src/main/AndroidManifest.xml +1 -1
  4. package/android/src/main/java/com/omniretail/omnipay/OmnipayActivityPackage.java +2 -2
  5. package/android/src/main/java/com/omniretail/omnipay/OmnipayLivenessCameraView.java +153 -0
  6. package/android/src/main/java/com/omniretail/omnipay/OmnipayLivenessCameraViewManager.java +49 -0
  7. package/android/src/main/java/com/omniretail/omnipay/OmnipayLivenessModule.java +524 -0
  8. package/ios/OmnipayLivenessCameraView.h +15 -0
  9. package/ios/OmnipayLivenessCameraView.m +80 -0
  10. package/ios/OmnipayLivenessCameraViewManager.m +19 -0
  11. package/ios/OmnipayLivenessModule.h +38 -0
  12. package/ios/OmnipayLivenessModule.m +554 -0
  13. package/lib/commonjs/components/OmnipayProvider.js +2 -66
  14. package/lib/commonjs/components/OmnipayProvider.js.map +1 -1
  15. package/lib/commonjs/components/OmnipayView.js.map +1 -1
  16. package/lib/commonjs/components/biometrics/FaceVerification.js +252 -345
  17. package/lib/commonjs/components/biometrics/FaceVerification.js.map +1 -1
  18. package/lib/commonjs/components/biometrics/LivenessDetection.js +90 -198
  19. package/lib/commonjs/components/biometrics/LivenessDetection.js.map +1 -1
  20. package/lib/commonjs/components/biometrics/OmnipayLivenessCameraView.js +15 -0
  21. package/lib/commonjs/components/biometrics/OmnipayLivenessCameraView.js.map +1 -0
  22. package/lib/commonjs/components/biometrics/PermissionManager.js +279 -0
  23. package/lib/commonjs/components/biometrics/PermissionManager.js.map +1 -0
  24. package/lib/commonjs/components/biometrics/index.js +45 -0
  25. package/lib/commonjs/components/biometrics/index.js.map +1 -0
  26. package/lib/commonjs/components/biometrics/types.js +17 -0
  27. package/lib/commonjs/components/biometrics/types.js.map +1 -0
  28. package/lib/commonjs/components/views/BvnVerification.js.map +1 -1
  29. package/lib/commonjs/components/views/PaylaterAgreement.js.map +1 -1
  30. package/lib/commonjs/components/views/Registration.js.map +1 -1
  31. package/lib/commonjs/index.js +23 -18
  32. package/lib/commonjs/index.js.map +1 -1
  33. package/lib/module/components/OmnipayProvider.js +3 -67
  34. package/lib/module/components/OmnipayProvider.js.map +1 -1
  35. package/lib/module/components/OmnipayView.js.map +1 -1
  36. package/lib/module/components/biometrics/FaceVerification.js +254 -346
  37. package/lib/module/components/biometrics/FaceVerification.js.map +1 -1
  38. package/lib/module/components/biometrics/LivenessDetection.js +75 -197
  39. package/lib/module/components/biometrics/LivenessDetection.js.map +1 -1
  40. package/lib/module/components/biometrics/OmnipayLivenessCameraView.js +7 -0
  41. package/lib/module/components/biometrics/OmnipayLivenessCameraView.js.map +1 -0
  42. package/lib/module/components/biometrics/PermissionManager.js +272 -0
  43. package/lib/module/components/biometrics/PermissionManager.js.map +1 -0
  44. package/lib/module/components/biometrics/index.js +12 -0
  45. package/lib/module/components/biometrics/index.js.map +1 -0
  46. package/lib/module/components/biometrics/types.js +16 -0
  47. package/lib/module/components/biometrics/types.js.map +1 -0
  48. package/lib/module/components/views/BvnVerification.js.map +1 -1
  49. package/lib/module/components/views/PaylaterAgreement.js.map +1 -1
  50. package/lib/module/components/views/Registration.js.map +1 -1
  51. package/lib/module/index.js +5 -4
  52. package/lib/module/index.js.map +1 -1
  53. package/lib/typescript/{src/components → components}/OmnipayProvider.d.ts +1 -1
  54. package/lib/typescript/components/OmnipayProvider.d.ts.map +1 -0
  55. package/lib/typescript/{src/components → components}/OmnipayView.d.ts +21 -20
  56. package/lib/typescript/components/OmnipayView.d.ts.map +1 -0
  57. package/lib/typescript/components/biometrics/FaceVerification.d.ts +11 -0
  58. package/lib/typescript/components/biometrics/FaceVerification.d.ts.map +1 -0
  59. package/lib/typescript/components/biometrics/LivenessDetection.d.ts +33 -0
  60. package/lib/typescript/components/biometrics/LivenessDetection.d.ts.map +1 -0
  61. package/lib/typescript/components/biometrics/OmnipayLivenessCameraView.d.ts +18 -0
  62. package/lib/typescript/components/biometrics/OmnipayLivenessCameraView.d.ts.map +1 -0
  63. package/lib/typescript/components/biometrics/PermissionManager.d.ts +58 -0
  64. package/lib/typescript/components/biometrics/PermissionManager.d.ts.map +1 -0
  65. package/lib/typescript/components/biometrics/index.d.ts +5 -0
  66. package/lib/typescript/components/biometrics/index.d.ts.map +1 -0
  67. package/lib/typescript/components/biometrics/types.d.ts +73 -0
  68. package/lib/typescript/components/biometrics/types.d.ts.map +1 -0
  69. package/lib/typescript/{src/components → components}/views/BvnVerification.d.ts +2 -1
  70. package/lib/typescript/components/views/BvnVerification.d.ts.map +1 -0
  71. package/lib/typescript/{src/components → components}/views/PaylaterAgreement.d.ts +2 -1
  72. package/lib/typescript/components/views/PaylaterAgreement.d.ts.map +1 -0
  73. package/lib/typescript/{src/components → components}/views/Registration.d.ts +2 -1
  74. package/lib/typescript/components/views/Registration.d.ts.map +1 -0
  75. package/lib/typescript/functions.d.ts.map +1 -0
  76. package/lib/typescript/hooks/useOmnipay.d.ts +28 -0
  77. package/lib/typescript/hooks/useOmnipay.d.ts.map +1 -0
  78. package/lib/typescript/index.d.ts +7 -0
  79. package/lib/typescript/index.d.ts.map +1 -0
  80. package/lib/typescript/lib/colors.d.ts.map +1 -0
  81. package/lib/typescript/lib/config.d.ts.map +1 -0
  82. package/omnipay-reactnative-sdk.podspec +32 -29
  83. package/package.json +16 -11
  84. package/src/components/OmnipayProvider.tsx +3 -106
  85. package/src/components/OmnipayView.tsx +1 -1
  86. package/src/components/biometrics/FaceVerification.tsx +291 -368
  87. package/src/components/biometrics/LivenessDetection.ts +113 -250
  88. package/src/components/biometrics/OmnipayLivenessCameraView.tsx +19 -0
  89. package/src/components/biometrics/PermissionManager.ts +317 -0
  90. package/src/components/biometrics/index.ts +11 -0
  91. package/src/components/biometrics/types.ts +86 -0
  92. package/src/components/views/BvnVerification.tsx +1 -1
  93. package/src/components/views/PaylaterAgreement.tsx +1 -1
  94. package/src/components/views/Registration.tsx +1 -1
  95. package/src/index.tsx +4 -15
  96. package/android/src/main/java/com/omniretail/omnipay/LivenessCameraViewManager.java +0 -116
  97. package/android/src/main/java/com/omniretail/omnipay/LivenessDetectionModule.java +0 -588
  98. package/ios/LivenessCameraView.h +0 -22
  99. package/ios/LivenessCameraView.m +0 -135
  100. package/ios/LivenessCameraViewManager.h +0 -12
  101. package/ios/LivenessCameraViewManager.m +0 -24
  102. package/ios/LivenessDetectionModule.h +0 -46
  103. package/ios/LivenessDetectionModule.m +0 -603
  104. package/lib/commonjs/components/biometrics/LivenessCameraView.js +0 -45
  105. package/lib/commonjs/components/biometrics/LivenessCameraView.js.map +0 -1
  106. package/lib/module/components/biometrics/LivenessCameraView.js +0 -39
  107. package/lib/module/components/biometrics/LivenessCameraView.js.map +0 -1
  108. package/lib/typescript/demo/src/App.d.ts +0 -3
  109. package/lib/typescript/demo/src/App.d.ts.map +0 -1
  110. package/lib/typescript/demo/src/Body.d.ts +0 -3
  111. package/lib/typescript/demo/src/Body.d.ts.map +0 -1
  112. package/lib/typescript/demo/src/NotificationsExample.d.ts +0 -4
  113. package/lib/typescript/demo/src/NotificationsExample.d.ts.map +0 -1
  114. package/lib/typescript/src/components/OmnipayProvider.d.ts.map +0 -1
  115. package/lib/typescript/src/components/OmnipayView.d.ts.map +0 -1
  116. package/lib/typescript/src/components/biometrics/FaceVerification.d.ts +0 -12
  117. package/lib/typescript/src/components/biometrics/FaceVerification.d.ts.map +0 -1
  118. package/lib/typescript/src/components/biometrics/LivenessCameraView.d.ts +0 -22
  119. package/lib/typescript/src/components/biometrics/LivenessCameraView.d.ts.map +0 -1
  120. package/lib/typescript/src/components/biometrics/LivenessDetection.d.ts +0 -73
  121. package/lib/typescript/src/components/biometrics/LivenessDetection.d.ts.map +0 -1
  122. package/lib/typescript/src/components/views/BvnVerification.d.ts.map +0 -1
  123. package/lib/typescript/src/components/views/PaylaterAgreement.d.ts.map +0 -1
  124. package/lib/typescript/src/components/views/Registration.d.ts.map +0 -1
  125. package/lib/typescript/src/functions.d.ts.map +0 -1
  126. package/lib/typescript/src/hooks/useOmnipay.d.ts +0 -28
  127. package/lib/typescript/src/hooks/useOmnipay.d.ts.map +0 -1
  128. package/lib/typescript/src/index.d.ts +0 -8
  129. package/lib/typescript/src/index.d.ts.map +0 -1
  130. package/lib/typescript/src/lib/colors.d.ts.map +0 -1
  131. package/lib/typescript/src/lib/config.d.ts.map +0 -1
  132. package/src/components/biometrics/LivenessCameraView.tsx +0 -61
  133. /package/lib/typescript/{src/functions.d.ts → functions.d.ts} +0 -0
  134. /package/lib/typescript/{src/lib → lib}/colors.d.ts +0 -0
  135. /package/lib/typescript/{src/lib → lib}/config.d.ts +0 -0
@@ -1,427 +1,335 @@
1
- import React, { useState, useEffect, useCallback } from 'react';
2
- import { View, Text, Modal, Dimensions, Platform, StyleSheet, TouchableOpacity, ActivityIndicator } from 'react-native';
1
+ import React, { useState, useEffect } from 'react';
2
+ import { View, Modal, Dimensions, StyleSheet, TouchableOpacity, Image, Text, ActivityIndicator } from 'react-native';
3
3
  import { LivenessDetection } from './LivenessDetection';
4
- import LivenessCameraView from './LivenessCameraView';
4
+ import { OmnipayLivenessCameraView } from './OmnipayLivenessCameraView';
5
+ import { CameraPermissionManager, PermissionResult } from './PermissionManager';
6
+ import { LivenessChallenge } from './types';
5
7
  const FaceVerification = ({
6
8
  onClose,
7
9
  onSuccess,
8
10
  primaryColor,
9
- challenges = ['smile', 'blink', 'turn_left'],
10
- timeout = 300000 // 5 minutes default
11
+ config
11
12
  }) => {
12
- const [detectionState, setDetectionState] = useState('idle');
13
- const [currentChallenge, setCurrentChallenge] = useState('');
14
- const [completedChallenges, setCompletedChallenges] = useState([]);
15
- const [error, setError] = useState('');
16
- const [isLoading, setIsLoading] = useState(false);
17
-
18
- // Challenge instruction messages
19
- const getChallengeInstruction = challenge => {
20
- switch (challenge) {
21
- case 'smile':
22
- return 'Please smile naturally';
23
- case 'blink':
24
- return 'Please blink your eyes';
25
- case 'turn_left':
26
- return 'Please turn your head to the left';
27
- case 'turn_right':
28
- return 'Please turn your head to the right';
29
- default:
30
- return 'Please follow the instruction';
13
+ const [state, setState] = useState('initializing');
14
+ const [error, setError] = useState(null);
15
+ const [isSupported, setIsSupported] = useState(false);
16
+ const [currentChallenge, setCurrentChallenge] = useState(null);
17
+ const [challengeProgress, setChallengeProgress] = useState('');
18
+ useEffect(() => {
19
+ checkSupport();
20
+ // eslint-disable-next-line react-hooks/exhaustive-deps
21
+ }, []);
22
+ const checkSupport = async () => {
23
+ try {
24
+ const supported = await LivenessDetection.isSupported();
25
+ setIsSupported(supported);
26
+ if (supported) {
27
+ await startDetection();
28
+ } else {
29
+ setState('failed');
30
+ setError('Liveness detection is not supported on this device');
31
+ }
32
+ } catch (err) {
33
+ setState('failed');
34
+ setError('Failed to initialize liveness detection');
31
35
  }
32
36
  };
33
- const startLivenessDetection = useCallback(async () => {
37
+ const startDetection = async () => {
38
+ if (!isSupported) {
39
+ return;
40
+ }
41
+ setState('starting');
42
+ setError(null);
34
43
  try {
35
- setDetectionState('starting');
36
- setIsLoading(true);
37
- setError('');
38
-
39
44
  // Check and request camera permission first
40
- const hasPermission = await LivenessDetection.checkCameraPermission();
41
- if (!hasPermission) {
42
- const granted = await LivenessDetection.requestCameraPermission();
43
- if (!granted) {
44
- throw new Error('Camera permission is required for face verification');
45
- }
45
+ const permissionResponse = await CameraPermissionManager.requestCameraPermission();
46
+ if (permissionResponse.result !== PermissionResult.GRANTED) {
47
+ setState('failed');
48
+ setError(permissionResponse.result === PermissionResult.BLOCKED ? 'Camera permission is blocked. Please enable it in device settings.' : 'Camera permission is required for face verification.');
49
+ return;
46
50
  }
47
- const config = {
48
- challenges,
49
- timeout
51
+ const livenessConfig = {
52
+ ...LivenessDetection.getDefaultConfig(),
53
+ ...config
50
54
  };
51
- await LivenessDetection.startLivenessDetection(config, {
55
+ const result = await LivenessDetection.startDetection(livenessConfig, {
52
56
  onChallengeStart: challenge => {
53
57
  setCurrentChallenge(challenge);
54
- setDetectionState('active');
55
- setIsLoading(false);
58
+ setState('running');
59
+ setChallengeProgress(getChallengeInstruction(challenge));
56
60
  },
57
- onChallengeSuccess: challenge => {
58
- setCompletedChallenges(prev => [...prev, challenge]);
61
+ onChallengeSuccess: (challenge, _challengeResult) => {
62
+ setChallengeProgress(`✓ ${getChallengeInstruction(challenge)} completed`);
59
63
  },
60
64
  onChallengeFailure: (challenge, reason) => {
61
- console.warn(`Challenge ${challenge} failed: ${reason}`);
62
- // Continue with next challenge - the native module handles this
65
+ setError(`Failed: ${reason}, ${challenge}`);
63
66
  },
64
- onAllChallengesComplete: result => {
65
- setDetectionState('completed');
66
- setCurrentChallenge('');
67
- onSuccess(result);
67
+ onAllChallengesComplete: () => {
68
+ setChallengeProgress('All challenges completed! Taking final photo...');
69
+ },
70
+ onScreenshotCaptured: _screenshot => {
71
+ // Screenshot captured, detection will complete soon
72
+ },
73
+ onDetectionFailed: reason => {
74
+ setError(reason);
75
+ setState('failed');
68
76
  }
69
77
  });
78
+ if (result.success) {
79
+ setState('completed');
80
+ setTimeout(() => {
81
+ onSuccess(result);
82
+ }, 1000); // Brief delay to show success state
83
+ } else {
84
+ setState('failed');
85
+ setError(result.failureReason || 'Face verification failed');
86
+ }
70
87
  } catch (err) {
71
- console.error('Liveness detection error:', err);
88
+ setState('failed');
72
89
  setError(err instanceof Error ? err.message : 'Unknown error occurred');
73
- setDetectionState('error');
74
- setIsLoading(false);
75
90
  }
76
- }, [challenges, timeout, onSuccess]);
77
- const handleClose = useCallback(() => {
78
- if (detectionState === 'active' || detectionState === 'starting') {
79
- LivenessDetection.stopDetection();
80
- }
81
- onClose();
82
- }, [detectionState, onClose]);
83
- const handleRetry = useCallback(() => {
84
- setDetectionState('idle');
85
- setError('');
86
- setCompletedChallenges([]);
87
- setCurrentChallenge('');
88
- }, []);
89
-
90
- // Auto-start detection when component mounts
91
- useEffect(() => {
92
- if (detectionState === 'idle') {
93
- // Small delay to ensure UI is ready
94
- const timer = setTimeout(() => {
95
- startLivenessDetection();
96
- }, 500);
97
- return () => clearTimeout(timer);
91
+ };
92
+ const getChallengeInstruction = challenge => {
93
+ switch (challenge) {
94
+ case LivenessChallenge.SMILE:
95
+ return 'Please smile';
96
+ case LivenessChallenge.BLINK:
97
+ return 'Please blink';
98
+ case LivenessChallenge.TURN_LEFT:
99
+ return 'Please turn your head left';
100
+ case LivenessChallenge.TURN_RIGHT:
101
+ return 'Please turn your head right';
102
+ default:
103
+ return 'Follow the instruction';
98
104
  }
99
- return undefined;
100
- }, [detectionState, startLivenessDetection]);
101
-
102
- // Cleanup on unmount
103
- useEffect(() => {
104
- return () => {
105
- LivenessDetection.cleanup();
106
- };
107
- }, []);
108
- const renderContent = () => {
109
- if (detectionState === 'error') {
110
- return /*#__PURE__*/React.createElement(View, {
111
- style: styles.errorContainer
112
- }, /*#__PURE__*/React.createElement(Text, {
113
- style: styles.errorTitle
114
- }, "Detection Failed"), /*#__PURE__*/React.createElement(Text, {
115
- style: styles.errorSubtitle
116
- }, error), /*#__PURE__*/React.createElement(TouchableOpacity, {
117
- style: [styles.button, {
118
- backgroundColor: primaryColor
119
- }],
120
- onPress: handleRetry
121
- }, /*#__PURE__*/React.createElement(Text, {
122
- style: styles.buttonText
123
- }, "Try Again")));
105
+ };
106
+ const getStateMessage = () => {
107
+ switch (state) {
108
+ case 'initializing':
109
+ return 'Initializing camera...';
110
+ case 'starting':
111
+ return 'Starting face verification...';
112
+ case 'running':
113
+ return challengeProgress || 'Look at the camera';
114
+ case 'completed':
115
+ return 'Face verification completed!';
116
+ case 'failed':
117
+ return error || 'Face verification failed';
118
+ default:
119
+ return 'Please wait...';
124
120
  }
125
- if (detectionState === 'completed') {
126
- return /*#__PURE__*/React.createElement(View, {
127
- style: styles.successContainer
128
- }, /*#__PURE__*/React.createElement(Text, {
129
- style: styles.successTitle
130
- }, "Verification Complete!"), /*#__PURE__*/React.createElement(Text, {
131
- style: styles.successSubtitle
132
- }, "All challenges completed successfully"));
121
+ };
122
+ const getStateColor = () => {
123
+ switch (state) {
124
+ case 'completed':
125
+ return '#4CAF50';
126
+ case 'failed':
127
+ return '#F44336';
128
+ case 'running':
129
+ return primaryColor;
130
+ default:
131
+ return '#666';
133
132
  }
134
- return /*#__PURE__*/React.createElement(View, {
135
- style: styles.contentContainer
136
- }, /*#__PURE__*/React.createElement(View, {
137
- style: styles.cameraContainer
138
- }, /*#__PURE__*/React.createElement(LivenessCameraView, {
139
- style: styles.camera,
140
- scaleType: "fillCenter",
141
- onCameraReady: () => console.log('Camera ready'),
142
- onCameraError: error => {
143
- console.error('Camera error:', error);
144
- setError('Camera initialization failed');
145
- setDetectionState('error');
146
- }
147
- }), /*#__PURE__*/React.createElement(View, {
148
- style: styles.overlay
149
- }, isLoading ? /*#__PURE__*/React.createElement(View, {
150
- style: styles.loadingContainer
151
- }, /*#__PURE__*/React.createElement(ActivityIndicator, {
152
- size: "large",
153
- color: primaryColor
154
- }), /*#__PURE__*/React.createElement(Text, {
155
- style: styles.loadingText
156
- }, "Initializing camera...")) : /*#__PURE__*/React.createElement(React.Fragment, null, currentChallenge && /*#__PURE__*/React.createElement(View, {
157
- style: styles.instructionContainer
158
- }, /*#__PURE__*/React.createElement(Text, {
159
- style: styles.instructionText
160
- }, getChallengeInstruction(currentChallenge))), /*#__PURE__*/React.createElement(View, {
161
- style: styles.progressContainer
162
- }, /*#__PURE__*/React.createElement(Text, {
163
- style: styles.progressText
164
- }, completedChallenges.length, " / ", challenges.length, " completed"), /*#__PURE__*/React.createElement(View, {
165
- style: styles.progressBar
166
- }, /*#__PURE__*/React.createElement(View, {
167
- style: [styles.progressFill, {
168
- width: `${completedChallenges.length / challenges.length * 100}%`,
169
- backgroundColor: primaryColor
170
- }]
171
- })))))));
172
133
  };
134
+ const handleRetry = () => {
135
+ setState('initializing');
136
+ setError(null);
137
+ setCurrentChallenge(null);
138
+ setChallengeProgress('');
139
+ checkSupport();
140
+ };
141
+ const showRetryButton = state === 'failed' && error !== 'Camera permission is blocked. Please enable it in device settings.';
173
142
  return /*#__PURE__*/React.createElement(Modal, {
174
143
  visible: true,
175
144
  transparent: true,
176
- onRequestClose: handleClose,
177
- style: styles.modal,
178
- animationType: "slide"
179
- }, /*#__PURE__*/React.createElement(View, {
180
- style: styles.backdrop
181
- }, /*#__PURE__*/React.createElement(View, {
182
- style: styles.container
145
+ onRequestClose: onClose,
146
+ style: styles.modal
147
+ }, /*#__PURE__*/React.createElement(TouchableOpacity, {
148
+ style: styles.backdrop,
149
+ activeOpacity: 1,
150
+ onPress: () => {}
183
151
  }, /*#__PURE__*/React.createElement(View, {
184
- style: styles.header
152
+ style: [styles.container]
153
+ }, /*#__PURE__*/React.createElement(TouchableOpacity, {
154
+ style: styles.close,
155
+ onPress: onClose
156
+ }, /*#__PURE__*/React.createElement(Image, {
157
+ source: require('../../assets/cancel.png'),
158
+ style: styles.closeIcon
159
+ })), /*#__PURE__*/React.createElement(View, {
160
+ style: styles.contentContainer
185
161
  }, /*#__PURE__*/React.createElement(Text, {
186
162
  style: styles.title
187
- }, "Face Verification"), /*#__PURE__*/React.createElement(TouchableOpacity, {
188
- onPress: handleClose,
189
- style: styles.closeButton
163
+ }, "Face Verification"), /*#__PURE__*/React.createElement(View, {
164
+ style: styles.cameraContainer
165
+ }, state === 'running' && isSupported ? /*#__PURE__*/React.createElement(OmnipayLivenessCameraView, {
166
+ style: styles.camera
167
+ }) : /*#__PURE__*/React.createElement(View, {
168
+ style: [styles.camera, styles.cameraPlaceholder]
169
+ }, state === 'initializing' || state === 'starting' ? /*#__PURE__*/React.createElement(ActivityIndicator, {
170
+ size: "large",
171
+ color: primaryColor
172
+ }) : state === 'completed' ? /*#__PURE__*/React.createElement(View, {
173
+ style: styles.successIcon
174
+ }, /*#__PURE__*/React.createElement(Text, {
175
+ style: styles.successText
176
+ }, "\u2713")) : /*#__PURE__*/React.createElement(View, {
177
+ style: styles.errorIcon
178
+ }, /*#__PURE__*/React.createElement(Text, {
179
+ style: styles.errorText
180
+ }, "!"))), /*#__PURE__*/React.createElement(View, {
181
+ style: styles.overlay
190
182
  }, /*#__PURE__*/React.createElement(Text, {
191
- style: styles.closeText
192
- }, "\u2715"))), renderContent())));
183
+ style: [styles.instruction, {
184
+ color: getStateColor()
185
+ }]
186
+ }, getStateMessage()))), state === 'running' && currentChallenge && /*#__PURE__*/React.createElement(View, {
187
+ style: styles.progressContainer
188
+ }, /*#__PURE__*/React.createElement(Text, {
189
+ style: styles.challengeText
190
+ }, getChallengeInstruction(currentChallenge))), /*#__PURE__*/React.createElement(View, {
191
+ style: styles.buttonContainer
192
+ }, showRetryButton && /*#__PURE__*/React.createElement(TouchableOpacity, {
193
+ style: [styles.retryButton, {
194
+ backgroundColor: primaryColor
195
+ }],
196
+ onPress: handleRetry
197
+ }, /*#__PURE__*/React.createElement(Text, {
198
+ style: styles.retryButtonText
199
+ }, "Try Again")))))));
193
200
  };
194
- export default FaceVerification;
201
+ const {
202
+ width: screenWidth,
203
+ height: screenHeight
204
+ } = Dimensions.get('window');
195
205
  const styles = StyleSheet.create({
196
- hide: {
197
- display: 'none'
198
- },
199
- full: {
200
- flex: 1,
201
- width: '100%',
202
- height: '100%'
203
- },
204
- webview: {
205
- flex: 1,
206
- width: '100%',
207
- height: Dimensions.get('window').height - 40,
208
- backgroundColor: 'white',
209
- borderTopRightRadius: 20,
210
- borderTopLeftRadius: 20,
211
- paddingTop: 150
212
- },
213
- webviewLoader: {
214
- zIndex: 3,
215
- backgroundColor: 'white',
216
- alignItems: 'center',
217
- justifyContent: 'center',
218
- flex: 1,
219
- width: '100%',
220
- height: '100%',
221
- position: 'absolute',
222
- top: 0,
223
- left: 0,
224
- borderTopRightRadius: 20,
225
- borderTopLeftRadius: 20
206
+ modal: {
207
+ margin: 0
226
208
  },
227
209
  backdrop: {
228
- backgroundColor: 'rgba(0,0,0,0.48)',
229
210
  flex: 1,
230
- justifyContent: 'flex-end',
231
- position: 'relative',
232
- height: '100%'
211
+ backgroundColor: 'rgba(0, 0, 0, 0.8)',
212
+ justifyContent: 'center',
213
+ alignItems: 'center'
233
214
  },
234
215
  container: {
216
+ width: screenWidth * 0.9,
217
+ maxHeight: screenHeight * 0.8,
235
218
  backgroundColor: 'white',
236
- borderTopRightRadius: 20,
237
- borderTopLeftRadius: 20,
238
- maxHeight: Dimensions.get('window').height - 40,
239
- flex: 1,
240
- position: 'relative',
241
- ...(Platform.OS === 'android' && {
242
- overflow: 'hidden'
243
- })
244
- },
245
- modal: {
246
- flex: 1,
247
- backgroundColor: 'rgba(0,0,0,0.48)',
248
- height: '100%',
249
- width: '100%'
219
+ borderRadius: 16,
220
+ padding: 20,
221
+ alignItems: 'center'
250
222
  },
251
- header: {
252
- flexDirection: 'row',
253
- justifyContent: 'space-between',
254
- alignItems: 'center',
255
- padding: 16,
256
- borderBottomWidth: 1,
257
- borderBottomColor: '#f0f0f0'
223
+ close: {
224
+ position: 'absolute',
225
+ top: 15,
226
+ right: 15,
227
+ zIndex: 10,
228
+ padding: 5
258
229
  },
259
- title: {
260
- fontSize: 18,
261
- fontWeight: '600',
262
- color: '#333'
230
+ closeIcon: {
231
+ width: 20,
232
+ height: 20,
233
+ tintColor: '#666'
263
234
  },
264
- closeButton: {
265
- width: 30,
266
- height: 30,
267
- borderRadius: 15,
268
- backgroundColor: '#f0f0f0',
235
+ contentContainer: {
236
+ width: '100%',
269
237
  alignItems: 'center',
270
- justifyContent: 'center'
238
+ paddingTop: 20
271
239
  },
272
- closeText: {
273
- fontSize: 16,
274
- color: '#666'
275
- },
276
- contentContainer: {
277
- flex: 1
240
+ title: {
241
+ fontSize: 24,
242
+ fontWeight: 'bold',
243
+ color: '#333',
244
+ marginBottom: 20,
245
+ textAlign: 'center'
278
246
  },
279
247
  cameraContainer: {
280
- flex: 1,
281
- position: 'relative'
248
+ width: screenWidth * 0.7,
249
+ height: screenWidth * 0.9,
250
+ borderRadius: 12,
251
+ overflow: 'hidden',
252
+ backgroundColor: '#f0f0f0',
253
+ position: 'relative',
254
+ marginBottom: 20
282
255
  },
283
256
  camera: {
284
257
  flex: 1,
285
258
  width: '100%',
286
259
  height: '100%'
287
260
  },
261
+ cameraPlaceholder: {
262
+ justifyContent: 'center',
263
+ alignItems: 'center',
264
+ backgroundColor: '#f5f5f5'
265
+ },
288
266
  overlay: {
289
267
  position: 'absolute',
290
- top: 0,
268
+ bottom: 0,
291
269
  left: 0,
292
270
  right: 0,
293
- bottom: 0,
294
- justifyContent: 'space-between',
295
- alignItems: 'center',
296
- paddingVertical: 40,
297
- paddingHorizontal: 20
298
- },
299
- loadingContainer: {
300
- flex: 1,
301
- justifyContent: 'center',
271
+ backgroundColor: 'rgba(0, 0, 0, 0.7)',
272
+ padding: 15,
302
273
  alignItems: 'center'
303
274
  },
304
- loadingText: {
305
- color: 'white',
306
- fontSize: 16,
307
- marginTop: 12,
308
- textAlign: 'center'
309
- },
310
- instructionContainer: {
311
- backgroundColor: 'rgba(0,0,0,0.7)',
312
- paddingHorizontal: 20,
313
- paddingVertical: 12,
314
- borderRadius: 8,
315
- marginTop: 20
316
- },
317
- instructionText: {
318
- color: 'white',
275
+ instruction: {
319
276
  fontSize: 16,
320
- fontWeight: '500',
321
- textAlign: 'center'
322
- },
323
- progressContainer: {
324
- backgroundColor: 'rgba(0,0,0,0.7)',
325
- paddingHorizontal: 20,
326
- paddingVertical: 12,
327
- borderRadius: 8,
328
- minWidth: 200
329
- },
330
- progressText: {
331
- color: 'white',
332
- fontSize: 14,
333
- textAlign: 'center',
334
- marginBottom: 8
335
- },
336
- progressBar: {
337
- height: 4,
338
- backgroundColor: 'rgba(255,255,255,0.3)',
339
- borderRadius: 2,
340
- overflow: 'hidden'
341
- },
342
- progressFill: {
343
- height: '100%',
344
- borderRadius: 2
345
- },
346
- errorContainer: {
347
- flex: 1,
348
- justifyContent: 'center',
349
- alignItems: 'center',
350
- paddingHorizontal: 20
351
- },
352
- errorTitle: {
353
- fontSize: 20,
354
277
  fontWeight: '600',
355
- color: '#d32f2f',
356
- marginBottom: 8,
357
- textAlign: 'center'
358
- },
359
- errorSubtitle: {
360
278
  textAlign: 'center',
361
- fontSize: 14,
362
- color: '#5e7079',
363
- marginBottom: 20,
364
- paddingHorizontal: 8
279
+ color: 'white'
365
280
  },
366
- successContainer: {
367
- flex: 1,
368
- justifyContent: 'center',
369
- alignItems: 'center',
370
- paddingHorizontal: 20
281
+ progressContainer: {
282
+ marginBottom: 20,
283
+ alignItems: 'center'
371
284
  },
372
- successTitle: {
373
- fontSize: 20,
285
+ challengeText: {
286
+ fontSize: 18,
374
287
  fontWeight: '600',
375
- color: '#2e7d32',
376
- marginBottom: 8,
288
+ color: '#333',
377
289
  textAlign: 'center'
378
290
  },
379
- successSubtitle: {
380
- textAlign: 'center',
381
- fontSize: 14,
382
- color: '#5e7079',
383
- paddingHorizontal: 8
384
- },
385
- close: {
386
- position: 'absolute',
387
- top: 10,
388
- right: 10,
389
- backgroundColor: 'white',
390
- height: 24,
391
- width: 24,
392
- borderRadius: 1000,
393
- alignItems: 'center',
291
+ buttonContainer: {
292
+ flexDirection: 'row',
394
293
  justifyContent: 'center',
395
- zIndex: 2
294
+ gap: 15
396
295
  },
397
- closeIcon: {
398
- height: 12,
399
- width: 12
296
+ retryButton: {
297
+ paddingHorizontal: 30,
298
+ paddingVertical: 12,
299
+ borderRadius: 8,
300
+ alignItems: 'center'
400
301
  },
401
- testContent: {
402
- paddingTop: 30,
403
- paddingLeft: 16
302
+ retryButtonText: {
303
+ color: 'white',
304
+ fontSize: 16,
305
+ fontWeight: '600'
404
306
  },
405
- testTwoContent: {
406
- paddingTop: 10,
407
- paddingLeft: 16
307
+ successIcon: {
308
+ width: 60,
309
+ height: 60,
310
+ borderRadius: 30,
311
+ backgroundColor: '#4CAF50',
312
+ justifyContent: 'center',
313
+ alignItems: 'center'
408
314
  },
409
- retryButton: {
410
- minWidth: 160,
411
- marginHorizontal: 'auto'
315
+ successText: {
316
+ fontSize: 30,
317
+ color: 'white',
318
+ fontWeight: 'bold'
412
319
  },
413
- button: {
414
- borderRadius: 6,
415
- paddingHorizontal: 20,
416
- paddingVertical: 14,
417
- alignItems: 'center',
320
+ errorIcon: {
321
+ width: 60,
322
+ height: 60,
323
+ borderRadius: 30,
324
+ backgroundColor: '#F44336',
418
325
  justifyContent: 'center',
419
- minWidth: 120
326
+ alignItems: 'center'
420
327
  },
421
- buttonText: {
328
+ errorText: {
329
+ fontSize: 30,
422
330
  color: 'white',
423
- fontSize: 16,
424
- fontWeight: '600'
331
+ fontWeight: 'bold'
425
332
  }
426
333
  });
334
+ export default FaceVerification;
427
335
  //# sourceMappingURL=FaceVerification.js.map