@onairos/react-native 3.1.11 → 3.1.13
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/lib/commonjs/api/index.js +75 -1
- package/lib/commonjs/api/index.js.map +1 -1
- package/lib/commonjs/assets/fonts/EBGaramond-VariableFont_wght.ttf +0 -0
- package/lib/commonjs/assets/fonts/IBMPlexSans-VariableFont_wdth,wght.ttf +0 -0
- package/lib/commonjs/assets/icons/Facebookicon.png +0 -0
- package/lib/commonjs/assets/icons/Gmail.png +0 -0
- package/lib/commonjs/assets/icons/Linkedinicon.png +0 -0
- package/lib/commonjs/assets/icons/Redditicon.png +0 -0
- package/lib/commonjs/assets/icons/YouTubeicon2.png +0 -0
- package/lib/commonjs/assets/icons/YouTubeicon3.png +0 -0
- package/lib/commonjs/assets/icons/farcaster.png +0 -0
- package/lib/commonjs/assets/icons/instagram.png +0 -0
- package/lib/commonjs/assets/icons/pinterest.png +0 -0
- package/lib/commonjs/assets/icons/swerv_logo.png +0 -0
- package/lib/commonjs/assets/icons/twitter.jpg +0 -0
- package/lib/commonjs/assets/images/Checkbox.svg +3 -0
- package/lib/commonjs/assets/images/EnochE.svg +19 -0
- package/lib/commonjs/assets/images/Enochicon1.png +0 -0
- package/lib/commonjs/assets/images/Face_ID_logo.png +0 -0
- package/lib/commonjs/assets/images/Facebookicon.png +0 -0
- package/lib/commonjs/assets/images/Gmail.png +0 -0
- package/lib/commonjs/assets/images/Googlelogo.png +0 -0
- package/lib/commonjs/assets/images/Linkedinicon.png +0 -0
- package/lib/commonjs/assets/images/Onairoslogo.png +0 -0
- package/lib/commonjs/assets/images/Personalityprofile.svg +3 -0
- package/lib/commonjs/assets/images/Personalitytraits.svg +3 -0
- package/lib/commonjs/assets/images/Redditicon.png +0 -0
- package/lib/commonjs/assets/images/Userpreferences.svg +3 -0
- package/lib/commonjs/assets/images/YouTubeicon3.png +0 -0
- package/lib/commonjs/assets/images/arrow.svg +20 -0
- package/lib/commonjs/assets/images/basicproficon.svg +43 -0
- package/lib/commonjs/assets/images/basicprofile.svg +3 -0
- package/lib/commonjs/assets/images/checkmark.svg +4 -0
- package/lib/commonjs/assets/images/contentanalysis.svg +3 -0
- package/lib/commonjs/assets/images/contenticon.svg +23 -0
- package/lib/commonjs/assets/images/persona1.png +0 -0
- package/lib/commonjs/assets/images/persona2.png +0 -0
- package/lib/commonjs/assets/images/persona3.png +0 -0
- package/lib/commonjs/assets/images/persona4.png +0 -0
- package/lib/commonjs/assets/images/persona5.png +0 -0
- package/lib/commonjs/assets/images/personalityicon.svg +18 -0
- package/lib/commonjs/assets/images/x-close.svg +3 -0
- package/lib/commonjs/components/BodyText.js +27 -0
- package/lib/commonjs/components/BodyText.js.map +1 -0
- package/lib/commonjs/components/BrandMark.js +44 -0
- package/lib/commonjs/components/BrandMark.js.map +1 -0
- package/lib/commonjs/components/CodeInput.js +30 -0
- package/lib/commonjs/components/CodeInput.js.map +1 -0
- package/lib/commonjs/components/EmailInput.js +30 -0
- package/lib/commonjs/components/EmailInput.js.map +1 -0
- package/lib/commonjs/components/ExistingUserDataConfirmation.js +474 -0
- package/lib/commonjs/components/ExistingUserDataConfirmation.js.map +1 -0
- package/lib/commonjs/components/GoogleButton.js +55 -0
- package/lib/commonjs/components/GoogleButton.js.map +1 -0
- package/lib/commonjs/components/HeadingGroup.js +43 -0
- package/lib/commonjs/components/HeadingGroup.js.map +1 -0
- package/lib/commonjs/components/ModalHeader.js +99 -0
- package/lib/commonjs/components/ModalHeader.js.map +1 -0
- package/lib/commonjs/components/ModalSheet.js +41 -0
- package/lib/commonjs/components/ModalSheet.js.map +1 -0
- package/lib/commonjs/components/Onairos.js +1 -3
- package/lib/commonjs/components/Onairos.js.map +1 -1
- package/lib/commonjs/components/OnairosButton.js +171 -190
- package/lib/commonjs/components/OnairosButton.js.map +1 -1
- package/lib/commonjs/components/OnairosSignInButton.js +169 -0
- package/lib/commonjs/components/OnairosSignInButton.js.map +1 -0
- package/lib/commonjs/components/Overlay.js +5 -5
- package/lib/commonjs/components/Overlay.js.map +1 -1
- package/lib/commonjs/components/PersonaImage.js +60 -0
- package/lib/commonjs/components/PersonaImage.js.map +1 -0
- package/lib/commonjs/components/PersonaLoadingScreen.js +156 -0
- package/lib/commonjs/components/PersonaLoadingScreen.js.map +1 -0
- package/lib/commonjs/components/PersonalizationConsentScreen.js +316 -0
- package/lib/commonjs/components/PersonalizationConsentScreen.js.map +1 -0
- package/lib/commonjs/components/PinCreationScreen.js +393 -0
- package/lib/commonjs/components/PinCreationScreen.js.map +1 -0
- package/lib/commonjs/components/PinInput.js +282 -120
- package/lib/commonjs/components/PinInput.js.map +1 -1
- package/lib/commonjs/components/PlatformConnectorsStep.js +828 -0
- package/lib/commonjs/components/PlatformConnectorsStep.js.map +1 -0
- package/lib/commonjs/components/PlatformToggle.js +180 -0
- package/lib/commonjs/components/PlatformToggle.js.map +1 -0
- package/lib/commonjs/components/PrimaryButton.js +180 -0
- package/lib/commonjs/components/PrimaryButton.js.map +1 -0
- package/lib/commonjs/components/SignInMatchAnimation.js +197 -0
- package/lib/commonjs/components/SignInMatchAnimation.js.map +1 -0
- package/lib/commonjs/components/SignInStep.js +179 -0
- package/lib/commonjs/components/SignInStep.js.map +1 -0
- package/lib/commonjs/components/TrainingModal.js +808 -563
- package/lib/commonjs/components/TrainingModal.js.map +1 -1
- package/lib/commonjs/components/UniversalOnboarding.js +2304 -1283
- package/lib/commonjs/components/UniversalOnboarding.js.map +1 -1
- package/lib/commonjs/components/VerificationStep.js +154 -0
- package/lib/commonjs/components/VerificationStep.js.map +1 -0
- package/lib/commonjs/components/WelcomeScreen.js +385 -0
- package/lib/commonjs/components/WelcomeScreen.js.map +1 -0
- package/lib/commonjs/components/icons/Basicproficon.js +37 -0
- package/lib/commonjs/components/icons/Basicproficon.js.map +1 -0
- package/lib/commonjs/components/icons/Basicprofile.js +21 -0
- package/lib/commonjs/components/icons/Basicprofile.js.map +1 -0
- package/lib/commonjs/components/icons/Checkbox.js +21 -0
- package/lib/commonjs/components/icons/Checkbox.js.map +1 -0
- package/lib/commonjs/components/icons/Checkmark.js +27 -0
- package/lib/commonjs/components/icons/Checkmark.js.map +1 -0
- package/lib/commonjs/components/icons/Contentanalysis.js +21 -0
- package/lib/commonjs/components/icons/Contentanalysis.js.map +1 -0
- package/lib/commonjs/components/icons/Contenticon.js +39 -0
- package/lib/commonjs/components/icons/Contenticon.js.map +1 -0
- package/lib/commonjs/components/icons/EnochE.js +41 -0
- package/lib/commonjs/components/icons/EnochE.js.map +1 -0
- package/lib/commonjs/components/icons/Personalityicon.js +30 -0
- package/lib/commonjs/components/icons/Personalityicon.js.map +1 -0
- package/lib/commonjs/components/icons/Personalityprofile.js +21 -0
- package/lib/commonjs/components/icons/Personalityprofile.js.map +1 -0
- package/lib/commonjs/components/icons/Personalitytraits.js +21 -0
- package/lib/commonjs/components/icons/Personalitytraits.js.map +1 -0
- package/lib/commonjs/components/icons/Userpreferences.js +21 -0
- package/lib/commonjs/components/icons/Userpreferences.js.map +1 -0
- package/lib/commonjs/components/icons/index.js +84 -0
- package/lib/commonjs/components/icons/index.js.map +1 -0
- package/lib/commonjs/components/onboarding/OAuthWebView.js +134 -743
- package/lib/commonjs/components/onboarding/OAuthWebView.js.map +1 -1
- package/lib/commonjs/config/api.js +34 -0
- package/lib/commonjs/config/api.js.map +1 -0
- package/lib/commonjs/context/AuthContext.js +345 -0
- package/lib/commonjs/context/AuthContext.js.map +1 -0
- package/lib/commonjs/hooks/useConnectedAccounts.js +111 -0
- package/lib/commonjs/hooks/useConnectedAccounts.js.map +1 -0
- package/lib/commonjs/hooks/useConnections.js +120 -125
- package/lib/commonjs/hooks/useConnections.js.map +1 -1
- package/lib/commonjs/hooks/useUserConnections.js +148 -0
- package/lib/commonjs/hooks/useUserConnections.js.map +1 -0
- package/lib/commonjs/index.js +149 -27
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/services/apiClient.js +302 -0
- package/lib/commonjs/services/apiClient.js.map +1 -0
- package/lib/commonjs/services/authService.js +935 -0
- package/lib/commonjs/services/authService.js.map +1 -0
- package/lib/commonjs/services/biometricPinService.js +184 -0
- package/lib/commonjs/services/biometricPinService.js.map +1 -0
- package/lib/commonjs/services/connectedAccountsService.js +268 -0
- package/lib/commonjs/services/connectedAccountsService.js.map +1 -0
- package/lib/commonjs/services/googleAuthService.js +268 -0
- package/lib/commonjs/services/googleAuthService.js.map +1 -0
- package/lib/commonjs/services/imageCompressionService.js +260 -0
- package/lib/commonjs/services/imageCompressionService.js.map +1 -0
- package/lib/commonjs/services/jwtStorageService.js +256 -0
- package/lib/commonjs/services/jwtStorageService.js.map +1 -0
- package/lib/commonjs/services/mobileTrainingService.js +185 -0
- package/lib/commonjs/services/mobileTrainingService.js.map +1 -0
- package/lib/commonjs/services/pinEncryptionService.js +84 -0
- package/lib/commonjs/services/pinEncryptionService.js.map +1 -0
- package/lib/commonjs/services/pinStorageUtils.js +105 -0
- package/lib/commonjs/services/pinStorageUtils.js.map +1 -0
- package/lib/commonjs/services/platformAuthService.js +956 -722
- package/lib/commonjs/services/platformAuthService.js.map +1 -1
- package/lib/commonjs/services/storageService.js +404 -0
- package/lib/commonjs/services/storageService.js.map +1 -0
- package/lib/commonjs/services/trainingApiHelpers.js +73 -0
- package/lib/commonjs/services/trainingApiHelpers.js.map +1 -0
- package/lib/commonjs/services/userConnectionsService.js +486 -0
- package/lib/commonjs/services/userConnectionsService.js.map +1 -0
- package/lib/commonjs/services/youtubeMigrationService.js +415 -0
- package/lib/commonjs/services/youtubeMigrationService.js.map +1 -0
- package/lib/commonjs/theme/index.js +249 -0
- package/lib/commonjs/theme/index.js.map +1 -0
- package/lib/commonjs/utils/eventUtils.js +288 -0
- package/lib/commonjs/utils/eventUtils.js.map +1 -0
- package/lib/commonjs/utils/haptics.js +66 -0
- package/lib/commonjs/utils/haptics.js.map +1 -0
- package/lib/commonjs/utils/imagePreloader.js +6 -0
- package/lib/commonjs/utils/imagePreloader.js.map +1 -0
- package/lib/module/api/index.js +72 -0
- package/lib/module/api/index.js.map +1 -1
- package/lib/module/assets/fonts/EBGaramond-VariableFont_wght.ttf +0 -0
- package/lib/module/assets/fonts/IBMPlexSans-VariableFont_wdth,wght.ttf +0 -0
- package/lib/module/assets/icons/Facebookicon.png +0 -0
- package/lib/module/assets/icons/Gmail.png +0 -0
- package/lib/module/assets/icons/Linkedinicon.png +0 -0
- package/lib/module/assets/icons/Redditicon.png +0 -0
- package/lib/module/assets/icons/YouTubeicon2.png +0 -0
- package/lib/module/assets/icons/YouTubeicon3.png +0 -0
- package/lib/module/assets/icons/farcaster.png +0 -0
- package/lib/module/assets/icons/instagram.png +0 -0
- package/lib/module/assets/icons/pinterest.png +0 -0
- package/lib/module/assets/icons/swerv_logo.png +0 -0
- package/lib/module/assets/icons/twitter.jpg +0 -0
- package/lib/module/assets/images/Checkbox.svg +3 -0
- package/lib/module/assets/images/EnochE.svg +19 -0
- package/lib/module/assets/images/Enochicon1.png +0 -0
- package/lib/module/assets/images/Face_ID_logo.png +0 -0
- package/lib/module/assets/images/Facebookicon.png +0 -0
- package/lib/module/assets/images/Gmail.png +0 -0
- package/lib/module/assets/images/Googlelogo.png +0 -0
- package/lib/module/assets/images/Linkedinicon.png +0 -0
- package/lib/module/assets/images/Onairoslogo.png +0 -0
- package/lib/module/assets/images/Personalityprofile.svg +3 -0
- package/lib/module/assets/images/Personalitytraits.svg +3 -0
- package/lib/module/assets/images/Redditicon.png +0 -0
- package/lib/module/assets/images/Userpreferences.svg +3 -0
- package/lib/module/assets/images/YouTubeicon3.png +0 -0
- package/lib/module/assets/images/arrow.svg +20 -0
- package/lib/module/assets/images/basicproficon.svg +43 -0
- package/lib/module/assets/images/basicprofile.svg +3 -0
- package/lib/module/assets/images/checkmark.svg +4 -0
- package/lib/module/assets/images/contentanalysis.svg +3 -0
- package/lib/module/assets/images/contenticon.svg +23 -0
- package/lib/module/assets/images/persona1.png +0 -0
- package/lib/module/assets/images/persona2.png +0 -0
- package/lib/module/assets/images/persona3.png +0 -0
- package/lib/module/assets/images/persona4.png +0 -0
- package/lib/module/assets/images/persona5.png +0 -0
- package/lib/module/assets/images/personalityicon.svg +18 -0
- package/lib/module/assets/images/x-close.svg +3 -0
- package/lib/module/components/BodyText.js +20 -0
- package/lib/module/components/BodyText.js.map +1 -0
- package/lib/module/components/BrandMark.js +37 -0
- package/lib/module/components/BrandMark.js.map +1 -0
- package/lib/module/components/CodeInput.js +23 -0
- package/lib/module/components/CodeInput.js.map +1 -0
- package/lib/module/components/EmailInput.js +23 -0
- package/lib/module/components/EmailInput.js.map +1 -0
- package/lib/module/components/ExistingUserDataConfirmation.js +465 -0
- package/lib/module/components/ExistingUserDataConfirmation.js.map +1 -0
- package/lib/module/components/GoogleButton.js +48 -0
- package/lib/module/components/GoogleButton.js.map +1 -0
- package/lib/module/components/HeadingGroup.js +36 -0
- package/lib/module/components/HeadingGroup.js.map +1 -0
- package/lib/module/components/ModalHeader.js +92 -0
- package/lib/module/components/ModalHeader.js.map +1 -0
- package/lib/module/components/ModalSheet.js +34 -0
- package/lib/module/components/ModalSheet.js.map +1 -0
- package/lib/module/components/Onairos.js +1 -3
- package/lib/module/components/Onairos.js.map +1 -1
- package/lib/module/components/OnairosButton.js +172 -192
- package/lib/module/components/OnairosButton.js.map +1 -1
- package/lib/module/components/OnairosSignInButton.js +160 -0
- package/lib/module/components/OnairosSignInButton.js.map +1 -0
- package/lib/module/components/Overlay.js +5 -5
- package/lib/module/components/Overlay.js.map +1 -1
- package/lib/module/components/PersonaImage.js +53 -0
- package/lib/module/components/PersonaImage.js.map +1 -0
- package/lib/module/components/PersonaLoadingScreen.js +148 -0
- package/lib/module/components/PersonaLoadingScreen.js.map +1 -0
- package/lib/module/components/PersonalizationConsentScreen.js +309 -0
- package/lib/module/components/PersonalizationConsentScreen.js.map +1 -0
- package/lib/module/components/PinCreationScreen.js +386 -0
- package/lib/module/components/PinCreationScreen.js.map +1 -0
- package/lib/module/components/PinInput.js +283 -120
- package/lib/module/components/PinInput.js.map +1 -1
- package/lib/module/components/PlatformConnectorsStep.js +820 -0
- package/lib/module/components/PlatformConnectorsStep.js.map +1 -0
- package/lib/module/components/PlatformToggle.js +173 -0
- package/lib/module/components/PlatformToggle.js.map +1 -0
- package/lib/module/components/PrimaryButton.js +172 -0
- package/lib/module/components/PrimaryButton.js.map +1 -0
- package/lib/module/components/SignInMatchAnimation.js +189 -0
- package/lib/module/components/SignInMatchAnimation.js.map +1 -0
- package/lib/module/components/SignInStep.js +171 -0
- package/lib/module/components/SignInStep.js.map +1 -0
- package/lib/module/components/TrainingModal.js +809 -565
- package/lib/module/components/TrainingModal.js.map +1 -1
- package/lib/module/components/UniversalOnboarding.js +2307 -1284
- package/lib/module/components/UniversalOnboarding.js.map +1 -1
- package/lib/module/components/VerificationStep.js +146 -0
- package/lib/module/components/VerificationStep.js.map +1 -0
- package/lib/module/components/WelcomeScreen.js +378 -0
- package/lib/module/components/WelcomeScreen.js.map +1 -0
- package/lib/module/components/icons/Basicproficon.js +30 -0
- package/lib/module/components/icons/Basicproficon.js.map +1 -0
- package/lib/module/components/icons/Basicprofile.js +14 -0
- package/lib/module/components/icons/Basicprofile.js.map +1 -0
- package/lib/module/components/icons/Checkbox.js +14 -0
- package/lib/module/components/icons/Checkbox.js.map +1 -0
- package/lib/module/components/icons/Checkmark.js +20 -0
- package/lib/module/components/icons/Checkmark.js.map +1 -0
- package/lib/module/components/icons/Contentanalysis.js +14 -0
- package/lib/module/components/icons/Contentanalysis.js.map +1 -0
- package/lib/module/components/icons/Contenticon.js +32 -0
- package/lib/module/components/icons/Contenticon.js.map +1 -0
- package/lib/module/components/icons/EnochE.js +34 -0
- package/lib/module/components/icons/EnochE.js.map +1 -0
- package/lib/module/components/icons/Personalityicon.js +23 -0
- package/lib/module/components/icons/Personalityicon.js.map +1 -0
- package/lib/module/components/icons/Personalityprofile.js +14 -0
- package/lib/module/components/icons/Personalityprofile.js.map +1 -0
- package/lib/module/components/icons/Personalitytraits.js +14 -0
- package/lib/module/components/icons/Personalitytraits.js.map +1 -0
- package/lib/module/components/icons/Userpreferences.js +14 -0
- package/lib/module/components/icons/Userpreferences.js.map +1 -0
- package/lib/module/components/icons/index.js +13 -0
- package/lib/module/components/icons/index.js.map +1 -0
- package/lib/module/components/onboarding/OAuthWebView.js +136 -744
- package/lib/module/components/onboarding/OAuthWebView.js.map +1 -1
- package/lib/module/config/api.js +26 -0
- package/lib/module/config/api.js.map +1 -0
- package/lib/module/context/AuthContext.js +335 -0
- package/lib/module/context/AuthContext.js.map +1 -0
- package/lib/module/hooks/useConnectedAccounts.js +106 -0
- package/lib/module/hooks/useConnectedAccounts.js.map +1 -0
- package/lib/module/hooks/useConnections.js +119 -125
- package/lib/module/hooks/useConnections.js.map +1 -1
- package/lib/module/hooks/useUserConnections.js +140 -0
- package/lib/module/hooks/useUserConnections.js.map +1 -0
- package/lib/module/index.js +51 -15
- package/lib/module/index.js.map +1 -1
- package/lib/module/services/apiClient.js +298 -0
- package/lib/module/services/apiClient.js.map +1 -0
- package/lib/module/services/authService.js +905 -0
- package/lib/module/services/authService.js.map +1 -0
- package/lib/module/services/biometricPinService.js +173 -0
- package/lib/module/services/biometricPinService.js.map +1 -0
- package/lib/module/services/connectedAccountsService.js +255 -0
- package/lib/module/services/connectedAccountsService.js.map +1 -0
- package/lib/module/services/googleAuthService.js +258 -0
- package/lib/module/services/googleAuthService.js.map +1 -0
- package/lib/module/services/imageCompressionService.js +250 -0
- package/lib/module/services/imageCompressionService.js.map +1 -0
- package/lib/module/services/jwtStorageService.js +239 -0
- package/lib/module/services/jwtStorageService.js.map +1 -0
- package/lib/module/services/mobileTrainingService.js +172 -0
- package/lib/module/services/mobileTrainingService.js.map +1 -0
- package/lib/module/services/pinEncryptionService.js +75 -0
- package/lib/module/services/pinEncryptionService.js.map +1 -0
- package/lib/module/services/pinStorageUtils.js +93 -0
- package/lib/module/services/pinStorageUtils.js.map +1 -0
- package/lib/module/services/platformAuthService.js +943 -704
- package/lib/module/services/platformAuthService.js.map +1 -1
- package/lib/module/services/storageService.js +383 -0
- package/lib/module/services/storageService.js.map +1 -0
- package/lib/module/services/trainingApiHelpers.js +67 -0
- package/lib/module/services/trainingApiHelpers.js.map +1 -0
- package/lib/module/services/userConnectionsService.js +476 -0
- package/lib/module/services/userConnectionsService.js.map +1 -0
- package/lib/module/services/youtubeMigrationService.js +404 -0
- package/lib/module/services/youtubeMigrationService.js.map +1 -0
- package/lib/module/theme/index.js +244 -0
- package/lib/module/theme/index.js.map +1 -0
- package/lib/module/utils/eventUtils.js +270 -0
- package/lib/module/utils/eventUtils.js.map +1 -0
- package/lib/module/utils/haptics.js +59 -0
- package/lib/module/utils/haptics.js.map +1 -0
- package/lib/module/utils/imagePreloader.js +3 -0
- package/lib/module/utils/imagePreloader.js.map +1 -0
- package/lib/typescript/api/index.d.ts +8 -0
- package/lib/typescript/api/index.d.ts.map +1 -1
- package/lib/typescript/components/BodyText.d.ts +10 -0
- package/lib/typescript/components/BodyText.d.ts.map +1 -0
- package/lib/typescript/components/BrandMark.d.ts +11 -0
- package/lib/typescript/components/BrandMark.d.ts.map +1 -0
- package/lib/typescript/components/CodeInput.d.ts +10 -0
- package/lib/typescript/components/CodeInput.d.ts.map +1 -0
- package/lib/typescript/components/EmailInput.d.ts +8 -0
- package/lib/typescript/components/EmailInput.d.ts.map +1 -0
- package/lib/typescript/components/ExistingUserDataConfirmation.d.ts +12 -0
- package/lib/typescript/components/ExistingUserDataConfirmation.d.ts.map +1 -0
- package/lib/typescript/components/GoogleButton.d.ts +11 -0
- package/lib/typescript/components/GoogleButton.d.ts.map +1 -0
- package/lib/typescript/components/HeadingGroup.d.ts +11 -0
- package/lib/typescript/components/HeadingGroup.d.ts.map +1 -0
- package/lib/typescript/components/ModalHeader.d.ts +11 -0
- package/lib/typescript/components/ModalHeader.d.ts.map +1 -0
- package/lib/typescript/components/ModalSheet.d.ts +13 -0
- package/lib/typescript/components/ModalSheet.d.ts.map +1 -0
- package/lib/typescript/components/Onairos.d.ts.map +1 -1
- package/lib/typescript/components/OnairosButton.d.ts +29 -4
- package/lib/typescript/components/OnairosButton.d.ts.map +1 -1
- package/lib/typescript/components/OnairosSignInButton.d.ts +14 -0
- package/lib/typescript/components/OnairosSignInButton.d.ts.map +1 -0
- package/lib/typescript/components/PersonaImage.d.ts +8 -0
- package/lib/typescript/components/PersonaImage.d.ts.map +1 -0
- package/lib/typescript/components/PersonaLoadingScreen.d.ts +10 -0
- package/lib/typescript/components/PersonaLoadingScreen.d.ts.map +1 -0
- package/lib/typescript/components/PersonalizationConsentScreen.d.ts +10 -0
- package/lib/typescript/components/PersonalizationConsentScreen.d.ts.map +1 -0
- package/lib/typescript/components/PinCreationScreen.d.ts +10 -0
- package/lib/typescript/components/PinCreationScreen.d.ts.map +1 -0
- package/lib/typescript/components/PinInput.d.ts +11 -1
- package/lib/typescript/components/PinInput.d.ts.map +1 -1
- package/lib/typescript/components/PlatformConnectorsStep.d.ts +11 -0
- package/lib/typescript/components/PlatformConnectorsStep.d.ts.map +1 -0
- package/lib/typescript/components/PlatformToggle.d.ts +20 -0
- package/lib/typescript/components/PlatformToggle.d.ts.map +1 -0
- package/lib/typescript/components/PrimaryButton.d.ts +22 -0
- package/lib/typescript/components/PrimaryButton.d.ts.map +1 -0
- package/lib/typescript/components/SignInMatchAnimation.d.ts +9 -0
- package/lib/typescript/components/SignInMatchAnimation.d.ts.map +1 -0
- package/lib/typescript/components/SignInStep.d.ts +12 -0
- package/lib/typescript/components/SignInStep.d.ts.map +1 -0
- package/lib/typescript/components/TrainingModal.d.ts +12 -1
- package/lib/typescript/components/TrainingModal.d.ts.map +1 -1
- package/lib/typescript/components/UniversalOnboarding.d.ts +14 -1
- package/lib/typescript/components/UniversalOnboarding.d.ts.map +1 -1
- package/lib/typescript/components/VerificationStep.d.ts +13 -0
- package/lib/typescript/components/VerificationStep.d.ts.map +1 -0
- package/lib/typescript/components/WelcomeScreen.d.ts +9 -0
- package/lib/typescript/components/WelcomeScreen.d.ts.map +1 -0
- package/lib/typescript/components/icons/Basicproficon.d.ts +5 -0
- package/lib/typescript/components/icons/Basicproficon.d.ts.map +1 -0
- package/lib/typescript/components/icons/Basicprofile.d.ts +5 -0
- package/lib/typescript/components/icons/Basicprofile.d.ts.map +1 -0
- package/lib/typescript/components/icons/Checkbox.d.ts +5 -0
- package/lib/typescript/components/icons/Checkbox.d.ts.map +1 -0
- package/lib/typescript/components/icons/Checkmark.d.ts +5 -0
- package/lib/typescript/components/icons/Checkmark.d.ts.map +1 -0
- package/lib/typescript/components/icons/Contentanalysis.d.ts +5 -0
- package/lib/typescript/components/icons/Contentanalysis.d.ts.map +1 -0
- package/lib/typescript/components/icons/Contenticon.d.ts +5 -0
- package/lib/typescript/components/icons/Contenticon.d.ts.map +1 -0
- package/lib/typescript/components/icons/EnochE.d.ts +5 -0
- package/lib/typescript/components/icons/EnochE.d.ts.map +1 -0
- package/lib/typescript/components/icons/Personalityicon.d.ts +5 -0
- package/lib/typescript/components/icons/Personalityicon.d.ts.map +1 -0
- package/lib/typescript/components/icons/Personalityprofile.d.ts +5 -0
- package/lib/typescript/components/icons/Personalityprofile.d.ts.map +1 -0
- package/lib/typescript/components/icons/Personalitytraits.d.ts +5 -0
- package/lib/typescript/components/icons/Personalitytraits.d.ts.map +1 -0
- package/lib/typescript/components/icons/Userpreferences.d.ts +5 -0
- package/lib/typescript/components/icons/Userpreferences.d.ts.map +1 -0
- package/lib/typescript/components/icons/index.d.ts +12 -0
- package/lib/typescript/components/icons/index.d.ts.map +1 -0
- package/lib/typescript/components/onboarding/OAuthWebView.d.ts.map +1 -1
- package/lib/typescript/config/api.d.ts +24 -0
- package/lib/typescript/config/api.d.ts.map +1 -0
- package/lib/typescript/context/AuthContext.d.ts +34 -0
- package/lib/typescript/context/AuthContext.d.ts.map +1 -0
- package/lib/typescript/hooks/useConnectedAccounts.d.ts +11 -0
- package/lib/typescript/hooks/useConnectedAccounts.d.ts.map +1 -0
- package/lib/typescript/hooks/useConnections.d.ts +10 -5
- package/lib/typescript/hooks/useConnections.d.ts.map +1 -1
- package/lib/typescript/hooks/useUserConnections.d.ts +12 -0
- package/lib/typescript/hooks/useUserConnections.d.ts.map +1 -0
- package/lib/typescript/index.d.ts +24 -6
- package/lib/typescript/index.d.ts.map +1 -1
- package/lib/typescript/services/apiClient.d.ts +91 -0
- package/lib/typescript/services/apiClient.d.ts.map +1 -0
- package/lib/typescript/services/authService.d.ts +216 -0
- package/lib/typescript/services/authService.d.ts.map +1 -0
- package/lib/typescript/services/biometricPinService.d.ts +29 -0
- package/lib/typescript/services/biometricPinService.d.ts.map +1 -0
- package/lib/typescript/services/connectedAccountsService.d.ts +56 -0
- package/lib/typescript/services/connectedAccountsService.d.ts.map +1 -0
- package/lib/typescript/services/googleAuthService.d.ts +63 -0
- package/lib/typescript/services/googleAuthService.d.ts.map +1 -0
- package/lib/typescript/services/imageCompressionService.d.ts +37 -0
- package/lib/typescript/services/imageCompressionService.d.ts.map +1 -0
- package/lib/typescript/services/jwtStorageService.d.ts +86 -0
- package/lib/typescript/services/jwtStorageService.d.ts.map +1 -0
- package/lib/typescript/services/mobileTrainingService.d.ts +45 -0
- package/lib/typescript/services/mobileTrainingService.d.ts.map +1 -0
- package/lib/typescript/services/pinEncryptionService.d.ts +17 -0
- package/lib/typescript/services/pinEncryptionService.d.ts.map +1 -0
- package/lib/typescript/services/pinStorageUtils.d.ts +25 -0
- package/lib/typescript/services/pinStorageUtils.d.ts.map +1 -0
- package/lib/typescript/services/platformAuthService.d.ts +34 -109
- package/lib/typescript/services/platformAuthService.d.ts.map +1 -1
- package/lib/typescript/services/storageService.d.ts +128 -0
- package/lib/typescript/services/storageService.d.ts.map +1 -0
- package/lib/typescript/services/trainingApiHelpers.d.ts +38 -0
- package/lib/typescript/services/trainingApiHelpers.d.ts.map +1 -0
- package/lib/typescript/services/userConnectionsService.d.ts +90 -0
- package/lib/typescript/services/userConnectionsService.d.ts.map +1 -0
- package/lib/typescript/services/youtubeMigrationService.d.ts +12 -0
- package/lib/typescript/services/youtubeMigrationService.d.ts.map +1 -0
- package/lib/typescript/theme/index.d.ts +416 -0
- package/lib/typescript/theme/index.d.ts.map +1 -0
- package/lib/typescript/types/index.d.ts +39 -0
- package/lib/typescript/types/index.d.ts.map +1 -1
- package/lib/typescript/utils/eventUtils.d.ts +108 -0
- package/lib/typescript/utils/eventUtils.d.ts.map +1 -0
- package/lib/typescript/utils/haptics.d.ts +11 -0
- package/lib/typescript/utils/haptics.d.ts.map +1 -0
- package/lib/typescript/utils/imagePreloader.d.ts +2 -0
- package/lib/typescript/utils/imagePreloader.d.ts.map +1 -0
- package/package.json +158 -145
- package/src/api/index.ts +41 -0
- package/src/assets/fonts/EBGaramond-VariableFont_wght.ttf +0 -0
- package/src/assets/fonts/IBMPlexSans-VariableFont_wdth,wght.ttf +0 -0
- package/src/assets/icons/Facebookicon.png +0 -0
- package/src/assets/icons/Gmail.png +0 -0
- package/src/assets/icons/Linkedinicon.png +0 -0
- package/src/assets/icons/Redditicon.png +0 -0
- package/src/assets/icons/YouTubeicon2.png +0 -0
- package/src/assets/icons/YouTubeicon3.png +0 -0
- package/src/assets/icons/farcaster.png +0 -0
- package/src/assets/icons/instagram.png +0 -0
- package/src/assets/icons/pinterest.png +0 -0
- package/src/assets/icons/swerv_logo.png +0 -0
- package/src/assets/icons/twitter.jpg +0 -0
- package/src/assets/images/Checkbox.svg +3 -0
- package/src/assets/images/EnochE.svg +19 -0
- package/src/assets/images/Enochicon1.png +0 -0
- package/src/assets/images/Face_ID_logo.png +0 -0
- package/src/assets/images/Facebookicon.png +0 -0
- package/src/assets/images/Gmail.png +0 -0
- package/src/assets/images/Googlelogo.png +0 -0
- package/src/assets/images/Linkedinicon.png +0 -0
- package/src/assets/images/Onairoslogo.png +0 -0
- package/src/assets/images/Personalityprofile.svg +3 -0
- package/src/assets/images/Personalitytraits.svg +3 -0
- package/src/assets/images/Redditicon.png +0 -0
- package/src/assets/images/Userpreferences.svg +3 -0
- package/src/assets/images/YouTubeicon3.png +0 -0
- package/src/assets/images/arrow.svg +20 -0
- package/src/assets/images/basicproficon.svg +43 -0
- package/src/assets/images/basicprofile.svg +3 -0
- package/src/assets/images/checkmark.svg +4 -0
- package/src/assets/images/contentanalysis.svg +3 -0
- package/src/assets/images/contenticon.svg +23 -0
- package/src/assets/images/persona1.png +0 -0
- package/src/assets/images/persona2.png +0 -0
- package/src/assets/images/persona3.png +0 -0
- package/src/assets/images/persona4.png +0 -0
- package/src/assets/images/persona5.png +0 -0
- package/src/assets/images/personalityicon.svg +18 -0
- package/src/assets/images/x-close.svg +3 -0
- package/src/components/BodyText.tsx +33 -0
- package/src/components/BrandMark.tsx +62 -0
- package/src/components/CodeInput.tsx +32 -0
- package/src/components/EmailInput.tsx +31 -0
- package/src/components/ExistingUserDataConfirmation.tsx +507 -0
- package/src/components/GoogleButton.tsx +55 -0
- package/src/components/HeadingGroup.tsx +49 -0
- package/src/components/ModalHeader.tsx +125 -0
- package/src/components/ModalSheet.tsx +57 -0
- package/src/components/Onairos.tsx +422 -424
- package/src/components/OnairosButton.tsx +339 -359
- package/src/components/OnairosSignInButton.tsx +166 -0
- package/src/components/Overlay.tsx +506 -506
- package/src/components/PersonaImage.tsx +79 -0
- package/src/components/PersonaLoadingScreen.tsx +201 -0
- package/src/components/PersonalizationConsentScreen.tsx +410 -0
- package/src/components/PinCreationScreen.tsx +492 -0
- package/src/components/PinInput.tsx +555 -343
- package/src/components/PlatformConnectorsStep.tsx +892 -0
- package/src/components/PlatformToggle.tsx +226 -0
- package/src/components/PrimaryButton.tsx +214 -0
- package/src/components/SignInMatchAnimation.tsx +225 -0
- package/src/components/SignInStep.tsx +217 -0
- package/src/components/TrainingModal.tsx +1047 -737
- package/src/components/UniversalOnboarding.tsx +2888 -1820
- package/src/components/VerificationStep.tsx +198 -0
- package/src/components/WelcomeScreen.tsx +473 -0
- package/src/components/icons/Basicproficon.tsx +30 -0
- package/src/components/icons/Basicprofile.tsx +17 -0
- package/src/components/icons/Checkbox.tsx +17 -0
- package/src/components/icons/Checkmark.tsx +24 -0
- package/src/components/icons/Contentanalysis.tsx +17 -0
- package/src/components/icons/Contenticon.tsx +30 -0
- package/src/components/icons/EnochE.tsx +39 -0
- package/src/components/icons/Personalityicon.tsx +22 -0
- package/src/components/icons/Personalityprofile.tsx +17 -0
- package/src/components/icons/Personalitytraits.tsx +17 -0
- package/src/components/icons/Userpreferences.tsx +17 -0
- package/src/components/icons/index.ts +12 -0
- package/src/components/onboarding/OAuthWebView.tsx +232 -838
- package/src/config/api.ts +25 -0
- package/src/context/AuthContext.tsx +393 -0
- package/src/hooks/useConnectedAccounts.ts +139 -0
- package/src/hooks/useConnections.ts +129 -131
- package/src/hooks/useUserConnections.ts +166 -0
- package/src/index.ts +94 -49
- package/src/services/apiClient.ts +337 -0
- package/src/services/authService.ts +1008 -0
- package/src/services/biometricPinService.ts +193 -0
- package/src/services/connectedAccountsService.ts +290 -0
- package/src/services/googleAuthService.ts +279 -0
- package/src/services/imageCompressionService.ts +303 -0
- package/src/services/jwtStorageService.ts +257 -0
- package/src/services/mobileTrainingService.ts +204 -0
- package/src/services/pinEncryptionService.ts +76 -0
- package/src/services/pinStorageUtils.ts +97 -0
- package/src/services/platformAuthService.ts +1346 -1113
- package/src/services/storageService.ts +452 -0
- package/src/services/trainingApiHelpers.ts +67 -0
- package/src/services/userConnectionsService.ts +557 -0
- package/src/services/youtubeMigrationService.ts +454 -0
- package/src/theme/index.ts +239 -0
- package/src/types/index.ts +265 -238
- package/src/utils/eventUtils.ts +303 -0
- package/src/utils/haptics.ts +59 -0
- package/src/utils/imagePreloader.ts +2 -0
- package/README.md +0 -375
- package/lib/commonjs/assets/images/email.png +0 -0
- package/lib/commonjs/assets/images/linkedin.png +0 -0
- package/lib/commonjs/assets/images/reddit.png +0 -0
- package/lib/commonjs/assets/images/youtube.png +0 -0
- package/lib/commonjs/components/UniversalOnboarding.tsx.new +0 -455
- package/lib/module/assets/images/email.png +0 -0
- package/lib/module/assets/images/linkedin.png +0 -0
- package/lib/module/assets/images/reddit.png +0 -0
- package/lib/module/assets/images/youtube.png +0 -0
- package/lib/module/components/UniversalOnboarding.tsx.new +0 -455
- package/src/assets/images/email.png +0 -0
- package/src/assets/images/linkedin.png +0 -0
- package/src/assets/images/reddit.png +0 -0
- package/src/assets/images/youtube.png +0 -0
- package/src/components/UniversalOnboarding.tsx.new +0 -455
|
@@ -0,0 +1,892 @@
|
|
|
1
|
+
import React, { useState, useEffect, useRef, useCallback } from 'react';
|
|
2
|
+
import {
|
|
3
|
+
View,
|
|
4
|
+
Text,
|
|
5
|
+
StyleSheet,
|
|
6
|
+
ScrollView,
|
|
7
|
+
KeyboardAvoidingView,
|
|
8
|
+
Platform,
|
|
9
|
+
Vibration,
|
|
10
|
+
TouchableOpacity,
|
|
11
|
+
} from 'react-native';
|
|
12
|
+
import { COLORS, SPACING } from '../theme';
|
|
13
|
+
import { triggerHaptic, HapticType } from '../utils/haptics';
|
|
14
|
+
import PlatformToggle from './PlatformToggle';
|
|
15
|
+
import PersonaImage from './PersonaImage';
|
|
16
|
+
import PrimaryButton from './PrimaryButton';
|
|
17
|
+
import PersonalizationConsentScreen from './PersonalizationConsentScreen';
|
|
18
|
+
import PinCreationScreen from './PinCreationScreen';
|
|
19
|
+
import PersonaLoadingScreen from './PersonaLoadingScreen';
|
|
20
|
+
import { useConnections } from '../hooks/useConnections';
|
|
21
|
+
import { getPlatformIcon } from '../services/connectedAccountsService';
|
|
22
|
+
import { initiateOAuth, initiateNativeAuth, hasNativeSDK } from '../services/platformAuthService';
|
|
23
|
+
import { OAuthWebView } from './onboarding/OAuthWebView';
|
|
24
|
+
import { useAuth } from '../context/AuthContext';
|
|
25
|
+
import { startEnochTrainingWithYouTubeCheck } from '../services/mobileTrainingService';
|
|
26
|
+
import { getOnairosUsername } from '../services/authService';
|
|
27
|
+
import { getEncryptedPinForAPI } from '../services/pinEncryptionService';
|
|
28
|
+
import { setTemporaryPin } from '../services/pinStorageUtils';
|
|
29
|
+
import AsyncStorage from '@react-native-async-storage/async-storage';
|
|
30
|
+
import { io, Socket } from 'socket.io-client';
|
|
31
|
+
|
|
32
|
+
interface PlatformConnectorsStepProps {
|
|
33
|
+
onUpdate: (connectedPlatforms: string[]) => void;
|
|
34
|
+
onSkip: () => void;
|
|
35
|
+
loading?: boolean;
|
|
36
|
+
onPinComplete?: (pin: string) => void;
|
|
37
|
+
onReviewerBypass?: () => void;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
const PlatformConnectorsStep: React.FC<PlatformConnectorsStepProps> = ({
|
|
41
|
+
onUpdate,
|
|
42
|
+
onSkip,
|
|
43
|
+
loading = false,
|
|
44
|
+
onPinComplete,
|
|
45
|
+
onReviewerBypass,
|
|
46
|
+
}) => {
|
|
47
|
+
const [connectedPlatforms, setConnectedPlatforms] = useState<Set<string>>(new Set());
|
|
48
|
+
const [showConsentScreen, setShowConsentScreen] = useState(false);
|
|
49
|
+
const [showPinScreen, setShowPinScreen] = useState(false);
|
|
50
|
+
const [showLoadingScreen, setShowLoadingScreen] = useState(false);
|
|
51
|
+
const [createdPin, setCreatedPin] = useState<string>('');
|
|
52
|
+
const [connectionStatuses, setConnectionStatuses] = useState<Record<string, string>>({});
|
|
53
|
+
const [showOAuthWebView, setShowOAuthWebView] = useState(false);
|
|
54
|
+
const [oauthUrl, setOauthUrl] = useState<string>('');
|
|
55
|
+
const [currentPlatform, setCurrentPlatform] = useState<string>('');
|
|
56
|
+
const [longPressTimer, setLongPressTimer] = useState<ReturnType<typeof setTimeout> | null>(null);
|
|
57
|
+
|
|
58
|
+
// EXACT same training state variables as UniversalOnboarding
|
|
59
|
+
const [username, setUsername] = useState<string>('');
|
|
60
|
+
const [personaProgress, setPersonaProgress] = useState(0);
|
|
61
|
+
const [personaStatus, setPersonaStatus] = useState('Initializing...');
|
|
62
|
+
const [isPersonaComplete, setIsPersonaComplete] = useState(false);
|
|
63
|
+
const [socketConnected, setSocketConnected] = useState(false);
|
|
64
|
+
const [hasError, setHasError] = useState(false);
|
|
65
|
+
const [userTraits, setUserTraits] = useState<any>(null);
|
|
66
|
+
const [inferenceResults, setInferenceResults] = useState<any>(null);
|
|
67
|
+
const [userToken, setUserToken] = useState<string | null>(null);
|
|
68
|
+
const [userInfo, setUserInfo] = useState<any>(null);
|
|
69
|
+
const socketRef = useRef<Socket | null>(null);
|
|
70
|
+
|
|
71
|
+
// EXACT same background training state as UniversalOnboarding
|
|
72
|
+
const [isBackgroundTrainingStarted, setIsBackgroundTrainingStarted] = useState(false);
|
|
73
|
+
const [backgroundTrainingProgress, setBackgroundTrainingProgress] = useState('');
|
|
74
|
+
const [backgroundSocketId, setBackgroundSocketId] = useState<string | null>(null);
|
|
75
|
+
|
|
76
|
+
// Use the real platform connection hook
|
|
77
|
+
const { connectPlatform, disconnectPlatform, isConnecting } = useConnections();
|
|
78
|
+
|
|
79
|
+
// Get the authenticated user from auth context
|
|
80
|
+
const { user } = useAuth();
|
|
81
|
+
|
|
82
|
+
// Initialize username on mount
|
|
83
|
+
useEffect(() => {
|
|
84
|
+
const initializeUsername = async () => {
|
|
85
|
+
try {
|
|
86
|
+
// First try to get stored username
|
|
87
|
+
const storedUsername = await AsyncStorage.getItem('onairos_username');
|
|
88
|
+
if (storedUsername && !username) {
|
|
89
|
+
console.log('📝 [USERNAME] Using stored username:', storedUsername);
|
|
90
|
+
setUsername(storedUsername);
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// If no stored username, generate from user data
|
|
95
|
+
if (user && !username) {
|
|
96
|
+
const initialUsername = user?.email?.split('@')[0] || user?.name || `user_${Math.floor(Math.random() * 10000)}`;
|
|
97
|
+
console.log('📝 [USERNAME] Generated username from user data:', initialUsername);
|
|
98
|
+
setUsername(initialUsername);
|
|
99
|
+
// Store it for future use
|
|
100
|
+
await AsyncStorage.setItem('onairos_username', initialUsername);
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// If no user data and no stored username, create a fallback
|
|
105
|
+
if (!username) {
|
|
106
|
+
const fallbackUsername = `mobile_user_${Math.floor(Math.random() * 10000)}`;
|
|
107
|
+
console.log('📝 [USERNAME] Using fallback username:', fallbackUsername);
|
|
108
|
+
setUsername(fallbackUsername);
|
|
109
|
+
await AsyncStorage.setItem('onairos_username', fallbackUsername);
|
|
110
|
+
}
|
|
111
|
+
} catch (error) {
|
|
112
|
+
console.error('❌ [USERNAME] Error initializing username:', error);
|
|
113
|
+
// Fallback to simple username
|
|
114
|
+
const fallbackUsername = `user_${Math.floor(Math.random() * 10000)}`;
|
|
115
|
+
setUsername(fallbackUsername);
|
|
116
|
+
}
|
|
117
|
+
};
|
|
118
|
+
|
|
119
|
+
initializeUsername();
|
|
120
|
+
}, [user, username]);
|
|
121
|
+
|
|
122
|
+
// EXACT same ensureAuthToken function from UniversalOnboarding
|
|
123
|
+
const ensureAuthToken = async () => {
|
|
124
|
+
try {
|
|
125
|
+
let existingToken = await AsyncStorage.getItem('onairos_jwt_token') ||
|
|
126
|
+
await AsyncStorage.getItem('enoch_token') ||
|
|
127
|
+
await AsyncStorage.getItem('auth_token');
|
|
128
|
+
|
|
129
|
+
if (existingToken && existingToken.trim().length > 20) {
|
|
130
|
+
console.log('✅ Authentication token already exists:', `${existingToken.substring(0, 20)}...`);
|
|
131
|
+
return existingToken;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
console.log('🔐 Creating Enoch authentication token...');
|
|
135
|
+
console.log('🔍 [ENSURE AUTH] Current username state:', username);
|
|
136
|
+
console.log('🔍 [ENSURE AUTH] Current user state:', user);
|
|
137
|
+
|
|
138
|
+
const fallbackEmail = user?.email || `${username || 'user'}@onairos.temp`;
|
|
139
|
+
const fallbackUsername = username || user?.name?.split('@')[0] || 'mobile_user';
|
|
140
|
+
|
|
141
|
+
console.log('🔍 [ENSURE AUTH] Using fallback email:', fallbackEmail);
|
|
142
|
+
console.log('🔍 [ENSURE AUTH] Using fallback username:', fallbackUsername);
|
|
143
|
+
|
|
144
|
+
// Create Enoch user
|
|
145
|
+
try {
|
|
146
|
+
await fetch('https://api2.onairos.uk/enoch/users/register', {
|
|
147
|
+
method: 'POST',
|
|
148
|
+
headers: { 'Content-Type': 'application/json' },
|
|
149
|
+
body: JSON.stringify({
|
|
150
|
+
email: fallbackEmail,
|
|
151
|
+
name: fallbackUsername,
|
|
152
|
+
photoUrl: ''
|
|
153
|
+
})
|
|
154
|
+
});
|
|
155
|
+
} catch (enochError) {
|
|
156
|
+
console.warn('⚠️ Enoch user creation failed (continuing):', enochError);
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
// Create Onairos account to get JWT token
|
|
160
|
+
const onairosSignupResponse = await fetch('https://api2.onairos.uk/register/enoch', {
|
|
161
|
+
method: 'POST',
|
|
162
|
+
headers: { 'Content-Type': 'application/json' },
|
|
163
|
+
body: JSON.stringify({
|
|
164
|
+
email: fallbackEmail,
|
|
165
|
+
username: fallbackUsername,
|
|
166
|
+
name: fallbackUsername
|
|
167
|
+
})
|
|
168
|
+
});
|
|
169
|
+
|
|
170
|
+
if (!onairosSignupResponse.ok) {
|
|
171
|
+
const errorText = await onairosSignupResponse.text();
|
|
172
|
+
throw new Error(`Onairos signup failed: ${onairosSignupResponse.status} ${errorText}`);
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
const onairosResponseData = await onairosSignupResponse.json();
|
|
176
|
+
let authToken = onairosResponseData.token || onairosResponseData.data?.token || onairosResponseData.jwt;
|
|
177
|
+
|
|
178
|
+
if (!authToken) {
|
|
179
|
+
throw new Error('No authentication token returned from server');
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
// Store the token
|
|
183
|
+
await AsyncStorage.setItem('onairos_jwt_token', authToken);
|
|
184
|
+
await AsyncStorage.setItem('auth_token', authToken);
|
|
185
|
+
await AsyncStorage.setItem('enoch_token', authToken);
|
|
186
|
+
await AsyncStorage.setItem('onairos_username', onairosResponseData.username || fallbackUsername);
|
|
187
|
+
|
|
188
|
+
console.log('✅ Successfully stored authentication tokens');
|
|
189
|
+
return authToken;
|
|
190
|
+
|
|
191
|
+
} catch (error) {
|
|
192
|
+
console.error('❌ Error ensuring authentication token:', error);
|
|
193
|
+
throw error;
|
|
194
|
+
}
|
|
195
|
+
};
|
|
196
|
+
|
|
197
|
+
// EXACT same background training function from UniversalOnboarding
|
|
198
|
+
const startBackgroundTraining = useCallback(async (): Promise<void> => {
|
|
199
|
+
try {
|
|
200
|
+
console.log('🚀 [BACKGROUND] Starting background training optimization...');
|
|
201
|
+
setBackgroundTrainingProgress('Connecting...');
|
|
202
|
+
|
|
203
|
+
const authToken = await ensureAuthToken();
|
|
204
|
+
if (!authToken) {
|
|
205
|
+
throw new Error('Failed to create authentication token for background training');
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
console.log('✅ [BACKGROUND] Auth token ready:', `${authToken.substring(0, 20)}...`);
|
|
209
|
+
setUserToken(authToken);
|
|
210
|
+
|
|
211
|
+
// Set up user info if not available
|
|
212
|
+
if (!userInfo) {
|
|
213
|
+
const storedUsername = await getOnairosUsername();
|
|
214
|
+
const fallbackUsername = storedUsername || user?.email?.split('@')[0] || user?.name || 'mobile_user';
|
|
215
|
+
|
|
216
|
+
const newUserInfo = {
|
|
217
|
+
username: fallbackUsername,
|
|
218
|
+
email: user?.email || null,
|
|
219
|
+
id: null
|
|
220
|
+
};
|
|
221
|
+
|
|
222
|
+
setUserInfo(newUserInfo);
|
|
223
|
+
setUsername(fallbackUsername);
|
|
224
|
+
console.log('🧑💻 [BACKGROUND] User info set:', newUserInfo);
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
console.log('🔌 [BACKGROUND] Setting up socket for background training...');
|
|
228
|
+
setBackgroundTrainingProgress('Initializing data collection...');
|
|
229
|
+
|
|
230
|
+
const backgroundSocket = io('https://api2.onairos.uk', {
|
|
231
|
+
transports: ['websocket', 'polling'],
|
|
232
|
+
autoConnect: false,
|
|
233
|
+
timeout: 15000,
|
|
234
|
+
reconnection: true,
|
|
235
|
+
reconnectionAttempts: 3,
|
|
236
|
+
reconnectionDelay: 1000,
|
|
237
|
+
forceNew: true
|
|
238
|
+
});
|
|
239
|
+
|
|
240
|
+
backgroundSocket.on('connect', async () => {
|
|
241
|
+
console.log('✅ [BACKGROUND] Socket connected, starting background data collection...');
|
|
242
|
+
const socketId = backgroundSocket.id;
|
|
243
|
+
setBackgroundSocketId(socketId || null);
|
|
244
|
+
setBackgroundTrainingProgress('Collecting your data...');
|
|
245
|
+
|
|
246
|
+
if (socketId) {
|
|
247
|
+
// Step 4: Start background training WITHOUT PIN (per backend instructions)
|
|
248
|
+
await startBackgroundEnochTraining(socketId, authToken);
|
|
249
|
+
}
|
|
250
|
+
});
|
|
251
|
+
|
|
252
|
+
backgroundSocket.on('trainingUpdate', (data: any) => {
|
|
253
|
+
console.log('🔥 [SOCKET] Received trainingUpdate event:', data);
|
|
254
|
+
if (data.progress) {
|
|
255
|
+
setBackgroundTrainingProgress(data.status || 'Processing...');
|
|
256
|
+
setPersonaProgress(data.progress);
|
|
257
|
+
setPersonaStatus(data.status || 'Training in progress');
|
|
258
|
+
console.log('📊 [BACKGROUND] Training progress:', data.progress, '%');
|
|
259
|
+
} else {
|
|
260
|
+
console.log('⚠️ [SOCKET] trainingUpdate event has no progress data:', data);
|
|
261
|
+
}
|
|
262
|
+
});
|
|
263
|
+
|
|
264
|
+
backgroundSocket.on('disconnect', () => {
|
|
265
|
+
console.log('❌ [BACKGROUND] Socket disconnected');
|
|
266
|
+
});
|
|
267
|
+
|
|
268
|
+
backgroundSocket.on('trainingCompleted', (data: any) => {
|
|
269
|
+
console.log('🔥 [SOCKET] Received trainingCompleted event:', data);
|
|
270
|
+
console.log('✅ [BACKGROUND] Training Complete:', data);
|
|
271
|
+
setPersonaStatus('Running test inference');
|
|
272
|
+
setPersonaProgress(60);
|
|
273
|
+
});
|
|
274
|
+
|
|
275
|
+
backgroundSocket.on('inferenceCompleted', (data: any) => {
|
|
276
|
+
console.log('🔥 [SOCKET] Received inferenceCompleted event:', data);
|
|
277
|
+
console.log('🧠 [BACKGROUND] Inference Complete:', data);
|
|
278
|
+
setPersonaStatus('Uploading to S3');
|
|
279
|
+
setPersonaProgress(80);
|
|
280
|
+
});
|
|
281
|
+
|
|
282
|
+
backgroundSocket.on('modelStandby', (data: any) => {
|
|
283
|
+
console.log('🔥 [SOCKET] Received modelStandby event:', data);
|
|
284
|
+
console.log('🎉 [BACKGROUND] All Complete:', data);
|
|
285
|
+
setIsPersonaComplete(true);
|
|
286
|
+
setPersonaStatus('Complete!');
|
|
287
|
+
setPersonaProgress(100);
|
|
288
|
+
});
|
|
289
|
+
|
|
290
|
+
backgroundSocket.on('connect_error', (error: any) => {
|
|
291
|
+
console.error('❌ [BACKGROUND] Socket connection error:', error);
|
|
292
|
+
setBackgroundTrainingProgress('Connection failed');
|
|
293
|
+
setPersonaStatus('Connection error');
|
|
294
|
+
setPersonaProgress(0);
|
|
295
|
+
});
|
|
296
|
+
|
|
297
|
+
// Store socket reference for later use
|
|
298
|
+
socketRef.current = backgroundSocket;
|
|
299
|
+
|
|
300
|
+
// Connect the socket to start background training
|
|
301
|
+
backgroundSocket.connect();
|
|
302
|
+
|
|
303
|
+
console.log('✅ [BACKGROUND] Background training initiated successfully');
|
|
304
|
+
|
|
305
|
+
} catch (error) {
|
|
306
|
+
console.error('❌ [BACKGROUND] Error starting background training:', error);
|
|
307
|
+
setBackgroundTrainingProgress('Failed to start training');
|
|
308
|
+
setPersonaStatus('Training failed');
|
|
309
|
+
setPersonaProgress(0);
|
|
310
|
+
}
|
|
311
|
+
}, [userInfo, username, user, connectedPlatforms]);
|
|
312
|
+
|
|
313
|
+
// EXACT same background training API call from UniversalOnboarding
|
|
314
|
+
const startBackgroundEnochTraining = async (socketId: string, authToken: string) => {
|
|
315
|
+
try {
|
|
316
|
+
console.log('🚀 [BACKGROUND] Starting background training with socketId:', socketId);
|
|
317
|
+
console.log('🔑 Using auth token:', `${authToken.substring(0, 20)}...`);
|
|
318
|
+
|
|
319
|
+
// Prepare background training data - EXACT same as UniversalOnboarding
|
|
320
|
+
const backgroundData = {
|
|
321
|
+
socketId,
|
|
322
|
+
username: userInfo?.username || userInfo?.name || username || 'mobile_user',
|
|
323
|
+
email: userInfo?.email || null,
|
|
324
|
+
modelKey: null,
|
|
325
|
+
connectedPlatforms: [], // No connected platforms for background training
|
|
326
|
+
platformConnections: {}, // No platform connections for background training
|
|
327
|
+
// No encrypted PIN for background training
|
|
328
|
+
};
|
|
329
|
+
|
|
330
|
+
console.log('📤 Sending background training data to /mobile-training/enoch:', backgroundData);
|
|
331
|
+
|
|
332
|
+
// Use the new training function that includes YouTube migration check
|
|
333
|
+
const backgroundResult = await startEnochTrainingWithYouTubeCheck(backgroundData);
|
|
334
|
+
console.log('📡 Background training API response:', backgroundResult);
|
|
335
|
+
|
|
336
|
+
// Handle CONNECTIONS_REQUIRED scenario (pre-training validation)
|
|
337
|
+
if (backgroundResult.requiresConnections || backgroundResult.code === 'CONNECTIONS_REQUIRED') {
|
|
338
|
+
console.log('🔗 Connections required detected from background training');
|
|
339
|
+
setPersonaStatus('Connections required');
|
|
340
|
+
setHasError(true);
|
|
341
|
+
setBackgroundTrainingProgress('');
|
|
342
|
+
return;
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
if (backgroundResult.success) {
|
|
346
|
+
console.log('✅ [BACKGROUND] Training started successfully');
|
|
347
|
+
console.log('🔍 [BACKGROUND] Setting isBackgroundTrainingStarted to true');
|
|
348
|
+
setIsBackgroundTrainingStarted(true);
|
|
349
|
+
setBackgroundTrainingProgress('Training model...');
|
|
350
|
+
setPersonaStatus('Training model...');
|
|
351
|
+
setPersonaProgress(25);
|
|
352
|
+
console.log('🔍 [BACKGROUND] Background training state updated:', {
|
|
353
|
+
isBackgroundTrainingStarted: true,
|
|
354
|
+
backgroundSocketId: socketId
|
|
355
|
+
});
|
|
356
|
+
} else {
|
|
357
|
+
console.error('❌ Background training start failed:', backgroundResult.error);
|
|
358
|
+
setPersonaStatus(`Error: ${backgroundResult.error || 'Background training failed to start'}`);
|
|
359
|
+
setHasError(true);
|
|
360
|
+
setBackgroundTrainingProgress('');
|
|
361
|
+
throw new Error(backgroundResult.error || 'Background training failed to start');
|
|
362
|
+
}
|
|
363
|
+
} catch (error) {
|
|
364
|
+
console.error('❌ [BACKGROUND] Background training error:', error);
|
|
365
|
+
setPersonaStatus('Training failed to start');
|
|
366
|
+
setHasError(true);
|
|
367
|
+
setBackgroundTrainingProgress('');
|
|
368
|
+
throw error;
|
|
369
|
+
}
|
|
370
|
+
};
|
|
371
|
+
|
|
372
|
+
// EXACT same continue training function from UniversalOnboarding
|
|
373
|
+
const continueBackgroundTrainingWithPin = async (userPin: string) => {
|
|
374
|
+
try {
|
|
375
|
+
console.log('🔐 [BACKGROUND] Continuing existing background training with PIN validation');
|
|
376
|
+
console.log('🔑 Using auth token:', `${userToken?.substring(0, 20)}...`);
|
|
377
|
+
|
|
378
|
+
if (!backgroundSocketId) {
|
|
379
|
+
throw new Error('No background training socket available');
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
const encryptedPin = await getEncryptedPinForAPI().catch(() => null);
|
|
383
|
+
|
|
384
|
+
if (!encryptedPin) {
|
|
385
|
+
console.warn('⚠️ No encrypted PIN available, continuing without PIN validation');
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
console.log('📤 [BACKGROUND] Sending PIN validation to continue training...');
|
|
389
|
+
setPersonaStatus('Validating PIN and continuing training');
|
|
390
|
+
setPersonaProgress(30);
|
|
391
|
+
|
|
392
|
+
// Check socket connection status after PIN submission
|
|
393
|
+
console.log('🔍 [SOCKET] Socket connection status after PIN:', {
|
|
394
|
+
socketId: backgroundSocketId,
|
|
395
|
+
isConnected: socketRef.current?.connected,
|
|
396
|
+
socketExists: !!socketRef.current,
|
|
397
|
+
socketId_current: socketRef.current?.id
|
|
398
|
+
});
|
|
399
|
+
|
|
400
|
+
} catch (error) {
|
|
401
|
+
console.error('❌ [BACKGROUND] Failed to continue training with PIN:', error);
|
|
402
|
+
throw error;
|
|
403
|
+
}
|
|
404
|
+
};
|
|
405
|
+
|
|
406
|
+
// Cleanup socket on unmount
|
|
407
|
+
useEffect(() => {
|
|
408
|
+
return () => {
|
|
409
|
+
if (socketRef.current) {
|
|
410
|
+
socketRef.current.disconnect();
|
|
411
|
+
}
|
|
412
|
+
};
|
|
413
|
+
}, []);
|
|
414
|
+
|
|
415
|
+
// Real platforms that can be connected (from UniversalOnboarding)
|
|
416
|
+
const platforms = [
|
|
417
|
+
{
|
|
418
|
+
id: 'pinterest',
|
|
419
|
+
name: 'Pinterest',
|
|
420
|
+
icon: getPlatformIcon('pinterest'),
|
|
421
|
+
description: 'We analyze your pins, boards, and interests to understand your style and preferences.',
|
|
422
|
+
},
|
|
423
|
+
{
|
|
424
|
+
id: 'youtube',
|
|
425
|
+
name: 'YouTube',
|
|
426
|
+
icon: getPlatformIcon('youtube'),
|
|
427
|
+
description: 'We analyze your watch history, likes, and subscriptions to understand your interests.',
|
|
428
|
+
},
|
|
429
|
+
{
|
|
430
|
+
id: 'linkedin',
|
|
431
|
+
name: 'LinkedIn',
|
|
432
|
+
icon: getPlatformIcon('linkedin'),
|
|
433
|
+
description: 'We analyze your professional network and career interests.',
|
|
434
|
+
},
|
|
435
|
+
{
|
|
436
|
+
id: 'reddit',
|
|
437
|
+
name: 'Reddit',
|
|
438
|
+
icon: getPlatformIcon('reddit'),
|
|
439
|
+
description: 'We analyze your posts and comments to understand your interests.',
|
|
440
|
+
},
|
|
441
|
+
{
|
|
442
|
+
id: 'gmail',
|
|
443
|
+
name: 'Gmail',
|
|
444
|
+
icon: getPlatformIcon('gmail'),
|
|
445
|
+
description: 'We analyze your email patterns to understand your communication style.',
|
|
446
|
+
},
|
|
447
|
+
];
|
|
448
|
+
|
|
449
|
+
const handlePlatformToggle = async (platformId: string, enabled: boolean) => {
|
|
450
|
+
console.log(`🔄 [PLATFORM TOGGLE] ${platformId} - enabled: ${enabled}, username: "${username}", user:`, user);
|
|
451
|
+
triggerHaptic(HapticType.BUTTON_PRESS);
|
|
452
|
+
|
|
453
|
+
try {
|
|
454
|
+
if (enabled) {
|
|
455
|
+
// Ensure we have a valid username before proceeding
|
|
456
|
+
let validUsername = username;
|
|
457
|
+
if (!validUsername || validUsername.trim() === '') {
|
|
458
|
+
console.log('⚠️ [PLATFORM TOGGLE] No username available, generating one...');
|
|
459
|
+
|
|
460
|
+
// Try to get stored username first
|
|
461
|
+
const storedUsername = await AsyncStorage.getItem('onairos_username');
|
|
462
|
+
if (storedUsername) {
|
|
463
|
+
validUsername = storedUsername;
|
|
464
|
+
setUsername(validUsername);
|
|
465
|
+
} else {
|
|
466
|
+
// Generate username from user data or fallback
|
|
467
|
+
validUsername = user?.email?.split('@')[0] || user?.name || `mobile_user_${Math.floor(Math.random() * 10000)}`;
|
|
468
|
+
setUsername(validUsername);
|
|
469
|
+
await AsyncStorage.setItem('onairos_username', validUsername);
|
|
470
|
+
}
|
|
471
|
+
|
|
472
|
+
console.log(`📝 [PLATFORM TOGGLE] Using username: "${validUsername}"`);
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
// Check if the platform has a native SDK
|
|
476
|
+
if (hasNativeSDK(platformId)) {
|
|
477
|
+
console.log(`🔧 [PLATFORM TOGGLE] ${platformId} has native SDK`);
|
|
478
|
+
// Use native SDK authentication (YouTube)
|
|
479
|
+
setCurrentPlatform(platformId);
|
|
480
|
+
setConnectionStatuses(prev => ({ ...prev, [platformId]: 'connecting' }));
|
|
481
|
+
const success = await initiateNativeAuth(platformId, validUsername);
|
|
482
|
+
|
|
483
|
+
if (success) {
|
|
484
|
+
const newConnected = new Set(connectedPlatforms);
|
|
485
|
+
newConnected.add(platformId);
|
|
486
|
+
setConnectedPlatforms(newConnected);
|
|
487
|
+
setConnectionStatuses(prev => ({ ...prev, [platformId]: 'connected' }));
|
|
488
|
+
triggerHaptic(HapticType.SUCCESS);
|
|
489
|
+
} else {
|
|
490
|
+
setConnectionStatuses(prev => ({ ...prev, [platformId]: 'error' }));
|
|
491
|
+
triggerHaptic(HapticType.ERROR);
|
|
492
|
+
}
|
|
493
|
+
} else {
|
|
494
|
+
console.log(`🌐 [PLATFORM TOGGLE] ${platformId} using OAuth WebView with username: "${validUsername}"`);
|
|
495
|
+
// For platforms like Pinterest, use OAuth WebView
|
|
496
|
+
setCurrentPlatform(platformId);
|
|
497
|
+
setConnectionStatuses(prev => ({ ...prev, [platformId]: 'connecting' }));
|
|
498
|
+
|
|
499
|
+
console.log(`🚀 [PLATFORM TOGGLE] Calling initiateOAuth for ${platformId}...`);
|
|
500
|
+
const oauthUrl = await initiateOAuth(platformId, validUsername);
|
|
501
|
+
console.log(`📡 [PLATFORM TOGGLE] OAuth URL received for ${platformId}:`, oauthUrl);
|
|
502
|
+
|
|
503
|
+
if (oauthUrl) {
|
|
504
|
+
console.log(`✅ [PLATFORM TOGGLE] Setting OAuth URL and showing WebView for ${platformId}`);
|
|
505
|
+
setOauthUrl(oauthUrl);
|
|
506
|
+
setShowOAuthWebView(true);
|
|
507
|
+
} else {
|
|
508
|
+
console.log(`❌ [PLATFORM TOGGLE] No OAuth URL received for ${platformId}`);
|
|
509
|
+
setConnectionStatuses(prev => ({ ...prev, [platformId]: 'error' }));
|
|
510
|
+
triggerHaptic(HapticType.ERROR);
|
|
511
|
+
}
|
|
512
|
+
}
|
|
513
|
+
} else {
|
|
514
|
+
// Disconnect the platform
|
|
515
|
+
await disconnectPlatform(platformId);
|
|
516
|
+
const newConnected = new Set(connectedPlatforms);
|
|
517
|
+
newConnected.delete(platformId);
|
|
518
|
+
setConnectedPlatforms(newConnected);
|
|
519
|
+
setConnectionStatuses(prev => ({ ...prev, [platformId]: 'disconnected' }));
|
|
520
|
+
triggerHaptic(HapticType.BUTTON_PRESS);
|
|
521
|
+
}
|
|
522
|
+
} catch (error) {
|
|
523
|
+
console.error(`Error toggling platform ${platformId}:`, error);
|
|
524
|
+
setConnectionStatuses(prev => ({ ...prev, [platformId]: 'error' }));
|
|
525
|
+
triggerHaptic(HapticType.ERROR);
|
|
526
|
+
}
|
|
527
|
+
};
|
|
528
|
+
|
|
529
|
+
const handleUpdate = () => {
|
|
530
|
+
triggerHaptic(HapticType.BUTTON_PRESS);
|
|
531
|
+
|
|
532
|
+
// EXACT same logic as UniversalOnboarding handleProceed
|
|
533
|
+
console.log('🚀 [TRANSITION] Starting background training during connect → pin transition');
|
|
534
|
+
startBackgroundTraining().catch(error => {
|
|
535
|
+
console.error('❌ [TRANSITION] Background training failed during transition:', error);
|
|
536
|
+
// Continue to PIN screen even if training fails
|
|
537
|
+
});
|
|
538
|
+
|
|
539
|
+
setShowPinScreen(true);
|
|
540
|
+
};
|
|
541
|
+
|
|
542
|
+
const handleConsentAccept = () => {
|
|
543
|
+
triggerHaptic(HapticType.BUTTON_PRESS);
|
|
544
|
+
if (onPinComplete) {
|
|
545
|
+
onPinComplete(createdPin);
|
|
546
|
+
} else {
|
|
547
|
+
onUpdate(Array.from(connectedPlatforms));
|
|
548
|
+
}
|
|
549
|
+
};
|
|
550
|
+
|
|
551
|
+
const handleConsentDecline = () => {
|
|
552
|
+
triggerHaptic(HapticType.BUTTON_PRESS);
|
|
553
|
+
setShowConsentScreen(false);
|
|
554
|
+
};
|
|
555
|
+
|
|
556
|
+
const handleSkip = () => {
|
|
557
|
+
triggerHaptic(HapticType.BUTTON_PRESS);
|
|
558
|
+
onSkip();
|
|
559
|
+
};
|
|
560
|
+
|
|
561
|
+
const handlePinComplete = async (pin: string) => {
|
|
562
|
+
setCreatedPin(pin);
|
|
563
|
+
|
|
564
|
+
// Store PIN temporarily for training component access (EXACT same as UniversalOnboarding)
|
|
565
|
+
setTemporaryPin(pin);
|
|
566
|
+
|
|
567
|
+
console.log('🔐 [PIN SUBMIT] PIN submitted, checking for background training...');
|
|
568
|
+
console.log('🔍 [PIN SUBMIT] Background training state:', {
|
|
569
|
+
isBackgroundTrainingStarted,
|
|
570
|
+
backgroundSocketId,
|
|
571
|
+
hasBackgroundSocket: !!backgroundSocketId,
|
|
572
|
+
userToken: !!userToken,
|
|
573
|
+
userInfo: !!userInfo
|
|
574
|
+
});
|
|
575
|
+
|
|
576
|
+
// EXACT same logic as UniversalOnboarding handlePinSubmit
|
|
577
|
+
if (isBackgroundTrainingStarted && backgroundSocketId) {
|
|
578
|
+
console.log('✅ [PIN SUBMIT] Background training detected, continuing with PIN validation...');
|
|
579
|
+
|
|
580
|
+
// Continue with existing training by sending PIN validation
|
|
581
|
+
try {
|
|
582
|
+
await continueBackgroundTrainingWithPin(pin);
|
|
583
|
+
setShowPinScreen(false);
|
|
584
|
+
setShowLoadingScreen(true); // Move to loading screen to show training progress
|
|
585
|
+
} catch (error) {
|
|
586
|
+
console.error('❌ [PIN SUBMIT] Failed to continue background training:', error);
|
|
587
|
+
setPersonaStatus('Error: Failed to continue training');
|
|
588
|
+
setHasError(true);
|
|
589
|
+
setShowPinScreen(false);
|
|
590
|
+
setShowLoadingScreen(true);
|
|
591
|
+
}
|
|
592
|
+
} else {
|
|
593
|
+
console.log('ℹ️ [PIN SUBMIT] No background training detected');
|
|
594
|
+
setPersonaStatus('No training in progress. Please restart the flow.');
|
|
595
|
+
setHasError(true);
|
|
596
|
+
setShowPinScreen(false);
|
|
597
|
+
setShowLoadingScreen(true);
|
|
598
|
+
}
|
|
599
|
+
|
|
600
|
+
console.log('🔐 [PIN SUBMIT] PIN stored securely, moved to loading screen');
|
|
601
|
+
};
|
|
602
|
+
|
|
603
|
+
const handleLoadingComplete = () => {
|
|
604
|
+
setShowLoadingScreen(false);
|
|
605
|
+
setShowConsentScreen(true);
|
|
606
|
+
};
|
|
607
|
+
|
|
608
|
+
const handleOAuthSuccess = (code: string) => {
|
|
609
|
+
console.log(`OAuth success for ${currentPlatform} with code:`, code);
|
|
610
|
+
|
|
611
|
+
if (currentPlatform) {
|
|
612
|
+
// Update connected platforms
|
|
613
|
+
const newConnected = new Set(connectedPlatforms);
|
|
614
|
+
newConnected.add(currentPlatform);
|
|
615
|
+
setConnectedPlatforms(newConnected);
|
|
616
|
+
setConnectionStatuses(prev => ({ ...prev, [currentPlatform]: 'connected' }));
|
|
617
|
+
triggerHaptic(HapticType.SUCCESS);
|
|
618
|
+
}
|
|
619
|
+
|
|
620
|
+
// Close the OAuth window
|
|
621
|
+
setShowOAuthWebView(false);
|
|
622
|
+
setOauthUrl('');
|
|
623
|
+
setCurrentPlatform('');
|
|
624
|
+
};
|
|
625
|
+
|
|
626
|
+
const handleOAuthClose = () => {
|
|
627
|
+
setShowOAuthWebView(false);
|
|
628
|
+
setOauthUrl('');
|
|
629
|
+
if (currentPlatform) {
|
|
630
|
+
setConnectionStatuses(prev => ({ ...prev, [currentPlatform]: 'disconnected' }));
|
|
631
|
+
}
|
|
632
|
+
setCurrentPlatform('');
|
|
633
|
+
};
|
|
634
|
+
|
|
635
|
+
const handlePinBack = () => {
|
|
636
|
+
setShowPinScreen(false);
|
|
637
|
+
};
|
|
638
|
+
|
|
639
|
+
const handleReviewerBypass = () => {
|
|
640
|
+
console.log('🔍 Reviewer bypass activated in new UI');
|
|
641
|
+
if (onReviewerBypass) {
|
|
642
|
+
onReviewerBypass();
|
|
643
|
+
}
|
|
644
|
+
};
|
|
645
|
+
|
|
646
|
+
const handleSkipLongPress = () => {
|
|
647
|
+
console.log('🔍 Skip button long press detected, starting reviewer bypass timer');
|
|
648
|
+
|
|
649
|
+
// Start a timer for haptic feedback at 2 seconds
|
|
650
|
+
const hapticTimer = setTimeout(() => {
|
|
651
|
+
// Provide haptic feedback
|
|
652
|
+
Vibration.vibrate(100);
|
|
653
|
+
}, 2000);
|
|
654
|
+
|
|
655
|
+
// Start a timer for 4 seconds for the bypass
|
|
656
|
+
const bypassTimer = setTimeout(() => {
|
|
657
|
+
handleReviewerBypass();
|
|
658
|
+
}, 4000);
|
|
659
|
+
|
|
660
|
+
// Store the timer
|
|
661
|
+
setLongPressTimer(bypassTimer);
|
|
662
|
+
};
|
|
663
|
+
|
|
664
|
+
const handleSkipPressOut = () => {
|
|
665
|
+
console.log('🔍 Skip button press released, clearing reviewer bypass timer');
|
|
666
|
+
|
|
667
|
+
// Clear the timer if the press is released before 4 seconds
|
|
668
|
+
if (longPressTimer) {
|
|
669
|
+
clearTimeout(longPressTimer);
|
|
670
|
+
setLongPressTimer(null);
|
|
671
|
+
}
|
|
672
|
+
};
|
|
673
|
+
|
|
674
|
+
// Calculate persona level based on connected platforms (1-5)
|
|
675
|
+
const personaLevel = Math.min(5, Math.max(1, connectedPlatforms.size + 1));
|
|
676
|
+
|
|
677
|
+
// Show PIN screen if triggered
|
|
678
|
+
if (showPinScreen) {
|
|
679
|
+
return (
|
|
680
|
+
<PinCreationScreen
|
|
681
|
+
visible={showPinScreen}
|
|
682
|
+
onComplete={handlePinComplete}
|
|
683
|
+
onBack={handlePinBack}
|
|
684
|
+
/>
|
|
685
|
+
);
|
|
686
|
+
}
|
|
687
|
+
|
|
688
|
+
// Show loading screen if triggered
|
|
689
|
+
if (showLoadingScreen) {
|
|
690
|
+
return (
|
|
691
|
+
<PersonaLoadingScreen
|
|
692
|
+
visible={showLoadingScreen}
|
|
693
|
+
onComplete={handleLoadingComplete}
|
|
694
|
+
progress={personaProgress}
|
|
695
|
+
status={personaStatus}
|
|
696
|
+
/>
|
|
697
|
+
);
|
|
698
|
+
}
|
|
699
|
+
|
|
700
|
+
// Show OAuth WebView if triggered
|
|
701
|
+
if (showOAuthWebView && oauthUrl) {
|
|
702
|
+
return (
|
|
703
|
+
<OAuthWebView
|
|
704
|
+
url={oauthUrl}
|
|
705
|
+
platform={currentPlatform}
|
|
706
|
+
onClose={handleOAuthClose}
|
|
707
|
+
onSuccess={handleOAuthSuccess}
|
|
708
|
+
onComplete={handleOAuthClose}
|
|
709
|
+
/>
|
|
710
|
+
);
|
|
711
|
+
}
|
|
712
|
+
|
|
713
|
+
// Show consent screen if triggered
|
|
714
|
+
if (showConsentScreen) {
|
|
715
|
+
return (
|
|
716
|
+
<PersonalizationConsentScreen
|
|
717
|
+
visible={showConsentScreen}
|
|
718
|
+
onAccept={handleConsentAccept}
|
|
719
|
+
onDecline={handleConsentDecline}
|
|
720
|
+
/>
|
|
721
|
+
);
|
|
722
|
+
}
|
|
723
|
+
|
|
724
|
+
return (
|
|
725
|
+
<View style={styles.container}>
|
|
726
|
+
{/* Fixed Header and Persona Section */}
|
|
727
|
+
<View style={styles.fixedHeaderSection}>
|
|
728
|
+
{/* Heading */}
|
|
729
|
+
<View style={styles.headingContainer}>
|
|
730
|
+
<Text style={styles.title}>Connect platforms</Text>
|
|
731
|
+
<Text style={styles.subtitle}>More connections, smarter personalization.</Text>
|
|
732
|
+
</View>
|
|
733
|
+
|
|
734
|
+
{/* Persona Image */}
|
|
735
|
+
<View style={styles.personaContainer}>
|
|
736
|
+
<PersonaImage level={personaLevel} style={styles.largePersona} />
|
|
737
|
+
</View>
|
|
738
|
+
</View>
|
|
739
|
+
|
|
740
|
+
{/* Scrollable Platform Section */}
|
|
741
|
+
<KeyboardAvoidingView
|
|
742
|
+
behavior={Platform.OS === 'ios' ? 'padding' : 'height'}
|
|
743
|
+
style={styles.scrollableSection}
|
|
744
|
+
>
|
|
745
|
+
<ScrollView
|
|
746
|
+
style={styles.scrollView}
|
|
747
|
+
showsVerticalScrollIndicator={false}
|
|
748
|
+
contentContainerStyle={styles.scrollContent}
|
|
749
|
+
>
|
|
750
|
+
<View style={styles.platformsContainer}>
|
|
751
|
+
{platforms.map((platform, index) => (
|
|
752
|
+
<PlatformToggle
|
|
753
|
+
key={platform.id}
|
|
754
|
+
platform={platform}
|
|
755
|
+
isEnabled={connectedPlatforms.has(platform.id)}
|
|
756
|
+
onToggle={handlePlatformToggle}
|
|
757
|
+
fullWidth={true}
|
|
758
|
+
isLast={index === platforms.length - 1}
|
|
759
|
+
customIconSize={platform.id === 'youtube' ? 36 : undefined}
|
|
760
|
+
/>
|
|
761
|
+
))}
|
|
762
|
+
</View>
|
|
763
|
+
</ScrollView>
|
|
764
|
+
</KeyboardAvoidingView>
|
|
765
|
+
|
|
766
|
+
{/* Fixed Bottom Buttons */}
|
|
767
|
+
<View style={styles.bottomContainer}>
|
|
768
|
+
<View style={styles.buttonContainer}>
|
|
769
|
+
<PrimaryButton
|
|
770
|
+
label="Continue"
|
|
771
|
+
onPress={handleUpdate}
|
|
772
|
+
disabled={loading || connectedPlatforms.size === 0 || isConnecting}
|
|
773
|
+
loading={loading || isConnecting}
|
|
774
|
+
/>
|
|
775
|
+
</View>
|
|
776
|
+
|
|
777
|
+
<View style={styles.skipContainer}>
|
|
778
|
+
<TouchableOpacity
|
|
779
|
+
onPress={handleSkip}
|
|
780
|
+
onLongPress={handleSkipLongPress}
|
|
781
|
+
onPressOut={handleSkipPressOut}
|
|
782
|
+
activeOpacity={0.7}
|
|
783
|
+
>
|
|
784
|
+
<Text style={styles.skipButton}>
|
|
785
|
+
Skip
|
|
786
|
+
</Text>
|
|
787
|
+
</TouchableOpacity>
|
|
788
|
+
</View>
|
|
789
|
+
</View>
|
|
790
|
+
</View>
|
|
791
|
+
);
|
|
792
|
+
};
|
|
793
|
+
|
|
794
|
+
const styles = StyleSheet.create({
|
|
795
|
+
container: {
|
|
796
|
+
flex: 1,
|
|
797
|
+
backgroundColor: COLORS.surface,
|
|
798
|
+
},
|
|
799
|
+
|
|
800
|
+
fixedHeaderSection: {
|
|
801
|
+
paddingTop: 8,
|
|
802
|
+
paddingHorizontal: 0,
|
|
803
|
+
backgroundColor: COLORS.surface,
|
|
804
|
+
maxHeight: '50%', // Limit fixed section to 50% of screen
|
|
805
|
+
overflow: 'hidden', // Hide any overflow
|
|
806
|
+
},
|
|
807
|
+
|
|
808
|
+
scrollableSection: {
|
|
809
|
+
flex: 1,
|
|
810
|
+
},
|
|
811
|
+
|
|
812
|
+
scrollView: {
|
|
813
|
+
flex: 1,
|
|
814
|
+
},
|
|
815
|
+
|
|
816
|
+
scrollContent: {
|
|
817
|
+
paddingTop: 0, // Ensure scroll starts at the top
|
|
818
|
+
},
|
|
819
|
+
|
|
820
|
+
headingContainer: {
|
|
821
|
+
width: '100%',
|
|
822
|
+
marginBottom: 0, // Remove margin to make persona very close
|
|
823
|
+
paddingHorizontal: 0,
|
|
824
|
+
},
|
|
825
|
+
|
|
826
|
+
title: {
|
|
827
|
+
fontFamily: 'IBM Plex Sans',
|
|
828
|
+
fontWeight: '700',
|
|
829
|
+
fontSize: 24,
|
|
830
|
+
lineHeight: 32,
|
|
831
|
+
color: COLORS.grey800,
|
|
832
|
+
textAlign: 'left',
|
|
833
|
+
marginBottom: 2,
|
|
834
|
+
},
|
|
835
|
+
|
|
836
|
+
subtitle: {
|
|
837
|
+
fontFamily: 'Inter',
|
|
838
|
+
fontWeight: '400',
|
|
839
|
+
fontSize: 16,
|
|
840
|
+
lineHeight: 24,
|
|
841
|
+
color: COLORS.grey600,
|
|
842
|
+
textAlign: 'left',
|
|
843
|
+
marginBottom: 0, // Remove bottom margin to bring persona closer
|
|
844
|
+
},
|
|
845
|
+
|
|
846
|
+
personaContainer: {
|
|
847
|
+
alignItems: 'center',
|
|
848
|
+
marginTop: -110, // Negative margin to pull persona up into header space
|
|
849
|
+
marginBottom: 0, // Remove bottom margin
|
|
850
|
+
},
|
|
851
|
+
|
|
852
|
+
largePersona: {
|
|
853
|
+
width: 650, // Make it bigger than default 200x200
|
|
854
|
+
height: 650,
|
|
855
|
+
marginTop: -20, // Additional negative margin to override internal spacing
|
|
856
|
+
marginBottom: -20, // Pull content below up as well
|
|
857
|
+
},
|
|
858
|
+
|
|
859
|
+
platformsContainer: {
|
|
860
|
+
paddingHorizontal: 0,
|
|
861
|
+
paddingTop: 8, // Reduced from 20 to minimize space at top of scroll area
|
|
862
|
+
paddingBottom: 120, // More space to account for fixed buttons at bottom
|
|
863
|
+
},
|
|
864
|
+
|
|
865
|
+
bottomContainer: {
|
|
866
|
+
position: 'absolute',
|
|
867
|
+
bottom: -40, // Position 40px from bottom of screen
|
|
868
|
+
left: 0,
|
|
869
|
+
right: 0,
|
|
870
|
+
paddingHorizontal: 0,
|
|
871
|
+
paddingBottom: SPACING.xl,
|
|
872
|
+
backgroundColor: COLORS.surface,
|
|
873
|
+
},
|
|
874
|
+
|
|
875
|
+
buttonContainer: {
|
|
876
|
+
marginBottom: 16,
|
|
877
|
+
},
|
|
878
|
+
|
|
879
|
+
skipContainer: {
|
|
880
|
+
alignItems: 'center',
|
|
881
|
+
},
|
|
882
|
+
|
|
883
|
+
skipButton: {
|
|
884
|
+
fontSize: 16,
|
|
885
|
+
fontFamily: 'Inter',
|
|
886
|
+
fontWeight: '500',
|
|
887
|
+
color: COLORS.grey600,
|
|
888
|
+
textAlign: 'center',
|
|
889
|
+
},
|
|
890
|
+
});
|
|
891
|
+
|
|
892
|
+
export default PlatformConnectorsStep;
|