@onairos/react-native 3.1.16 → 3.1.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +404 -0
- package/lib/commonjs/assets/images/Checkbox.svg +3 -3
- package/lib/commonjs/assets/images/EnochE.svg +19 -19
- package/lib/commonjs/assets/images/Personalityprofile.svg +3 -3
- package/lib/commonjs/assets/images/Personalitytraits.svg +3 -3
- package/lib/commonjs/assets/images/Userpreferences.svg +3 -3
- package/lib/commonjs/assets/images/arrow.svg +20 -20
- package/lib/commonjs/assets/images/basicproficon.svg +43 -43
- package/lib/commonjs/assets/images/basicprofile.svg +3 -3
- package/lib/commonjs/assets/images/checkmark.svg +4 -4
- package/lib/commonjs/assets/images/contentanalysis.svg +3 -3
- package/lib/commonjs/assets/images/contenticon.svg +23 -23
- package/lib/commonjs/assets/images/personalityicon.svg +18 -18
- package/lib/commonjs/assets/images/x-close.svg +3 -3
- package/lib/commonjs/components/ModalSheet.js +8 -2
- package/lib/commonjs/components/ModalSheet.js.map +1 -1
- package/lib/commonjs/components/OnairosButton.js +290 -0
- package/lib/commonjs/components/OnairosButton.js.map +1 -0
- package/lib/commonjs/components/OnairosSignInButton.js +32 -8
- package/lib/commonjs/components/OnairosSignInButton.js.map +1 -1
- package/lib/commonjs/components/UniversalOnboarding.js +4 -4
- package/lib/commonjs/components/WelcomeScreen.js +29 -13
- package/lib/commonjs/components/WelcomeScreen.js.map +1 -1
- package/lib/commonjs/config/api.js +2 -2
- package/lib/commonjs/hooks/useConnections.js +6 -6
- package/lib/commonjs/hooks/useUserConnections.js +10 -10
- package/lib/commonjs/index.js +13 -6
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/services/apiClient.js +35 -35
- package/lib/commonjs/services/apiKeyService.js +99 -99
- package/lib/commonjs/services/authService.js +82 -82
- package/lib/commonjs/services/biometricPinService.js +10 -10
- package/lib/commonjs/services/connectedAccountsService.js +32 -32
- package/lib/commonjs/services/googleAuthService.js +15 -15
- package/lib/commonjs/services/imageCompressionService.js +15 -15
- package/lib/commonjs/services/jwtStorageService.js +59 -59
- package/lib/commonjs/services/mobileTrainingService.js +14 -14
- package/lib/commonjs/services/pinEncryptionService.js +10 -10
- package/lib/commonjs/services/pinStorageUtils.js +15 -15
- package/lib/commonjs/services/platformAuthService.js +47 -47
- package/lib/commonjs/services/storageService.js +31 -31
- package/lib/commonjs/services/trainingApiHelpers.js +33 -33
- package/lib/commonjs/services/userConnectionsService.js +24 -24
- package/lib/commonjs/utils/Portal.js +4 -4
- package/lib/commonjs/utils/api.js +24 -24
- package/lib/commonjs/utils/auth.js +18 -18
- package/lib/commonjs/utils/crypto.js +13 -13
- package/lib/commonjs/utils/encryption.js +12 -12
- package/lib/commonjs/utils/eventUtils.js +52 -52
- package/lib/commonjs/utils/programmaticFlow.js +16 -16
- package/lib/commonjs/utils/retryHelper.js +27 -27
- package/lib/module/assets/images/Checkbox.svg +3 -3
- package/lib/module/assets/images/EnochE.svg +19 -19
- package/lib/module/assets/images/Personalityprofile.svg +3 -3
- package/lib/module/assets/images/Personalitytraits.svg +3 -3
- package/lib/module/assets/images/Userpreferences.svg +3 -3
- package/lib/module/assets/images/arrow.svg +20 -20
- package/lib/module/assets/images/basicproficon.svg +43 -43
- package/lib/module/assets/images/basicprofile.svg +3 -3
- package/lib/module/assets/images/checkmark.svg +4 -4
- package/lib/module/assets/images/contentanalysis.svg +3 -3
- package/lib/module/assets/images/contenticon.svg +23 -23
- package/lib/module/assets/images/personalityicon.svg +18 -18
- package/lib/module/assets/images/x-close.svg +3 -3
- package/lib/module/components/ModalSheet.js +7 -2
- package/lib/module/components/ModalSheet.js.map +1 -1
- package/lib/module/components/OnairosButton.js +282 -0
- package/lib/module/components/OnairosButton.js.map +1 -0
- package/lib/module/components/OnairosSignInButton.js +32 -8
- package/lib/module/components/OnairosSignInButton.js.map +1 -1
- package/lib/module/components/UniversalOnboarding.js +4 -4
- package/lib/module/components/WelcomeScreen.js +25 -10
- package/lib/module/components/WelcomeScreen.js.map +1 -1
- package/lib/module/config/api.js +2 -2
- package/lib/module/hooks/useConnections.js +6 -6
- package/lib/module/hooks/useUserConnections.js +10 -10
- package/lib/module/index.js +11 -11
- package/lib/module/index.js.map +1 -1
- package/lib/module/services/apiClient.js +35 -35
- package/lib/module/services/apiKeyService.js +99 -99
- package/lib/module/services/authService.js +82 -82
- package/lib/module/services/biometricPinService.js +10 -10
- package/lib/module/services/connectedAccountsService.js +32 -32
- package/lib/module/services/googleAuthService.js +15 -15
- package/lib/module/services/imageCompressionService.js +15 -15
- package/lib/module/services/jwtStorageService.js +59 -59
- package/lib/module/services/mobileTrainingService.js +14 -14
- package/lib/module/services/pinEncryptionService.js +10 -10
- package/lib/module/services/pinStorageUtils.js +15 -15
- package/lib/module/services/platformAuthService.js +47 -47
- package/lib/module/services/storageService.js +31 -31
- package/lib/module/services/trainingApiHelpers.js +33 -33
- package/lib/module/services/userConnectionsService.js +24 -24
- package/lib/module/utils/Portal.js +4 -4
- package/lib/module/utils/api.js +24 -24
- package/lib/module/utils/auth.js +18 -18
- package/lib/module/utils/crypto.js +13 -13
- package/lib/module/utils/encryption.js +12 -12
- package/lib/module/utils/eventUtils.js +52 -52
- package/lib/module/utils/programmaticFlow.js +16 -16
- package/lib/module/utils/retryHelper.js +27 -27
- package/lib/typescript/components/ModalSheet.d.ts.map +1 -1
- package/lib/typescript/components/OnairosButton.d.ts +37 -0
- package/lib/typescript/components/OnairosButton.d.ts.map +1 -0
- package/lib/typescript/components/OnairosSignInButton.d.ts.map +1 -1
- package/lib/typescript/components/WelcomeScreen.d.ts.map +1 -1
- package/lib/typescript/index.d.ts +3 -1
- package/lib/typescript/index.d.ts.map +1 -1
- package/package.json +145 -163
- package/src/api/index.ts +151 -151
- package/src/assets/images/Checkbox.svg +3 -3
- package/src/assets/images/EnochE.svg +19 -19
- package/src/assets/images/Personalityprofile.svg +3 -3
- package/src/assets/images/Personalitytraits.svg +3 -3
- package/src/assets/images/Userpreferences.svg +3 -3
- package/src/assets/images/arrow.svg +20 -20
- package/src/assets/images/basicproficon.svg +43 -43
- package/src/assets/images/basicprofile.svg +3 -3
- package/src/assets/images/checkmark.svg +4 -4
- package/src/assets/images/contentanalysis.svg +3 -3
- package/src/assets/images/contenticon.svg +23 -23
- package/src/assets/images/personalityicon.svg +18 -18
- package/src/assets/images/x-close.svg +3 -3
- package/src/components/BodyText.tsx +33 -33
- package/src/components/BrandMark.tsx +62 -62
- package/src/components/CodeInput.tsx +32 -32
- package/src/components/DataRequestScreen.tsx +355 -355
- package/src/components/EmailInput.tsx +31 -31
- package/src/components/EmailVerificationModal.tsx +363 -363
- package/src/components/ExistingUserDataConfirmation.tsx +506 -506
- package/src/components/GoogleButton.tsx +55 -55
- package/src/components/HeadingGroup.tsx +49 -49
- package/src/components/ModalHeader.tsx +125 -125
- package/src/components/ModalSheet.tsx +59 -57
- package/src/components/Onairos.tsx +422 -422
- package/src/components/OnairosButton.tsx +339 -0
- package/src/components/OnairosSignInButton.tsx +31 -9
- package/src/components/Overlay.tsx +506 -506
- package/src/components/PersonaImage.tsx +79 -79
- package/src/components/PersonaLoadingScreen.tsx +201 -201
- package/src/components/PersonalizationConsentScreen.tsx +410 -410
- package/src/components/PinCreationScreen.tsx +492 -492
- package/src/components/PinInput.tsx +555 -555
- package/src/components/PlatformConnectorsStep.tsx +891 -891
- package/src/components/PlatformList.tsx +144 -144
- package/src/components/PlatformToggle.tsx +226 -226
- package/src/components/PrimaryButton.tsx +213 -213
- package/src/components/SignInMatchAnimation.tsx +225 -225
- package/src/components/SignInStep.tsx +217 -217
- package/src/components/TrainingModal.tsx +1047 -1047
- package/src/components/UniversalOnboarding.tsx +2887 -2887
- package/src/components/VerificationStep.tsx +198 -198
- package/src/components/WelcomeScreen.tsx +490 -473
- package/src/components/icons/Basicproficon.tsx +30 -30
- package/src/components/icons/Basicprofile.tsx +17 -17
- package/src/components/icons/Checkbox.tsx +17 -17
- package/src/components/icons/Checkmark.tsx +24 -24
- package/src/components/icons/Contentanalysis.tsx +17 -17
- package/src/components/icons/Contenticon.tsx +30 -30
- package/src/components/icons/EnochE.tsx +39 -39
- package/src/components/icons/Personalityicon.tsx +22 -22
- package/src/components/icons/Personalityprofile.tsx +17 -17
- package/src/components/icons/Personalitytraits.tsx +17 -17
- package/src/components/icons/Userpreferences.tsx +17 -17
- package/src/components/icons/index.ts +12 -12
- package/src/components/onboarding/OAuthWebView.tsx +232 -232
- package/src/config/api.ts +25 -25
- package/src/context/AuthContext.tsx +393 -393
- package/src/hooks/useConnectedAccounts.ts +138 -138
- package/src/hooks/useConnections.ts +161 -161
- package/src/hooks/useCredentials.ts +174 -174
- package/src/hooks/useUserConnections.ts +165 -165
- package/src/index.js +14 -0
- package/src/index.ts +99 -96
- package/src/services/apiClient.ts +336 -336
- package/src/services/apiKeyService.ts +919 -919
- package/src/services/authService.ts +1008 -1008
- package/src/services/biometricPinService.ts +192 -192
- package/src/services/connectedAccountsService.ts +289 -289
- package/src/services/googleAuthService.ts +279 -279
- package/src/services/imageCompressionService.ts +302 -302
- package/src/services/jwtStorageService.ts +256 -256
- package/src/services/mobileTrainingService.ts +203 -203
- package/src/services/pinEncryptionService.ts +75 -75
- package/src/services/pinStorageUtils.ts +96 -96
- package/src/services/platformAuthService.ts +1346 -1346
- package/src/services/storageService.ts +451 -451
- package/src/services/trainingApiHelpers.ts +66 -66
- package/src/services/userConnectionsService.ts +556 -556
- package/src/services/youtubeMigrationService.ts +453 -453
- package/src/theme/index.ts +239 -239
- package/src/types/ambient.d.ts +28 -28
- package/src/types/index.ts +265 -265
- package/src/types/node-fix.d.ts +18 -18
- package/src/types/node-override.d.ts +23 -23
- package/src/types/opacity.d.ts +15 -15
- package/src/types/types.d.ts +17 -17
- package/src/utils/Portal.tsx +82 -82
- package/src/utils/api.js +111 -111
- package/src/utils/auth.js +103 -103
- package/src/utils/crypto.js +59 -59
- package/src/utils/encryption.ts +68 -68
- package/src/utils/eventUtils.ts +302 -302
- package/src/utils/haptics.ts +58 -58
- package/src/utils/imagePreloader.ts +2 -2
- package/src/utils/programmaticFlow.ts +112 -112
- package/src/utils/retryHelper.ts +274 -274
package/src/utils/haptics.ts
CHANGED
|
@@ -1,59 +1,59 @@
|
|
|
1
|
-
import { Platform } from 'react-native';
|
|
2
|
-
|
|
3
|
-
export enum HapticType {
|
|
4
|
-
LIGHT = 'light',
|
|
5
|
-
MEDIUM = 'medium',
|
|
6
|
-
HEAVY = 'heavy',
|
|
7
|
-
SUCCESS = 'success',
|
|
8
|
-
WARNING = 'warning',
|
|
9
|
-
ERROR = 'error',
|
|
10
|
-
BUTTON_PRESS = 'light', // Alias for button presses
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
export const triggerHaptic = (type: HapticType = HapticType.LIGHT) => {
|
|
14
|
-
if (Platform.OS === 'ios') {
|
|
15
|
-
try {
|
|
16
|
-
// Try to use react-native-haptic-feedback if available
|
|
17
|
-
const ReactNativeHapticFeedback = require('react-native-haptic-feedback');
|
|
18
|
-
|
|
19
|
-
const options = {
|
|
20
|
-
enableVibrateFallback: true,
|
|
21
|
-
ignoreAndroidSystemSettings: false,
|
|
22
|
-
};
|
|
23
|
-
|
|
24
|
-
switch (type) {
|
|
25
|
-
case HapticType.LIGHT:
|
|
26
|
-
ReactNativeHapticFeedback.trigger('impactLight', options);
|
|
27
|
-
break;
|
|
28
|
-
case HapticType.MEDIUM:
|
|
29
|
-
ReactNativeHapticFeedback.trigger('impactMedium', options);
|
|
30
|
-
break;
|
|
31
|
-
case HapticType.HEAVY:
|
|
32
|
-
ReactNativeHapticFeedback.trigger('impactHeavy', options);
|
|
33
|
-
break;
|
|
34
|
-
case HapticType.SUCCESS:
|
|
35
|
-
ReactNativeHapticFeedback.trigger('notificationSuccess', options);
|
|
36
|
-
break;
|
|
37
|
-
case HapticType.WARNING:
|
|
38
|
-
ReactNativeHapticFeedback.trigger('notificationWarning', options);
|
|
39
|
-
break;
|
|
40
|
-
case HapticType.ERROR:
|
|
41
|
-
ReactNativeHapticFeedback.trigger('notificationError', options);
|
|
42
|
-
break;
|
|
43
|
-
default:
|
|
44
|
-
ReactNativeHapticFeedback.trigger('impactLight', options);
|
|
45
|
-
}
|
|
46
|
-
} catch (error) {
|
|
47
|
-
// Fallback to basic vibration if haptic feedback is not available
|
|
48
|
-
console.warn('Haptic feedback not available:', error);
|
|
49
|
-
}
|
|
50
|
-
} else if (Platform.OS === 'android') {
|
|
51
|
-
// Android fallback - basic vibration
|
|
52
|
-
try {
|
|
53
|
-
const { Vibration } = require('react-native');
|
|
54
|
-
Vibration.vibrate(50);
|
|
55
|
-
} catch (error) {
|
|
56
|
-
console.warn('Vibration not available:', error);
|
|
57
|
-
}
|
|
58
|
-
}
|
|
1
|
+
import { Platform } from 'react-native';
|
|
2
|
+
|
|
3
|
+
export enum HapticType {
|
|
4
|
+
LIGHT = 'light',
|
|
5
|
+
MEDIUM = 'medium',
|
|
6
|
+
HEAVY = 'heavy',
|
|
7
|
+
SUCCESS = 'success',
|
|
8
|
+
WARNING = 'warning',
|
|
9
|
+
ERROR = 'error',
|
|
10
|
+
BUTTON_PRESS = 'light', // Alias for button presses
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export const triggerHaptic = (type: HapticType = HapticType.LIGHT) => {
|
|
14
|
+
if (Platform.OS === 'ios') {
|
|
15
|
+
try {
|
|
16
|
+
// Try to use react-native-haptic-feedback if available
|
|
17
|
+
const ReactNativeHapticFeedback = require('react-native-haptic-feedback');
|
|
18
|
+
|
|
19
|
+
const options = {
|
|
20
|
+
enableVibrateFallback: true,
|
|
21
|
+
ignoreAndroidSystemSettings: false,
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
switch (type) {
|
|
25
|
+
case HapticType.LIGHT:
|
|
26
|
+
ReactNativeHapticFeedback.trigger('impactLight', options);
|
|
27
|
+
break;
|
|
28
|
+
case HapticType.MEDIUM:
|
|
29
|
+
ReactNativeHapticFeedback.trigger('impactMedium', options);
|
|
30
|
+
break;
|
|
31
|
+
case HapticType.HEAVY:
|
|
32
|
+
ReactNativeHapticFeedback.trigger('impactHeavy', options);
|
|
33
|
+
break;
|
|
34
|
+
case HapticType.SUCCESS:
|
|
35
|
+
ReactNativeHapticFeedback.trigger('notificationSuccess', options);
|
|
36
|
+
break;
|
|
37
|
+
case HapticType.WARNING:
|
|
38
|
+
ReactNativeHapticFeedback.trigger('notificationWarning', options);
|
|
39
|
+
break;
|
|
40
|
+
case HapticType.ERROR:
|
|
41
|
+
ReactNativeHapticFeedback.trigger('notificationError', options);
|
|
42
|
+
break;
|
|
43
|
+
default:
|
|
44
|
+
ReactNativeHapticFeedback.trigger('impactLight', options);
|
|
45
|
+
}
|
|
46
|
+
} catch (error) {
|
|
47
|
+
// Fallback to basic vibration if haptic feedback is not available
|
|
48
|
+
console.warn('Haptic feedback not available:', error);
|
|
49
|
+
}
|
|
50
|
+
} else if (Platform.OS === 'android') {
|
|
51
|
+
// Android fallback - basic vibration
|
|
52
|
+
try {
|
|
53
|
+
const { Vibration } = require('react-native');
|
|
54
|
+
Vibration.vibrate(50);
|
|
55
|
+
} catch (error) {
|
|
56
|
+
console.warn('Vibration not available:', error);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
59
|
};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
// Image preloader utility for React Native
|
|
2
|
-
export {};
|
|
1
|
+
// Image preloader utility for React Native
|
|
2
|
+
export {};
|
|
@@ -1,113 +1,113 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Programmatic Onairos Flow
|
|
3
|
-
*
|
|
4
|
-
* This function executes the complete Onairos authentication and onboarding flow
|
|
5
|
-
* that can be attached to custom buttons or called programmatically.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
import { OnairosButtonProps } from '../types';
|
|
9
|
-
import { initializePlatformAuthService } from '../services/platformAuthService';
|
|
10
|
-
|
|
11
|
-
/**
|
|
12
|
-
* Execute the complete Onairos flow programmatically
|
|
13
|
-
* This is the same logic that the OnairosButton uses internally
|
|
14
|
-
*
|
|
15
|
-
* @param options Configuration options for the flow
|
|
16
|
-
* @returns Promise that resolves when flow is complete
|
|
17
|
-
*/
|
|
18
|
-
export const executeOnairosFlow = async (options: OnairosButtonProps): Promise<void> => {
|
|
19
|
-
try {
|
|
20
|
-
console.log('🚀 Starting Onairos flow programmatically...');
|
|
21
|
-
|
|
22
|
-
// Initialize API key service if not already initialized
|
|
23
|
-
await initializePlatformAuthService();
|
|
24
|
-
|
|
25
|
-
// Import components dynamically to avoid circular dependencies
|
|
26
|
-
const { UniversalOnboarding } = await import('../components/UniversalOnboarding');
|
|
27
|
-
const React = await import('react');
|
|
28
|
-
|
|
29
|
-
// Create a promise that resolves when the flow is complete
|
|
30
|
-
return new Promise((resolve, reject) => {
|
|
31
|
-
let modalRef: any = null;
|
|
32
|
-
|
|
33
|
-
const handleComplete = (apiUrl: string, token: string, userData: any) => {
|
|
34
|
-
console.log('✅ Onairos flow completed successfully');
|
|
35
|
-
|
|
36
|
-
// Clean up modal
|
|
37
|
-
if (modalRef && modalRef.close) {
|
|
38
|
-
modalRef.close();
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
// Call user's onResolved callback
|
|
42
|
-
if (options.onResolved) {
|
|
43
|
-
options.onResolved(apiUrl, token, userData);
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
resolve();
|
|
47
|
-
};
|
|
48
|
-
|
|
49
|
-
const handleRejection = (error?: string) => {
|
|
50
|
-
console.log('❌ Onairos flow rejected:', error);
|
|
51
|
-
|
|
52
|
-
// Clean up modal
|
|
53
|
-
if (modalRef && modalRef.close) {
|
|
54
|
-
modalRef.close();
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
// Call user's onRejection callback
|
|
58
|
-
if (options.onRejection) {
|
|
59
|
-
options.onRejection(error);
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
reject(new Error(error || 'Onairos flow was rejected'));
|
|
63
|
-
};
|
|
64
|
-
|
|
65
|
-
// Create and show the Universal Onboarding modal
|
|
66
|
-
const modalElement = React.createElement(UniversalOnboarding, {
|
|
67
|
-
visible: true,
|
|
68
|
-
onClose: () => handleRejection('User closed the modal'),
|
|
69
|
-
AppName: options.AppName,
|
|
70
|
-
requestData: options.requestData,
|
|
71
|
-
returnLink: options.returnLink,
|
|
72
|
-
onComplete: handleComplete,
|
|
73
|
-
preferredPlatform: options.preferredPlatform,
|
|
74
|
-
debug: options.debug,
|
|
75
|
-
testMode: options.testMode,
|
|
76
|
-
});
|
|
77
|
-
|
|
78
|
-
// Store modal reference for cleanup
|
|
79
|
-
modalRef = modalElement;
|
|
80
|
-
|
|
81
|
-
// Note: In a real implementation, you'd need to render this modal
|
|
82
|
-
// This is a simplified version - the actual implementation would
|
|
83
|
-
// need to handle React rendering in the current app context
|
|
84
|
-
console.log('📱 Onairos modal should be displayed');
|
|
85
|
-
});
|
|
86
|
-
} catch (error) {
|
|
87
|
-
console.error('❌ Failed to execute Onairos flow:', error);
|
|
88
|
-
throw error;
|
|
89
|
-
}
|
|
90
|
-
};
|
|
91
|
-
|
|
92
|
-
/**
|
|
93
|
-
* Simple wrapper function that matches the OnairosButton click behavior
|
|
94
|
-
*
|
|
95
|
-
* @param options Configuration options for the flow
|
|
96
|
-
* @returns Promise that resolves when flow is complete
|
|
97
|
-
*/
|
|
98
|
-
export const startOnairosFlow = async (options: OnairosButtonProps): Promise<void> => {
|
|
99
|
-
// Pre-check if provided
|
|
100
|
-
if (options.preCheck) {
|
|
101
|
-
const canProceed = await options.preCheck();
|
|
102
|
-
if (!canProceed) {
|
|
103
|
-
console.log('❌ Pre-check failed, not starting Onairos flow');
|
|
104
|
-
if (options.onRejection) {
|
|
105
|
-
options.onRejection('Pre-check failed');
|
|
106
|
-
}
|
|
107
|
-
return;
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
// Execute the flow
|
|
112
|
-
return executeOnairosFlow(options);
|
|
1
|
+
/**
|
|
2
|
+
* Programmatic Onairos Flow
|
|
3
|
+
*
|
|
4
|
+
* This function executes the complete Onairos authentication and onboarding flow
|
|
5
|
+
* that can be attached to custom buttons or called programmatically.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { OnairosButtonProps } from '../types';
|
|
9
|
+
import { initializePlatformAuthService } from '../services/platformAuthService';
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Execute the complete Onairos flow programmatically
|
|
13
|
+
* This is the same logic that the OnairosButton uses internally
|
|
14
|
+
*
|
|
15
|
+
* @param options Configuration options for the flow
|
|
16
|
+
* @returns Promise that resolves when flow is complete
|
|
17
|
+
*/
|
|
18
|
+
export const executeOnairosFlow = async (options: OnairosButtonProps): Promise<void> => {
|
|
19
|
+
try {
|
|
20
|
+
console.log('🚀 Starting Onairos flow programmatically...');
|
|
21
|
+
|
|
22
|
+
// Initialize API key service if not already initialized
|
|
23
|
+
await initializePlatformAuthService();
|
|
24
|
+
|
|
25
|
+
// Import components dynamically to avoid circular dependencies
|
|
26
|
+
const { UniversalOnboarding } = await import('../components/UniversalOnboarding');
|
|
27
|
+
const React = await import('react');
|
|
28
|
+
|
|
29
|
+
// Create a promise that resolves when the flow is complete
|
|
30
|
+
return new Promise((resolve, reject) => {
|
|
31
|
+
let modalRef: any = null;
|
|
32
|
+
|
|
33
|
+
const handleComplete = (apiUrl: string, token: string, userData: any) => {
|
|
34
|
+
console.log('✅ Onairos flow completed successfully');
|
|
35
|
+
|
|
36
|
+
// Clean up modal
|
|
37
|
+
if (modalRef && modalRef.close) {
|
|
38
|
+
modalRef.close();
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// Call user's onResolved callback
|
|
42
|
+
if (options.onResolved) {
|
|
43
|
+
options.onResolved(apiUrl, token, userData);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
resolve();
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
const handleRejection = (error?: string) => {
|
|
50
|
+
console.log('❌ Onairos flow rejected:', error);
|
|
51
|
+
|
|
52
|
+
// Clean up modal
|
|
53
|
+
if (modalRef && modalRef.close) {
|
|
54
|
+
modalRef.close();
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// Call user's onRejection callback
|
|
58
|
+
if (options.onRejection) {
|
|
59
|
+
options.onRejection(error);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
reject(new Error(error || 'Onairos flow was rejected'));
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
// Create and show the Universal Onboarding modal
|
|
66
|
+
const modalElement = React.createElement(UniversalOnboarding, {
|
|
67
|
+
visible: true,
|
|
68
|
+
onClose: () => handleRejection('User closed the modal'),
|
|
69
|
+
AppName: options.AppName,
|
|
70
|
+
requestData: options.requestData,
|
|
71
|
+
returnLink: options.returnLink,
|
|
72
|
+
onComplete: handleComplete,
|
|
73
|
+
preferredPlatform: options.preferredPlatform,
|
|
74
|
+
debug: options.debug,
|
|
75
|
+
testMode: options.testMode,
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
// Store modal reference for cleanup
|
|
79
|
+
modalRef = modalElement;
|
|
80
|
+
|
|
81
|
+
// Note: In a real implementation, you'd need to render this modal
|
|
82
|
+
// This is a simplified version - the actual implementation would
|
|
83
|
+
// need to handle React rendering in the current app context
|
|
84
|
+
console.log('📱 Onairos modal should be displayed');
|
|
85
|
+
});
|
|
86
|
+
} catch (error) {
|
|
87
|
+
console.error('❌ Failed to execute Onairos flow:', error);
|
|
88
|
+
throw error;
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Simple wrapper function that matches the OnairosButton click behavior
|
|
94
|
+
*
|
|
95
|
+
* @param options Configuration options for the flow
|
|
96
|
+
* @returns Promise that resolves when flow is complete
|
|
97
|
+
*/
|
|
98
|
+
export const startOnairosFlow = async (options: OnairosButtonProps): Promise<void> => {
|
|
99
|
+
// Pre-check if provided
|
|
100
|
+
if (options.preCheck) {
|
|
101
|
+
const canProceed = await options.preCheck();
|
|
102
|
+
if (!canProceed) {
|
|
103
|
+
console.log('❌ Pre-check failed, not starting Onairos flow');
|
|
104
|
+
if (options.onRejection) {
|
|
105
|
+
options.onRejection('Pre-check failed');
|
|
106
|
+
}
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// Execute the flow
|
|
112
|
+
return executeOnairosFlow(options);
|
|
113
113
|
};
|