@onairos/react-native 3.1.12 → 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.
Files changed (604) hide show
  1. package/lib/commonjs/api/index.js +75 -1
  2. package/lib/commonjs/api/index.js.map +1 -1
  3. package/lib/commonjs/assets/fonts/EBGaramond-VariableFont_wght.ttf +0 -0
  4. package/lib/commonjs/assets/fonts/IBMPlexSans-VariableFont_wdth,wght.ttf +0 -0
  5. package/lib/commonjs/assets/icons/Facebookicon.png +0 -0
  6. package/lib/commonjs/assets/icons/Gmail.png +0 -0
  7. package/lib/commonjs/assets/icons/Linkedinicon.png +0 -0
  8. package/lib/commonjs/assets/icons/Redditicon.png +0 -0
  9. package/lib/commonjs/assets/icons/YouTubeicon2.png +0 -0
  10. package/lib/commonjs/assets/icons/YouTubeicon3.png +0 -0
  11. package/lib/commonjs/assets/icons/farcaster.png +0 -0
  12. package/lib/commonjs/assets/icons/instagram.png +0 -0
  13. package/lib/commonjs/assets/icons/pinterest.png +0 -0
  14. package/lib/commonjs/assets/icons/swerv_logo.png +0 -0
  15. package/lib/commonjs/assets/icons/twitter.jpg +0 -0
  16. package/lib/commonjs/assets/images/Checkbox.svg +3 -0
  17. package/lib/commonjs/assets/images/EnochE.svg +19 -0
  18. package/lib/commonjs/assets/images/Enochicon1.png +0 -0
  19. package/lib/commonjs/assets/images/Face_ID_logo.png +0 -0
  20. package/lib/commonjs/assets/images/Facebookicon.png +0 -0
  21. package/lib/commonjs/assets/images/Gmail.png +0 -0
  22. package/lib/commonjs/assets/images/Googlelogo.png +0 -0
  23. package/lib/commonjs/assets/images/Linkedinicon.png +0 -0
  24. package/lib/commonjs/assets/images/Onairoslogo.png +0 -0
  25. package/lib/commonjs/assets/images/Personalityprofile.svg +3 -0
  26. package/lib/commonjs/assets/images/Personalitytraits.svg +3 -0
  27. package/lib/commonjs/assets/images/Redditicon.png +0 -0
  28. package/lib/commonjs/assets/images/Userpreferences.svg +3 -0
  29. package/lib/commonjs/assets/images/YouTubeicon3.png +0 -0
  30. package/lib/commonjs/assets/images/arrow.svg +20 -0
  31. package/lib/commonjs/assets/images/basicproficon.svg +43 -0
  32. package/lib/commonjs/assets/images/basicprofile.svg +3 -0
  33. package/lib/commonjs/assets/images/checkmark.svg +4 -0
  34. package/lib/commonjs/assets/images/contentanalysis.svg +3 -0
  35. package/lib/commonjs/assets/images/contenticon.svg +23 -0
  36. package/lib/commonjs/assets/images/persona1.png +0 -0
  37. package/lib/commonjs/assets/images/persona2.png +0 -0
  38. package/lib/commonjs/assets/images/persona3.png +0 -0
  39. package/lib/commonjs/assets/images/persona4.png +0 -0
  40. package/lib/commonjs/assets/images/persona5.png +0 -0
  41. package/lib/commonjs/assets/images/personalityicon.svg +18 -0
  42. package/lib/commonjs/assets/images/x-close.svg +3 -0
  43. package/lib/commonjs/components/BodyText.js +27 -0
  44. package/lib/commonjs/components/BodyText.js.map +1 -0
  45. package/lib/commonjs/components/BrandMark.js +44 -0
  46. package/lib/commonjs/components/BrandMark.js.map +1 -0
  47. package/lib/commonjs/components/CodeInput.js +30 -0
  48. package/lib/commonjs/components/CodeInput.js.map +1 -0
  49. package/lib/commonjs/components/EmailInput.js +30 -0
  50. package/lib/commonjs/components/EmailInput.js.map +1 -0
  51. package/lib/commonjs/components/ExistingUserDataConfirmation.js +474 -0
  52. package/lib/commonjs/components/ExistingUserDataConfirmation.js.map +1 -0
  53. package/lib/commonjs/components/GoogleButton.js +55 -0
  54. package/lib/commonjs/components/GoogleButton.js.map +1 -0
  55. package/lib/commonjs/components/HeadingGroup.js +43 -0
  56. package/lib/commonjs/components/HeadingGroup.js.map +1 -0
  57. package/lib/commonjs/components/ModalHeader.js +99 -0
  58. package/lib/commonjs/components/ModalHeader.js.map +1 -0
  59. package/lib/commonjs/components/ModalSheet.js +41 -0
  60. package/lib/commonjs/components/ModalSheet.js.map +1 -0
  61. package/lib/commonjs/components/Onairos.js +1 -3
  62. package/lib/commonjs/components/Onairos.js.map +1 -1
  63. package/lib/commonjs/components/OnairosButton.js +171 -190
  64. package/lib/commonjs/components/OnairosButton.js.map +1 -1
  65. package/lib/commonjs/components/OnairosSignInButton.js +169 -0
  66. package/lib/commonjs/components/OnairosSignInButton.js.map +1 -0
  67. package/lib/commonjs/components/Overlay.js +5 -5
  68. package/lib/commonjs/components/Overlay.js.map +1 -1
  69. package/lib/commonjs/components/PersonaImage.js +60 -0
  70. package/lib/commonjs/components/PersonaImage.js.map +1 -0
  71. package/lib/commonjs/components/PersonaLoadingScreen.js +156 -0
  72. package/lib/commonjs/components/PersonaLoadingScreen.js.map +1 -0
  73. package/lib/commonjs/components/PersonalizationConsentScreen.js +316 -0
  74. package/lib/commonjs/components/PersonalizationConsentScreen.js.map +1 -0
  75. package/lib/commonjs/components/PinCreationScreen.js +393 -0
  76. package/lib/commonjs/components/PinCreationScreen.js.map +1 -0
  77. package/lib/commonjs/components/PinInput.js +282 -120
  78. package/lib/commonjs/components/PinInput.js.map +1 -1
  79. package/lib/commonjs/components/PlatformConnectorsStep.js +828 -0
  80. package/lib/commonjs/components/PlatformConnectorsStep.js.map +1 -0
  81. package/lib/commonjs/components/PlatformToggle.js +180 -0
  82. package/lib/commonjs/components/PlatformToggle.js.map +1 -0
  83. package/lib/commonjs/components/PrimaryButton.js +180 -0
  84. package/lib/commonjs/components/PrimaryButton.js.map +1 -0
  85. package/lib/commonjs/components/SignInMatchAnimation.js +197 -0
  86. package/lib/commonjs/components/SignInMatchAnimation.js.map +1 -0
  87. package/lib/commonjs/components/SignInStep.js +179 -0
  88. package/lib/commonjs/components/SignInStep.js.map +1 -0
  89. package/lib/commonjs/components/TrainingModal.js +808 -563
  90. package/lib/commonjs/components/TrainingModal.js.map +1 -1
  91. package/lib/commonjs/components/UniversalOnboarding.js +2304 -1283
  92. package/lib/commonjs/components/UniversalOnboarding.js.map +1 -1
  93. package/lib/commonjs/components/VerificationStep.js +154 -0
  94. package/lib/commonjs/components/VerificationStep.js.map +1 -0
  95. package/lib/commonjs/components/WelcomeScreen.js +385 -0
  96. package/lib/commonjs/components/WelcomeScreen.js.map +1 -0
  97. package/lib/commonjs/components/icons/Basicproficon.js +37 -0
  98. package/lib/commonjs/components/icons/Basicproficon.js.map +1 -0
  99. package/lib/commonjs/components/icons/Basicprofile.js +21 -0
  100. package/lib/commonjs/components/icons/Basicprofile.js.map +1 -0
  101. package/lib/commonjs/components/icons/Checkbox.js +21 -0
  102. package/lib/commonjs/components/icons/Checkbox.js.map +1 -0
  103. package/lib/commonjs/components/icons/Checkmark.js +27 -0
  104. package/lib/commonjs/components/icons/Checkmark.js.map +1 -0
  105. package/lib/commonjs/components/icons/Contentanalysis.js +21 -0
  106. package/lib/commonjs/components/icons/Contentanalysis.js.map +1 -0
  107. package/lib/commonjs/components/icons/Contenticon.js +39 -0
  108. package/lib/commonjs/components/icons/Contenticon.js.map +1 -0
  109. package/lib/commonjs/components/icons/EnochE.js +41 -0
  110. package/lib/commonjs/components/icons/EnochE.js.map +1 -0
  111. package/lib/commonjs/components/icons/Personalityicon.js +30 -0
  112. package/lib/commonjs/components/icons/Personalityicon.js.map +1 -0
  113. package/lib/commonjs/components/icons/Personalityprofile.js +21 -0
  114. package/lib/commonjs/components/icons/Personalityprofile.js.map +1 -0
  115. package/lib/commonjs/components/icons/Personalitytraits.js +21 -0
  116. package/lib/commonjs/components/icons/Personalitytraits.js.map +1 -0
  117. package/lib/commonjs/components/icons/Userpreferences.js +21 -0
  118. package/lib/commonjs/components/icons/Userpreferences.js.map +1 -0
  119. package/lib/commonjs/components/icons/index.js +84 -0
  120. package/lib/commonjs/components/icons/index.js.map +1 -0
  121. package/lib/commonjs/components/onboarding/OAuthWebView.js +134 -743
  122. package/lib/commonjs/components/onboarding/OAuthWebView.js.map +1 -1
  123. package/lib/commonjs/config/api.js +34 -0
  124. package/lib/commonjs/config/api.js.map +1 -0
  125. package/lib/commonjs/context/AuthContext.js +345 -0
  126. package/lib/commonjs/context/AuthContext.js.map +1 -0
  127. package/lib/commonjs/hooks/useConnectedAccounts.js +111 -0
  128. package/lib/commonjs/hooks/useConnectedAccounts.js.map +1 -0
  129. package/lib/commonjs/hooks/useConnections.js +120 -125
  130. package/lib/commonjs/hooks/useConnections.js.map +1 -1
  131. package/lib/commonjs/hooks/useUserConnections.js +148 -0
  132. package/lib/commonjs/hooks/useUserConnections.js.map +1 -0
  133. package/lib/commonjs/index.js +149 -27
  134. package/lib/commonjs/index.js.map +1 -1
  135. package/lib/commonjs/services/apiClient.js +302 -0
  136. package/lib/commonjs/services/apiClient.js.map +1 -0
  137. package/lib/commonjs/services/apiKeyService.js +8 -9
  138. package/lib/commonjs/services/apiKeyService.js.map +1 -1
  139. package/lib/commonjs/services/authService.js +935 -0
  140. package/lib/commonjs/services/authService.js.map +1 -0
  141. package/lib/commonjs/services/biometricPinService.js +184 -0
  142. package/lib/commonjs/services/biometricPinService.js.map +1 -0
  143. package/lib/commonjs/services/connectedAccountsService.js +268 -0
  144. package/lib/commonjs/services/connectedAccountsService.js.map +1 -0
  145. package/lib/commonjs/services/googleAuthService.js +268 -0
  146. package/lib/commonjs/services/googleAuthService.js.map +1 -0
  147. package/lib/commonjs/services/imageCompressionService.js +260 -0
  148. package/lib/commonjs/services/imageCompressionService.js.map +1 -0
  149. package/lib/commonjs/services/jwtStorageService.js +256 -0
  150. package/lib/commonjs/services/jwtStorageService.js.map +1 -0
  151. package/lib/commonjs/services/mobileTrainingService.js +185 -0
  152. package/lib/commonjs/services/mobileTrainingService.js.map +1 -0
  153. package/lib/commonjs/services/pinEncryptionService.js +84 -0
  154. package/lib/commonjs/services/pinEncryptionService.js.map +1 -0
  155. package/lib/commonjs/services/pinStorageUtils.js +105 -0
  156. package/lib/commonjs/services/pinStorageUtils.js.map +1 -0
  157. package/lib/commonjs/services/platformAuthService.js +956 -722
  158. package/lib/commonjs/services/platformAuthService.js.map +1 -1
  159. package/lib/commonjs/services/storageService.js +404 -0
  160. package/lib/commonjs/services/storageService.js.map +1 -0
  161. package/lib/commonjs/services/trainingApiHelpers.js +73 -0
  162. package/lib/commonjs/services/trainingApiHelpers.js.map +1 -0
  163. package/lib/commonjs/services/userConnectionsService.js +486 -0
  164. package/lib/commonjs/services/userConnectionsService.js.map +1 -0
  165. package/lib/commonjs/services/youtubeMigrationService.js +415 -0
  166. package/lib/commonjs/services/youtubeMigrationService.js.map +1 -0
  167. package/lib/commonjs/theme/index.js +249 -0
  168. package/lib/commonjs/theme/index.js.map +1 -0
  169. package/lib/commonjs/utils/eventUtils.js +288 -0
  170. package/lib/commonjs/utils/eventUtils.js.map +1 -0
  171. package/lib/commonjs/utils/haptics.js +66 -0
  172. package/lib/commonjs/utils/haptics.js.map +1 -0
  173. package/lib/commonjs/utils/imagePreloader.js +6 -0
  174. package/lib/commonjs/utils/imagePreloader.js.map +1 -0
  175. package/lib/module/api/index.js +72 -0
  176. package/lib/module/api/index.js.map +1 -1
  177. package/lib/module/assets/fonts/EBGaramond-VariableFont_wght.ttf +0 -0
  178. package/lib/module/assets/fonts/IBMPlexSans-VariableFont_wdth,wght.ttf +0 -0
  179. package/lib/module/assets/icons/Facebookicon.png +0 -0
  180. package/lib/module/assets/icons/Gmail.png +0 -0
  181. package/lib/module/assets/icons/Linkedinicon.png +0 -0
  182. package/lib/module/assets/icons/Redditicon.png +0 -0
  183. package/lib/module/assets/icons/YouTubeicon2.png +0 -0
  184. package/lib/module/assets/icons/YouTubeicon3.png +0 -0
  185. package/lib/module/assets/icons/farcaster.png +0 -0
  186. package/lib/module/assets/icons/instagram.png +0 -0
  187. package/lib/module/assets/icons/pinterest.png +0 -0
  188. package/lib/module/assets/icons/swerv_logo.png +0 -0
  189. package/lib/module/assets/icons/twitter.jpg +0 -0
  190. package/lib/module/assets/images/Checkbox.svg +3 -0
  191. package/lib/module/assets/images/EnochE.svg +19 -0
  192. package/lib/module/assets/images/Enochicon1.png +0 -0
  193. package/lib/module/assets/images/Face_ID_logo.png +0 -0
  194. package/lib/module/assets/images/Facebookicon.png +0 -0
  195. package/lib/module/assets/images/Gmail.png +0 -0
  196. package/lib/module/assets/images/Googlelogo.png +0 -0
  197. package/lib/module/assets/images/Linkedinicon.png +0 -0
  198. package/lib/module/assets/images/Onairoslogo.png +0 -0
  199. package/lib/module/assets/images/Personalityprofile.svg +3 -0
  200. package/lib/module/assets/images/Personalitytraits.svg +3 -0
  201. package/lib/module/assets/images/Redditicon.png +0 -0
  202. package/lib/module/assets/images/Userpreferences.svg +3 -0
  203. package/lib/module/assets/images/YouTubeicon3.png +0 -0
  204. package/lib/module/assets/images/arrow.svg +20 -0
  205. package/lib/module/assets/images/basicproficon.svg +43 -0
  206. package/lib/module/assets/images/basicprofile.svg +3 -0
  207. package/lib/module/assets/images/checkmark.svg +4 -0
  208. package/lib/module/assets/images/contentanalysis.svg +3 -0
  209. package/lib/module/assets/images/contenticon.svg +23 -0
  210. package/lib/module/assets/images/persona1.png +0 -0
  211. package/lib/module/assets/images/persona2.png +0 -0
  212. package/lib/module/assets/images/persona3.png +0 -0
  213. package/lib/module/assets/images/persona4.png +0 -0
  214. package/lib/module/assets/images/persona5.png +0 -0
  215. package/lib/module/assets/images/personalityicon.svg +18 -0
  216. package/lib/module/assets/images/x-close.svg +3 -0
  217. package/lib/module/components/BodyText.js +20 -0
  218. package/lib/module/components/BodyText.js.map +1 -0
  219. package/lib/module/components/BrandMark.js +37 -0
  220. package/lib/module/components/BrandMark.js.map +1 -0
  221. package/lib/module/components/CodeInput.js +23 -0
  222. package/lib/module/components/CodeInput.js.map +1 -0
  223. package/lib/module/components/EmailInput.js +23 -0
  224. package/lib/module/components/EmailInput.js.map +1 -0
  225. package/lib/module/components/ExistingUserDataConfirmation.js +465 -0
  226. package/lib/module/components/ExistingUserDataConfirmation.js.map +1 -0
  227. package/lib/module/components/GoogleButton.js +48 -0
  228. package/lib/module/components/GoogleButton.js.map +1 -0
  229. package/lib/module/components/HeadingGroup.js +36 -0
  230. package/lib/module/components/HeadingGroup.js.map +1 -0
  231. package/lib/module/components/ModalHeader.js +92 -0
  232. package/lib/module/components/ModalHeader.js.map +1 -0
  233. package/lib/module/components/ModalSheet.js +34 -0
  234. package/lib/module/components/ModalSheet.js.map +1 -0
  235. package/lib/module/components/Onairos.js +1 -3
  236. package/lib/module/components/Onairos.js.map +1 -1
  237. package/lib/module/components/OnairosButton.js +172 -192
  238. package/lib/module/components/OnairosButton.js.map +1 -1
  239. package/lib/module/components/OnairosSignInButton.js +160 -0
  240. package/lib/module/components/OnairosSignInButton.js.map +1 -0
  241. package/lib/module/components/Overlay.js +5 -5
  242. package/lib/module/components/Overlay.js.map +1 -1
  243. package/lib/module/components/PersonaImage.js +53 -0
  244. package/lib/module/components/PersonaImage.js.map +1 -0
  245. package/lib/module/components/PersonaLoadingScreen.js +148 -0
  246. package/lib/module/components/PersonaLoadingScreen.js.map +1 -0
  247. package/lib/module/components/PersonalizationConsentScreen.js +309 -0
  248. package/lib/module/components/PersonalizationConsentScreen.js.map +1 -0
  249. package/lib/module/components/PinCreationScreen.js +386 -0
  250. package/lib/module/components/PinCreationScreen.js.map +1 -0
  251. package/lib/module/components/PinInput.js +283 -120
  252. package/lib/module/components/PinInput.js.map +1 -1
  253. package/lib/module/components/PlatformConnectorsStep.js +820 -0
  254. package/lib/module/components/PlatformConnectorsStep.js.map +1 -0
  255. package/lib/module/components/PlatformToggle.js +173 -0
  256. package/lib/module/components/PlatformToggle.js.map +1 -0
  257. package/lib/module/components/PrimaryButton.js +172 -0
  258. package/lib/module/components/PrimaryButton.js.map +1 -0
  259. package/lib/module/components/SignInMatchAnimation.js +189 -0
  260. package/lib/module/components/SignInMatchAnimation.js.map +1 -0
  261. package/lib/module/components/SignInStep.js +171 -0
  262. package/lib/module/components/SignInStep.js.map +1 -0
  263. package/lib/module/components/TrainingModal.js +809 -565
  264. package/lib/module/components/TrainingModal.js.map +1 -1
  265. package/lib/module/components/UniversalOnboarding.js +2307 -1284
  266. package/lib/module/components/UniversalOnboarding.js.map +1 -1
  267. package/lib/module/components/VerificationStep.js +146 -0
  268. package/lib/module/components/VerificationStep.js.map +1 -0
  269. package/lib/module/components/WelcomeScreen.js +378 -0
  270. package/lib/module/components/WelcomeScreen.js.map +1 -0
  271. package/lib/module/components/icons/Basicproficon.js +30 -0
  272. package/lib/module/components/icons/Basicproficon.js.map +1 -0
  273. package/lib/module/components/icons/Basicprofile.js +14 -0
  274. package/lib/module/components/icons/Basicprofile.js.map +1 -0
  275. package/lib/module/components/icons/Checkbox.js +14 -0
  276. package/lib/module/components/icons/Checkbox.js.map +1 -0
  277. package/lib/module/components/icons/Checkmark.js +20 -0
  278. package/lib/module/components/icons/Checkmark.js.map +1 -0
  279. package/lib/module/components/icons/Contentanalysis.js +14 -0
  280. package/lib/module/components/icons/Contentanalysis.js.map +1 -0
  281. package/lib/module/components/icons/Contenticon.js +32 -0
  282. package/lib/module/components/icons/Contenticon.js.map +1 -0
  283. package/lib/module/components/icons/EnochE.js +34 -0
  284. package/lib/module/components/icons/EnochE.js.map +1 -0
  285. package/lib/module/components/icons/Personalityicon.js +23 -0
  286. package/lib/module/components/icons/Personalityicon.js.map +1 -0
  287. package/lib/module/components/icons/Personalityprofile.js +14 -0
  288. package/lib/module/components/icons/Personalityprofile.js.map +1 -0
  289. package/lib/module/components/icons/Personalitytraits.js +14 -0
  290. package/lib/module/components/icons/Personalitytraits.js.map +1 -0
  291. package/lib/module/components/icons/Userpreferences.js +14 -0
  292. package/lib/module/components/icons/Userpreferences.js.map +1 -0
  293. package/lib/module/components/icons/index.js +13 -0
  294. package/lib/module/components/icons/index.js.map +1 -0
  295. package/lib/module/components/onboarding/OAuthWebView.js +136 -744
  296. package/lib/module/components/onboarding/OAuthWebView.js.map +1 -1
  297. package/lib/module/config/api.js +26 -0
  298. package/lib/module/config/api.js.map +1 -0
  299. package/lib/module/context/AuthContext.js +335 -0
  300. package/lib/module/context/AuthContext.js.map +1 -0
  301. package/lib/module/hooks/useConnectedAccounts.js +106 -0
  302. package/lib/module/hooks/useConnectedAccounts.js.map +1 -0
  303. package/lib/module/hooks/useConnections.js +119 -125
  304. package/lib/module/hooks/useConnections.js.map +1 -1
  305. package/lib/module/hooks/useUserConnections.js +140 -0
  306. package/lib/module/hooks/useUserConnections.js.map +1 -0
  307. package/lib/module/index.js +51 -15
  308. package/lib/module/index.js.map +1 -1
  309. package/lib/module/services/apiClient.js +298 -0
  310. package/lib/module/services/apiClient.js.map +1 -0
  311. package/lib/module/services/apiKeyService.js +8 -9
  312. package/lib/module/services/apiKeyService.js.map +1 -1
  313. package/lib/module/services/authService.js +905 -0
  314. package/lib/module/services/authService.js.map +1 -0
  315. package/lib/module/services/biometricPinService.js +173 -0
  316. package/lib/module/services/biometricPinService.js.map +1 -0
  317. package/lib/module/services/connectedAccountsService.js +255 -0
  318. package/lib/module/services/connectedAccountsService.js.map +1 -0
  319. package/lib/module/services/googleAuthService.js +258 -0
  320. package/lib/module/services/googleAuthService.js.map +1 -0
  321. package/lib/module/services/imageCompressionService.js +250 -0
  322. package/lib/module/services/imageCompressionService.js.map +1 -0
  323. package/lib/module/services/jwtStorageService.js +239 -0
  324. package/lib/module/services/jwtStorageService.js.map +1 -0
  325. package/lib/module/services/mobileTrainingService.js +172 -0
  326. package/lib/module/services/mobileTrainingService.js.map +1 -0
  327. package/lib/module/services/pinEncryptionService.js +75 -0
  328. package/lib/module/services/pinEncryptionService.js.map +1 -0
  329. package/lib/module/services/pinStorageUtils.js +93 -0
  330. package/lib/module/services/pinStorageUtils.js.map +1 -0
  331. package/lib/module/services/platformAuthService.js +943 -704
  332. package/lib/module/services/platformAuthService.js.map +1 -1
  333. package/lib/module/services/storageService.js +383 -0
  334. package/lib/module/services/storageService.js.map +1 -0
  335. package/lib/module/services/trainingApiHelpers.js +67 -0
  336. package/lib/module/services/trainingApiHelpers.js.map +1 -0
  337. package/lib/module/services/userConnectionsService.js +476 -0
  338. package/lib/module/services/userConnectionsService.js.map +1 -0
  339. package/lib/module/services/youtubeMigrationService.js +404 -0
  340. package/lib/module/services/youtubeMigrationService.js.map +1 -0
  341. package/lib/module/theme/index.js +244 -0
  342. package/lib/module/theme/index.js.map +1 -0
  343. package/lib/module/utils/eventUtils.js +270 -0
  344. package/lib/module/utils/eventUtils.js.map +1 -0
  345. package/lib/module/utils/haptics.js +59 -0
  346. package/lib/module/utils/haptics.js.map +1 -0
  347. package/lib/module/utils/imagePreloader.js +3 -0
  348. package/lib/module/utils/imagePreloader.js.map +1 -0
  349. package/lib/typescript/api/index.d.ts +8 -0
  350. package/lib/typescript/api/index.d.ts.map +1 -1
  351. package/lib/typescript/components/BodyText.d.ts +10 -0
  352. package/lib/typescript/components/BodyText.d.ts.map +1 -0
  353. package/lib/typescript/components/BrandMark.d.ts +11 -0
  354. package/lib/typescript/components/BrandMark.d.ts.map +1 -0
  355. package/lib/typescript/components/CodeInput.d.ts +10 -0
  356. package/lib/typescript/components/CodeInput.d.ts.map +1 -0
  357. package/lib/typescript/components/EmailInput.d.ts +8 -0
  358. package/lib/typescript/components/EmailInput.d.ts.map +1 -0
  359. package/lib/typescript/components/ExistingUserDataConfirmation.d.ts +12 -0
  360. package/lib/typescript/components/ExistingUserDataConfirmation.d.ts.map +1 -0
  361. package/lib/typescript/components/GoogleButton.d.ts +11 -0
  362. package/lib/typescript/components/GoogleButton.d.ts.map +1 -0
  363. package/lib/typescript/components/HeadingGroup.d.ts +11 -0
  364. package/lib/typescript/components/HeadingGroup.d.ts.map +1 -0
  365. package/lib/typescript/components/ModalHeader.d.ts +11 -0
  366. package/lib/typescript/components/ModalHeader.d.ts.map +1 -0
  367. package/lib/typescript/components/ModalSheet.d.ts +13 -0
  368. package/lib/typescript/components/ModalSheet.d.ts.map +1 -0
  369. package/lib/typescript/components/Onairos.d.ts.map +1 -1
  370. package/lib/typescript/components/OnairosButton.d.ts +29 -4
  371. package/lib/typescript/components/OnairosButton.d.ts.map +1 -1
  372. package/lib/typescript/components/OnairosSignInButton.d.ts +14 -0
  373. package/lib/typescript/components/OnairosSignInButton.d.ts.map +1 -0
  374. package/lib/typescript/components/PersonaImage.d.ts +8 -0
  375. package/lib/typescript/components/PersonaImage.d.ts.map +1 -0
  376. package/lib/typescript/components/PersonaLoadingScreen.d.ts +10 -0
  377. package/lib/typescript/components/PersonaLoadingScreen.d.ts.map +1 -0
  378. package/lib/typescript/components/PersonalizationConsentScreen.d.ts +10 -0
  379. package/lib/typescript/components/PersonalizationConsentScreen.d.ts.map +1 -0
  380. package/lib/typescript/components/PinCreationScreen.d.ts +10 -0
  381. package/lib/typescript/components/PinCreationScreen.d.ts.map +1 -0
  382. package/lib/typescript/components/PinInput.d.ts +11 -1
  383. package/lib/typescript/components/PinInput.d.ts.map +1 -1
  384. package/lib/typescript/components/PlatformConnectorsStep.d.ts +11 -0
  385. package/lib/typescript/components/PlatformConnectorsStep.d.ts.map +1 -0
  386. package/lib/typescript/components/PlatformToggle.d.ts +20 -0
  387. package/lib/typescript/components/PlatformToggle.d.ts.map +1 -0
  388. package/lib/typescript/components/PrimaryButton.d.ts +22 -0
  389. package/lib/typescript/components/PrimaryButton.d.ts.map +1 -0
  390. package/lib/typescript/components/SignInMatchAnimation.d.ts +9 -0
  391. package/lib/typescript/components/SignInMatchAnimation.d.ts.map +1 -0
  392. package/lib/typescript/components/SignInStep.d.ts +12 -0
  393. package/lib/typescript/components/SignInStep.d.ts.map +1 -0
  394. package/lib/typescript/components/TrainingModal.d.ts +12 -1
  395. package/lib/typescript/components/TrainingModal.d.ts.map +1 -1
  396. package/lib/typescript/components/UniversalOnboarding.d.ts +14 -1
  397. package/lib/typescript/components/UniversalOnboarding.d.ts.map +1 -1
  398. package/lib/typescript/components/VerificationStep.d.ts +13 -0
  399. package/lib/typescript/components/VerificationStep.d.ts.map +1 -0
  400. package/lib/typescript/components/WelcomeScreen.d.ts +9 -0
  401. package/lib/typescript/components/WelcomeScreen.d.ts.map +1 -0
  402. package/lib/typescript/components/icons/Basicproficon.d.ts +5 -0
  403. package/lib/typescript/components/icons/Basicproficon.d.ts.map +1 -0
  404. package/lib/typescript/components/icons/Basicprofile.d.ts +5 -0
  405. package/lib/typescript/components/icons/Basicprofile.d.ts.map +1 -0
  406. package/lib/typescript/components/icons/Checkbox.d.ts +5 -0
  407. package/lib/typescript/components/icons/Checkbox.d.ts.map +1 -0
  408. package/lib/typescript/components/icons/Checkmark.d.ts +5 -0
  409. package/lib/typescript/components/icons/Checkmark.d.ts.map +1 -0
  410. package/lib/typescript/components/icons/Contentanalysis.d.ts +5 -0
  411. package/lib/typescript/components/icons/Contentanalysis.d.ts.map +1 -0
  412. package/lib/typescript/components/icons/Contenticon.d.ts +5 -0
  413. package/lib/typescript/components/icons/Contenticon.d.ts.map +1 -0
  414. package/lib/typescript/components/icons/EnochE.d.ts +5 -0
  415. package/lib/typescript/components/icons/EnochE.d.ts.map +1 -0
  416. package/lib/typescript/components/icons/Personalityicon.d.ts +5 -0
  417. package/lib/typescript/components/icons/Personalityicon.d.ts.map +1 -0
  418. package/lib/typescript/components/icons/Personalityprofile.d.ts +5 -0
  419. package/lib/typescript/components/icons/Personalityprofile.d.ts.map +1 -0
  420. package/lib/typescript/components/icons/Personalitytraits.d.ts +5 -0
  421. package/lib/typescript/components/icons/Personalitytraits.d.ts.map +1 -0
  422. package/lib/typescript/components/icons/Userpreferences.d.ts +5 -0
  423. package/lib/typescript/components/icons/Userpreferences.d.ts.map +1 -0
  424. package/lib/typescript/components/icons/index.d.ts +12 -0
  425. package/lib/typescript/components/icons/index.d.ts.map +1 -0
  426. package/lib/typescript/components/onboarding/OAuthWebView.d.ts.map +1 -1
  427. package/lib/typescript/config/api.d.ts +24 -0
  428. package/lib/typescript/config/api.d.ts.map +1 -0
  429. package/lib/typescript/context/AuthContext.d.ts +34 -0
  430. package/lib/typescript/context/AuthContext.d.ts.map +1 -0
  431. package/lib/typescript/hooks/useConnectedAccounts.d.ts +11 -0
  432. package/lib/typescript/hooks/useConnectedAccounts.d.ts.map +1 -0
  433. package/lib/typescript/hooks/useConnections.d.ts +10 -5
  434. package/lib/typescript/hooks/useConnections.d.ts.map +1 -1
  435. package/lib/typescript/hooks/useUserConnections.d.ts +12 -0
  436. package/lib/typescript/hooks/useUserConnections.d.ts.map +1 -0
  437. package/lib/typescript/index.d.ts +24 -6
  438. package/lib/typescript/index.d.ts.map +1 -1
  439. package/lib/typescript/services/apiClient.d.ts +91 -0
  440. package/lib/typescript/services/apiClient.d.ts.map +1 -0
  441. package/lib/typescript/services/apiKeyService.d.ts.map +1 -1
  442. package/lib/typescript/services/authService.d.ts +216 -0
  443. package/lib/typescript/services/authService.d.ts.map +1 -0
  444. package/lib/typescript/services/biometricPinService.d.ts +29 -0
  445. package/lib/typescript/services/biometricPinService.d.ts.map +1 -0
  446. package/lib/typescript/services/connectedAccountsService.d.ts +56 -0
  447. package/lib/typescript/services/connectedAccountsService.d.ts.map +1 -0
  448. package/lib/typescript/services/googleAuthService.d.ts +63 -0
  449. package/lib/typescript/services/googleAuthService.d.ts.map +1 -0
  450. package/lib/typescript/services/imageCompressionService.d.ts +37 -0
  451. package/lib/typescript/services/imageCompressionService.d.ts.map +1 -0
  452. package/lib/typescript/services/jwtStorageService.d.ts +86 -0
  453. package/lib/typescript/services/jwtStorageService.d.ts.map +1 -0
  454. package/lib/typescript/services/mobileTrainingService.d.ts +45 -0
  455. package/lib/typescript/services/mobileTrainingService.d.ts.map +1 -0
  456. package/lib/typescript/services/pinEncryptionService.d.ts +17 -0
  457. package/lib/typescript/services/pinEncryptionService.d.ts.map +1 -0
  458. package/lib/typescript/services/pinStorageUtils.d.ts +25 -0
  459. package/lib/typescript/services/pinStorageUtils.d.ts.map +1 -0
  460. package/lib/typescript/services/platformAuthService.d.ts +34 -109
  461. package/lib/typescript/services/platformAuthService.d.ts.map +1 -1
  462. package/lib/typescript/services/storageService.d.ts +128 -0
  463. package/lib/typescript/services/storageService.d.ts.map +1 -0
  464. package/lib/typescript/services/trainingApiHelpers.d.ts +38 -0
  465. package/lib/typescript/services/trainingApiHelpers.d.ts.map +1 -0
  466. package/lib/typescript/services/userConnectionsService.d.ts +90 -0
  467. package/lib/typescript/services/userConnectionsService.d.ts.map +1 -0
  468. package/lib/typescript/services/youtubeMigrationService.d.ts +12 -0
  469. package/lib/typescript/services/youtubeMigrationService.d.ts.map +1 -0
  470. package/lib/typescript/theme/index.d.ts +416 -0
  471. package/lib/typescript/theme/index.d.ts.map +1 -0
  472. package/lib/typescript/types/index.d.ts +39 -0
  473. package/lib/typescript/types/index.d.ts.map +1 -1
  474. package/lib/typescript/utils/eventUtils.d.ts +108 -0
  475. package/lib/typescript/utils/eventUtils.d.ts.map +1 -0
  476. package/lib/typescript/utils/haptics.d.ts +11 -0
  477. package/lib/typescript/utils/haptics.d.ts.map +1 -0
  478. package/lib/typescript/utils/imagePreloader.d.ts +2 -0
  479. package/lib/typescript/utils/imagePreloader.d.ts.map +1 -0
  480. package/package.json +158 -145
  481. package/src/api/index.ts +41 -0
  482. package/src/assets/fonts/EBGaramond-VariableFont_wght.ttf +0 -0
  483. package/src/assets/fonts/IBMPlexSans-VariableFont_wdth,wght.ttf +0 -0
  484. package/src/assets/icons/Facebookicon.png +0 -0
  485. package/src/assets/icons/Gmail.png +0 -0
  486. package/src/assets/icons/Linkedinicon.png +0 -0
  487. package/src/assets/icons/Redditicon.png +0 -0
  488. package/src/assets/icons/YouTubeicon2.png +0 -0
  489. package/src/assets/icons/YouTubeicon3.png +0 -0
  490. package/src/assets/icons/farcaster.png +0 -0
  491. package/src/assets/icons/instagram.png +0 -0
  492. package/src/assets/icons/pinterest.png +0 -0
  493. package/src/assets/icons/swerv_logo.png +0 -0
  494. package/src/assets/icons/twitter.jpg +0 -0
  495. package/src/assets/images/Checkbox.svg +3 -0
  496. package/src/assets/images/EnochE.svg +19 -0
  497. package/src/assets/images/Enochicon1.png +0 -0
  498. package/src/assets/images/Face_ID_logo.png +0 -0
  499. package/src/assets/images/Facebookicon.png +0 -0
  500. package/src/assets/images/Gmail.png +0 -0
  501. package/src/assets/images/Googlelogo.png +0 -0
  502. package/src/assets/images/Linkedinicon.png +0 -0
  503. package/src/assets/images/Onairoslogo.png +0 -0
  504. package/src/assets/images/Personalityprofile.svg +3 -0
  505. package/src/assets/images/Personalitytraits.svg +3 -0
  506. package/src/assets/images/Redditicon.png +0 -0
  507. package/src/assets/images/Userpreferences.svg +3 -0
  508. package/src/assets/images/YouTubeicon3.png +0 -0
  509. package/src/assets/images/arrow.svg +20 -0
  510. package/src/assets/images/basicproficon.svg +43 -0
  511. package/src/assets/images/basicprofile.svg +3 -0
  512. package/src/assets/images/checkmark.svg +4 -0
  513. package/src/assets/images/contentanalysis.svg +3 -0
  514. package/src/assets/images/contenticon.svg +23 -0
  515. package/src/assets/images/persona1.png +0 -0
  516. package/src/assets/images/persona2.png +0 -0
  517. package/src/assets/images/persona3.png +0 -0
  518. package/src/assets/images/persona4.png +0 -0
  519. package/src/assets/images/persona5.png +0 -0
  520. package/src/assets/images/personalityicon.svg +18 -0
  521. package/src/assets/images/x-close.svg +3 -0
  522. package/src/components/BodyText.tsx +33 -0
  523. package/src/components/BrandMark.tsx +62 -0
  524. package/src/components/CodeInput.tsx +32 -0
  525. package/src/components/EmailInput.tsx +31 -0
  526. package/src/components/ExistingUserDataConfirmation.tsx +507 -0
  527. package/src/components/GoogleButton.tsx +55 -0
  528. package/src/components/HeadingGroup.tsx +49 -0
  529. package/src/components/ModalHeader.tsx +125 -0
  530. package/src/components/ModalSheet.tsx +57 -0
  531. package/src/components/Onairos.tsx +422 -424
  532. package/src/components/OnairosButton.tsx +339 -359
  533. package/src/components/OnairosSignInButton.tsx +166 -0
  534. package/src/components/Overlay.tsx +506 -506
  535. package/src/components/PersonaImage.tsx +79 -0
  536. package/src/components/PersonaLoadingScreen.tsx +201 -0
  537. package/src/components/PersonalizationConsentScreen.tsx +410 -0
  538. package/src/components/PinCreationScreen.tsx +492 -0
  539. package/src/components/PinInput.tsx +555 -343
  540. package/src/components/PlatformConnectorsStep.tsx +892 -0
  541. package/src/components/PlatformToggle.tsx +226 -0
  542. package/src/components/PrimaryButton.tsx +214 -0
  543. package/src/components/SignInMatchAnimation.tsx +225 -0
  544. package/src/components/SignInStep.tsx +217 -0
  545. package/src/components/TrainingModal.tsx +1047 -737
  546. package/src/components/UniversalOnboarding.tsx +2888 -1820
  547. package/src/components/VerificationStep.tsx +198 -0
  548. package/src/components/WelcomeScreen.tsx +473 -0
  549. package/src/components/icons/Basicproficon.tsx +30 -0
  550. package/src/components/icons/Basicprofile.tsx +17 -0
  551. package/src/components/icons/Checkbox.tsx +17 -0
  552. package/src/components/icons/Checkmark.tsx +24 -0
  553. package/src/components/icons/Contentanalysis.tsx +17 -0
  554. package/src/components/icons/Contenticon.tsx +30 -0
  555. package/src/components/icons/EnochE.tsx +39 -0
  556. package/src/components/icons/Personalityicon.tsx +22 -0
  557. package/src/components/icons/Personalityprofile.tsx +17 -0
  558. package/src/components/icons/Personalitytraits.tsx +17 -0
  559. package/src/components/icons/Userpreferences.tsx +17 -0
  560. package/src/components/icons/index.ts +12 -0
  561. package/src/components/onboarding/OAuthWebView.tsx +232 -838
  562. package/src/config/api.ts +25 -0
  563. package/src/context/AuthContext.tsx +393 -0
  564. package/src/hooks/useConnectedAccounts.ts +139 -0
  565. package/src/hooks/useConnections.ts +129 -131
  566. package/src/hooks/useUserConnections.ts +166 -0
  567. package/src/index.ts +94 -49
  568. package/src/services/apiClient.ts +337 -0
  569. package/src/services/apiKeyService.ts +9 -11
  570. package/src/services/authService.ts +1008 -0
  571. package/src/services/biometricPinService.ts +193 -0
  572. package/src/services/connectedAccountsService.ts +290 -0
  573. package/src/services/googleAuthService.ts +279 -0
  574. package/src/services/imageCompressionService.ts +303 -0
  575. package/src/services/jwtStorageService.ts +257 -0
  576. package/src/services/mobileTrainingService.ts +204 -0
  577. package/src/services/pinEncryptionService.ts +76 -0
  578. package/src/services/pinStorageUtils.ts +97 -0
  579. package/src/services/platformAuthService.ts +1346 -1113
  580. package/src/services/storageService.ts +452 -0
  581. package/src/services/trainingApiHelpers.ts +67 -0
  582. package/src/services/userConnectionsService.ts +557 -0
  583. package/src/services/youtubeMigrationService.ts +454 -0
  584. package/src/theme/index.ts +239 -0
  585. package/src/types/index.ts +265 -238
  586. package/src/utils/eventUtils.ts +303 -0
  587. package/src/utils/haptics.ts +59 -0
  588. package/src/utils/imagePreloader.ts +2 -0
  589. package/README.md +0 -375
  590. package/lib/commonjs/assets/images/email.png +0 -0
  591. package/lib/commonjs/assets/images/linkedin.png +0 -0
  592. package/lib/commonjs/assets/images/reddit.png +0 -0
  593. package/lib/commonjs/assets/images/youtube.png +0 -0
  594. package/lib/commonjs/components/UniversalOnboarding.tsx.new +0 -455
  595. package/lib/module/assets/images/email.png +0 -0
  596. package/lib/module/assets/images/linkedin.png +0 -0
  597. package/lib/module/assets/images/reddit.png +0 -0
  598. package/lib/module/assets/images/youtube.png +0 -0
  599. package/lib/module/components/UniversalOnboarding.tsx.new +0 -455
  600. package/src/assets/images/email.png +0 -0
  601. package/src/assets/images/linkedin.png +0 -0
  602. package/src/assets/images/reddit.png +0 -0
  603. package/src/assets/images/youtube.png +0 -0
  604. 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;