@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,905 @@
1
+ import AsyncStorage from '@react-native-async-storage/async-storage';
2
+ import { API_CONFIG, getApiHeaders, getAuthHeaders } from '../config/api';
3
+
4
+ // API base URL
5
+ const API_BASE_URL = API_CONFIG.BASE_URL;
6
+
7
+ // Interface for authentication responses
8
+
9
+ // Interface for Apple authentication payload
10
+
11
+ /**
12
+ * Interface for the timer response from backend
13
+ */
14
+
15
+ /**
16
+ * Interface for the profile response from backend
17
+ */
18
+
19
+ /**
20
+ * Interface for creating/updating user profile
21
+ */
22
+
23
+ /**
24
+ * Authenticate with Apple
25
+ * @param appleAuthData Data from Apple authentication
26
+ * @returns Authentication response with token and user data
27
+ */
28
+ /**
29
+ * Authenticate with Onairos (similar to Apple authentication)
30
+ * @param onairosAuthData Data from Onairos authentication
31
+ * @returns Authentication response with token and user data
32
+ */
33
+ export const authenticateWithOnairos = async onairosAuthData => {
34
+ try {
35
+ console.log('🔑 Authenticating with Onairos...');
36
+
37
+ // For Onairos, we already have the JWT token from TrainingModal
38
+ // We just need to create a proper user object like Apple does
39
+
40
+ // Store the token in all the expected locations
41
+ // CRITICAL FIX: Store as Onairos token (OAuth gives Onairos JWT)
42
+ const {
43
+ TokenType,
44
+ storeJWT
45
+ } = await import('./jwtStorageService');
46
+ await storeJWT(TokenType.ONAIROS, onairosAuthData.token);
47
+
48
+ // Extract username from email or use stored username
49
+ const storedUsername = await AsyncStorage.getItem('onairos_username');
50
+ const userName = storedUsername || onairosAuthData.email.split('@')[0] || 'Onairos User';
51
+
52
+ // Store username and email
53
+ await AsyncStorage.setItem('onairos_username', userName);
54
+ await AsyncStorage.setItem('user_email', onairosAuthData.email);
55
+ console.log('🔑 Onairos auth token stored:', `${onairosAuthData.token.substring(0, 20)}...`);
56
+ console.log('👤 User info:', {
57
+ email: onairosAuthData.email,
58
+ username: userName
59
+ });
60
+ return {
61
+ token: onairosAuthData.token,
62
+ user: {
63
+ id: Date.now().toString(),
64
+ // Generate a unique ID
65
+ name: userName,
66
+ email: onairosAuthData.email,
67
+ profilePicture: ''
68
+ },
69
+ onairos: {
70
+ hasConnectedOnairos: true,
71
+ onairosUserId: Date.now().toString(),
72
+ lastConnectedAt: new Date().toISOString()
73
+ }
74
+ };
75
+ } catch (error) {
76
+ console.error('❌ Onairos authentication error:', error);
77
+ throw error;
78
+ }
79
+ };
80
+
81
+ /**
82
+ * Authenticate with Onairos using the standardized /login/signin endpoint
83
+ * @param credentials Email and password for Onairos sign-in
84
+ * @returns Authentication response with token and user data
85
+ */
86
+ export const authenticateWithOnairosSignIn = async credentials => {
87
+ try {
88
+ console.log('🔑 Signing in with Onairos via /login/signin endpoint...');
89
+ const response = await fetch(`${API_BASE_URL}/login/signin`, {
90
+ method: 'POST',
91
+ headers: getApiHeaders(),
92
+ body: JSON.stringify(credentials)
93
+ });
94
+ if (!response.ok) {
95
+ const errorData = await response.json();
96
+ throw new Error(errorData.error || 'Onairos sign-in failed');
97
+ }
98
+ const authData = await response.json();
99
+ console.log('✅ Onairos sign-in successful');
100
+
101
+ // Check for authentication token first - this is the most critical part
102
+ if (!authData.token) {
103
+ throw new Error('No authentication token returned from Onairos sign-in');
104
+ }
105
+
106
+ // Log if result field is missing or unexpected (but don't fail)
107
+ if (!authData.result || authData.result !== "User logged in successfully" && authData.result !== "User created successfully") {
108
+ console.warn('🔑 Onairos sign-in: Unexpected or missing result field:', authData.result);
109
+ console.warn('🔑 Onairos sign-in: Proceeding with authentication since token is present');
110
+ }
111
+
112
+ // CRITICAL FIX: Store as Onairos token (sign-in gives Onairos JWT)
113
+ const {
114
+ TokenType,
115
+ storeJWT
116
+ } = await import('./jwtStorageService');
117
+ await storeJWT(TokenType.ONAIROS, authData.token);
118
+
119
+ // Store username from standardized response
120
+ if (authData.username) {
121
+ await AsyncStorage.setItem('onairos_username', authData.username);
122
+ }
123
+ await AsyncStorage.setItem('user_email', credentials.email);
124
+ console.log('🔑 Onairos sign-in token stored:', `${authData.token.substring(0, 20)}...`);
125
+ return {
126
+ token: authData.token,
127
+ user: {
128
+ id: Date.now().toString(),
129
+ name: authData.username,
130
+ email: credentials.email,
131
+ profilePicture: ''
132
+ },
133
+ onairos: {
134
+ hasConnectedOnairos: true,
135
+ onairosUserId: Date.now().toString(),
136
+ lastConnectedAt: new Date().toISOString()
137
+ }
138
+ };
139
+ } catch (error) {
140
+ console.error('❌ Onairos sign-in error:', error);
141
+ throw error;
142
+ }
143
+ };
144
+ export const authenticateWithApple = async appleAuthData => {
145
+ try {
146
+ const userName = appleAuthData.fullName ? `${appleAuthData.fullName.givenName || ''} ${appleAuthData.fullName.familyName || ''}`.trim() : 'Onairos User';
147
+
148
+ // Call the Apple authentication endpoint - backend should return proper Enoch JWT
149
+ console.log('🍎 Authenticating with Apple via backend...');
150
+ const appleAuthResponse = await fetch(`${API_BASE_URL}/enoch/auth/apple`, {
151
+ method: 'POST',
152
+ headers: getApiHeaders(),
153
+ body: JSON.stringify({
154
+ identity_token: appleAuthData.identityToken,
155
+ nonce: appleAuthData.nonce,
156
+ user_identifier: appleAuthData.user,
157
+ // Always present
158
+ email: appleAuthData.email,
159
+ // Can be null if user hides email
160
+ name: userName
161
+ })
162
+ });
163
+ if (!appleAuthResponse.ok) {
164
+ const errorData = await appleAuthResponse.json();
165
+ throw new Error(errorData.error || 'Apple authentication failed');
166
+ }
167
+ const authData = await appleAuthResponse.json();
168
+ console.log('✅ Apple authentication successful');
169
+
170
+ // CRITICAL: Log detailed Apple authentication response for comparison
171
+ console.log('🍎 ===== APPLE AUTHENTICATION DETAILS =====');
172
+ console.log('🍎 Response status:', appleAuthResponse.status);
173
+ console.log('🍎 Response ok:', appleAuthResponse.ok);
174
+ console.log('🍎 Response result field:', authData.result);
175
+ console.log('🍎 Response token present:', !!authData.token);
176
+ console.log('🍎 Response username present:', !!authData.username);
177
+ if (authData.token) {
178
+ console.log('🍎 Token preview:', `${authData.token.substring(0, 30)}...${authData.token.substring(authData.token.length - 10)}`);
179
+ console.log('🍎 Token length:', authData.token.length);
180
+ console.log('🍎 Token parts count:', authData.token.split('.').length);
181
+ }
182
+ console.log('🍎 ===== END APPLE AUTHENTICATION DETAILS =====');
183
+
184
+ // Check for authentication token first - this is the most critical part
185
+ if (!authData.token) {
186
+ throw new Error('No authentication token returned from Apple auth');
187
+ }
188
+
189
+ // Log if result field is missing or unexpected (but don't fail)
190
+ if (!authData.result || authData.result !== "User logged in successfully" && authData.result !== "User created successfully") {
191
+ console.warn('🍎 Apple auth: Unexpected or missing result field:', authData.result);
192
+ console.warn('🍎 Apple auth: Proceeding with authentication since token is present');
193
+ }
194
+
195
+ // CRITICAL FIX: Store as Onairos token (Apple sign-in gives Onairos JWT)
196
+ console.log('💾 Storing Apple-returned token as Onairos JWT');
197
+ const {
198
+ TokenType,
199
+ storeJWT
200
+ } = await import('./jwtStorageService');
201
+ await storeJWT(TokenType.ONAIROS, authData.token);
202
+
203
+ // Store username from standardized response
204
+ if (authData.username) {
205
+ await AsyncStorage.setItem('onairos_username', authData.username);
206
+ }
207
+
208
+ // Store the Apple user's email if available, otherwise use Apple user identifier
209
+ if (appleAuthData.email) {
210
+ await AsyncStorage.setItem('user_email', appleAuthData.email);
211
+ console.log('📧 Apple user email stored:', appleAuthData.email);
212
+ } else {
213
+ // Apple user chose "Hide My Email" - use Apple user identifier as fallback
214
+ const fallbackEmail = `apple_${appleAuthData.user}@privaterelay.apple.com`;
215
+ await AsyncStorage.setItem('user_email', fallbackEmail);
216
+ console.log('📧 Apple user email hidden - using fallback:', fallbackEmail);
217
+ }
218
+ console.log('🔑 Apple auth token stored:', `${authData.token.substring(0, 20)}...`);
219
+
220
+ // DEBUG: Log Apple token details to compare with Onairos tokens
221
+ console.log('🔍 DEBUG: Apple token details:');
222
+ console.log('🔍 DEBUG: Token length:', authData.token.length);
223
+ console.log('🔍 DEBUG: Token parts:', authData.token.split('.').length);
224
+ console.log('🔍 DEBUG: Token preview:', `${authData.token.substring(0, 50)}...`);
225
+ try {
226
+ const tokenParts = authData.token.split('.');
227
+ if (tokenParts.length === 3) {
228
+ console.log('🔍 DEBUG: Apple JWT header (base64):', tokenParts[0].substring(0, 30) + '...');
229
+ console.log('🔍 DEBUG: Apple JWT payload (base64):', tokenParts[1].substring(0, 30) + '...');
230
+ console.log('🔍 DEBUG: Apple JWT signature (base64):', tokenParts[2].substring(0, 30) + '...');
231
+ }
232
+ } catch (decodeError) {
233
+ console.log('🔍 DEBUG: Could not analyze Apple JWT structure:', decodeError);
234
+ }
235
+ return {
236
+ token: authData.token,
237
+ user: {
238
+ id: Date.now().toString(),
239
+ // Generate a unique ID since standardized response doesn't include user.id
240
+ name: authData.username,
241
+ email: appleAuthData.email || '',
242
+ profilePicture: ''
243
+ },
244
+ onairos: authData.onairos || {
245
+ hasConnectedOnairos: false,
246
+ // Default to false for fresh Apple users
247
+ onairosUserId: undefined,
248
+ lastConnectedAt: undefined
249
+ }
250
+ };
251
+ } catch (error) {
252
+ console.error('❌ Apple authentication error:', error);
253
+
254
+ // CRITICAL: Log detailed Apple authentication error
255
+ console.error('🚨 ===== APPLE AUTHENTICATION ERROR =====');
256
+ console.error('🚨 Error type:', error instanceof Error ? error.constructor.name : typeof error);
257
+ console.error('🚨 Error message:', error instanceof Error ? error.message : String(error));
258
+ console.error('🚨 Error stack:', error instanceof Error ? error.stack : 'No stack trace');
259
+ console.error('🚨 Apple auth data provided:', JSON.stringify(appleAuthData, null, 2));
260
+ console.error('🚨 ===== END APPLE ERROR DETAILS =====');
261
+ throw error;
262
+ }
263
+ };
264
+
265
+ /**
266
+ * Save authentication token
267
+ * @param token JWT token
268
+ */
269
+ export const saveAuthToken = async token => {
270
+ try {
271
+ await AsyncStorage.setItem('auth_token', token);
272
+ } catch (error) {
273
+ console.error('Error saving auth token:', error);
274
+ throw error;
275
+ }
276
+ };
277
+
278
+ /**
279
+ * Debug function to check all auth-related storage
280
+ */
281
+ export const debugAuthStorage = async () => {
282
+ console.log('🔍 [AUTH STORAGE DEBUG] Checking all auth-related storage:');
283
+ const authToken = await AsyncStorage.getItem('auth_token');
284
+ const onairosJwt = await AsyncStorage.getItem('onairos_jwt_token');
285
+ const enochToken = await AsyncStorage.getItem('enoch_token');
286
+ const userEmail = await AsyncStorage.getItem('user_email');
287
+ const onairosUsername = await AsyncStorage.getItem('onairos_username');
288
+ const authMethod = await AsyncStorage.getItem('auth_method');
289
+ console.log('🔑 auth_token:', authToken ? `"${authToken}"` : 'null');
290
+ console.log('🔑 onairos_jwt_token:', onairosJwt ? `"${onairosJwt}"` : 'null');
291
+ console.log('🔑 enoch_token:', enochToken ? `"${enochToken}"` : 'null');
292
+ console.log('🔑 user_email:', userEmail ? `"${userEmail}"` : 'null');
293
+ console.log('🔑 onairos_username:', onairosUsername ? `"${onairosUsername}"` : 'null');
294
+ console.log('🔑 auth_method:', authMethod ? `"${authMethod}"` : 'null');
295
+
296
+ // Check if any token is actually an email
297
+ const allTokens = [authToken, onairosJwt, enochToken];
298
+ allTokens.forEach((token, index) => {
299
+ const tokenNames = ['auth_token', 'onairos_jwt_token', 'enoch_token'];
300
+ if (token && token.includes('@') && token.includes('.')) {
301
+ console.error(`❌ [AUTH STORAGE DEBUG] ${tokenNames[index]} contains email instead of JWT: "${token}"`);
302
+ }
303
+ });
304
+ };
305
+
306
+ /**
307
+ * Clear all auth tokens and start fresh
308
+ */
309
+ export const clearAllAuthTokens = async () => {
310
+ console.log('🧹 [AUTH DEBUG] Clearing all auth tokens via centralized service...');
311
+
312
+ // CRITICAL FIX: Clear all JWT token types
313
+ const {
314
+ clearAllJWT
315
+ } = await import('./jwtStorageService');
316
+ await clearAllJWT();
317
+
318
+ // Clear other auth-related data
319
+ await AsyncStorage.multiRemove(['user_email', 'onairos_username', 'auth_method']);
320
+ console.log('✅ [AUTH DEBUG] All auth tokens and data cleared');
321
+ };
322
+
323
+ /**
324
+ * Get saved authentication token - CRITICAL FIX: Try all token types
325
+ * @returns Saved JWT token or null if not found
326
+ */
327
+ export const getAuthToken = async () => {
328
+ try {
329
+ console.log('🔑 [AUTH DEBUG] Checking all available JWT tokens...');
330
+
331
+ // CRITICAL FIX: Try all token types in priority order
332
+ const {
333
+ TokenType,
334
+ getJWT
335
+ } = await import('./jwtStorageService');
336
+
337
+ // Try Onairos token first (most common for main app usage)
338
+ let token = await getJWT(TokenType.ONAIROS);
339
+ if (token) {
340
+ console.log('✅ [AUTH DEBUG] Found Onairos JWT token:', `${token.substring(0, 20)}...`);
341
+ return token;
342
+ }
343
+
344
+ // Try Enoch token second (for Enoch-specific routes)
345
+ token = await getJWT(TokenType.ENOCH);
346
+ if (token) {
347
+ console.log('✅ [AUTH DEBUG] Found Enoch JWT token:', `${token.substring(0, 20)}...`);
348
+ return token;
349
+ }
350
+
351
+ // Try Auth token last (for context-specific flows)
352
+ token = await getJWT(TokenType.AUTH);
353
+ if (token) {
354
+ console.log('✅ [AUTH DEBUG] Found Auth token:', `${token.substring(0, 20)}...`);
355
+ return token;
356
+ }
357
+ console.warn('❌ [AUTH DEBUG] No valid JWT tokens found in any storage location');
358
+ return null;
359
+ } catch (error) {
360
+ console.error('❌ [AUTH DEBUG] Error during token retrieval:', error);
361
+ return null;
362
+ }
363
+ };
364
+
365
+ /**
366
+ * Remove authentication token (logout)
367
+ */
368
+ export const removeAuthToken = async () => {
369
+ try {
370
+ await AsyncStorage.removeItem('auth_token');
371
+ } catch (error) {
372
+ console.error('Error removing auth token:', error);
373
+ }
374
+ };
375
+
376
+ /**
377
+ * Validate if user is properly authenticated
378
+ * @returns boolean indicating if user has valid authentication
379
+ */
380
+ export const isAuthenticated = async () => {
381
+ try {
382
+ const token = await getAuthToken();
383
+ return token !== null && token.length > 50;
384
+ } catch (error) {
385
+ console.error('❌ [AUTH VALIDATION] Error checking authentication status:', error);
386
+ return false;
387
+ }
388
+ };
389
+
390
+ /**
391
+ * Ensure authentication is available before making API calls
392
+ * @param apiName - Name of the API being called (for logging)
393
+ * @returns boolean indicating if authentication is available
394
+ */
395
+ export const ensureAuthentication = async apiName => {
396
+ const isAuth = await isAuthenticated();
397
+ if (!isAuth) {
398
+ console.warn(`⚠️ [${apiName}] No valid authentication available - API call may return limited data`);
399
+ } else {
400
+ console.log(`✅ [${apiName}] Authentication validated for API call`);
401
+ }
402
+ return isAuth;
403
+ };
404
+
405
+ /**
406
+ * Get saved Enoch authentication token specifically
407
+ * @returns Saved Enoch JWT token or null if not found
408
+ */
409
+ export const getEnochToken = async () => {
410
+ try {
411
+ return await AsyncStorage.getItem('enoch_token');
412
+ } catch (error) {
413
+ console.error('Error getting Enoch token:', error);
414
+ return null;
415
+ }
416
+ };
417
+
418
+ /**
419
+ * Save Enoch authentication token specifically
420
+ * @param token Enoch JWT token
421
+ */
422
+ export const saveEnochToken = async token => {
423
+ try {
424
+ await AsyncStorage.setItem('enoch_token', token);
425
+ await AsyncStorage.setItem('auth_token', token); // Also save as general auth token
426
+ } catch (error) {
427
+ console.error('Error saving Enoch token:', error);
428
+ throw error;
429
+ }
430
+ };
431
+
432
+ /**
433
+ * Verify token with backend
434
+ * @returns Boolean indicating if token is valid
435
+ */
436
+ export const verifyToken = async () => {
437
+ try {
438
+ const token = await getAuthToken();
439
+ if (!token) {
440
+ console.warn('🔒 [TOKEN VERIFY] No token available for verification');
441
+ return false;
442
+ }
443
+ console.log('🔒 [TOKEN VERIFY] Verifying token with backend...');
444
+ console.log('🔒 [TOKEN VERIFY] Token preview:', `${token.substring(0, 20)}...`);
445
+ const response = await fetch(`${API_BASE_URL}/api/auth/verify`, {
446
+ method: 'GET',
447
+ headers: getAuthHeaders(token)
448
+ });
449
+ console.log('🔒 [TOKEN VERIFY] Verification response status:', response.status);
450
+ if (response.ok) {
451
+ console.log('✅ [TOKEN VERIFY] Token is valid');
452
+ return true;
453
+ } else {
454
+ const errorText = await response.text();
455
+ console.warn('❌ [TOKEN VERIFY] Token verification failed:', response.status, errorText);
456
+ return false;
457
+ }
458
+ } catch (error) {
459
+ console.error('❌ [TOKEN VERIFY] Token verification error:', error);
460
+ return false;
461
+ }
462
+ };
463
+
464
+ /**
465
+ * Get user profile from backend using stored token
466
+ * Note: This endpoint doesn't exist as GET, so we'll try to fetch via other means
467
+ * @returns User profile data
468
+ */
469
+ export const getUserProfile = async () => {
470
+ try {
471
+ var _token;
472
+ // Try to get the Enoch token first, then fall back to general auth token
473
+ let token = await getEnochToken();
474
+ if (!token) {
475
+ token = await getAuthToken();
476
+ }
477
+ if (!token) {
478
+ throw new Error('No authentication token found');
479
+ }
480
+ console.log('🔍 Attempting to fetch user profile with token:', ((_token = token) === null || _token === void 0 ? void 0 : _token.substring(0, 20)) + '...');
481
+
482
+ // First try to get profile from Enoch user endpoint
483
+ try {
484
+ console.log('🔍 Attempting to fetch user profile from Enoch endpoint...');
485
+ const response = await fetch(`${API_BASE_URL}/enoch/user/profile`, {
486
+ method: 'GET',
487
+ headers: getAuthHeaders(token)
488
+ });
489
+ if (response.ok) {
490
+ const userData = await response.json();
491
+ console.log('✅ User profile fetched successfully from Enoch endpoint');
492
+
493
+ // Use JWT user ID if available, otherwise use the response ID
494
+ const userId = userData.id || userData._id;
495
+
496
+ // Transform the response to match expected format
497
+ return {
498
+ id: userId,
499
+ name: userData.name || 'Onairos User',
500
+ email: userData.email,
501
+ description: userData.bio || userData.description || '',
502
+ photoUrl: userData.photoUrl || userData.photo_url || '',
503
+ profilePicture: userData.photoUrl || userData.photo_url || '',
504
+ interests: userData.interests || [],
505
+ verified: userData.verified || false,
506
+ createdAt: userData.createdAt || new Date().toISOString(),
507
+ updatedAt: userData.updatedAt || new Date().toISOString(),
508
+ onboarded: userData.onboarded || false
509
+ };
510
+ } else {
511
+ console.warn('⚠️ Enoch profile endpoint failed:', response.status, await response.text());
512
+ }
513
+ } catch (enochError) {
514
+ console.warn('⚠️ Error with Enoch profile endpoint:', enochError);
515
+ }
516
+
517
+ // Try to create a profile using the POST endpoint (since that's what exists)
518
+ try {
519
+ console.log('🔍 Attempting to create/get profile via POST endpoint...');
520
+
521
+ // Get user data from AsyncStorage (no JWT decoding needed)
522
+ const storedUserEmail = await AsyncStorage.getItem('user_email');
523
+ const storedUserName = await AsyncStorage.getItem('onairos_username');
524
+ const userEmail = storedUserEmail || 'user@example.com';
525
+ const userName = storedUserName || 'Onairos User';
526
+ console.log('📧 Using stored user email:', userEmail);
527
+ console.log('👤 Using stored user name:', userName);
528
+
529
+ // Try to create/update profile with real user info
530
+ const response = await fetch(`${API_BASE_URL}/api/user/profile`, {
531
+ method: 'PUT',
532
+ // ✅ FIXED: Changed from POST to PUT to match backend
533
+ headers: getAuthHeaders(token),
534
+ body: JSON.stringify({
535
+ name: userName,
536
+ bio: 'Welcome to Onairos!',
537
+ interests: [],
538
+ photo_url: ''
539
+ })
540
+ });
541
+ if (response.ok) {
542
+ const profileData = await response.json();
543
+ console.log('✅ Profile created/updated successfully:', profileData);
544
+ if (profileData.success && profileData.profile) {
545
+ // Use the response ID from the profile creation
546
+ const userId = profileData.profile.id;
547
+ return {
548
+ id: userId,
549
+ name: profileData.profile.name,
550
+ email: userEmail,
551
+ description: profileData.profile.bio || '',
552
+ photoUrl: profileData.profile.photo_url || '',
553
+ profilePicture: profileData.profile.photo_url || '',
554
+ interests: [],
555
+ verified: false,
556
+ createdAt: profileData.profile.updated_at || new Date().toISOString(),
557
+ updatedAt: profileData.profile.updated_at || new Date().toISOString(),
558
+ onboarded: false
559
+ };
560
+ }
561
+ } else {
562
+ const errorText = await response.text();
563
+ console.warn('⚠️ Profile creation endpoint failed:', response.status, errorText);
564
+ }
565
+ } catch (createError) {
566
+ console.warn('⚠️ Error with profile creation endpoint:', createError);
567
+ }
568
+
569
+ // If all endpoints fail, throw an error instead of returning fallback
570
+ console.error('❌ All profile endpoints failed and no JWT user ID available');
571
+ throw new Error('Unable to determine user ID from authentication token');
572
+ } catch (error) {
573
+ console.error('Error fetching user profile:', error);
574
+ throw error;
575
+ }
576
+ };
577
+
578
+ /**
579
+ * Create or update user profile
580
+ * @param profileData Profile data to create/update
581
+ * @returns Profile response from backend
582
+ */
583
+ export const createOrUpdateProfile = async profileData => {
584
+ try {
585
+ const token = await getAuthToken();
586
+ if (!token) {
587
+ throw new Error('No authentication token found');
588
+ }
589
+ const response = await fetch(`${API_BASE_URL}/api/user/profile`, {
590
+ method: 'PUT',
591
+ // ✅ FIXED: Changed from POST to PUT to match backend
592
+ headers: getAuthHeaders(token),
593
+ body: JSON.stringify(profileData)
594
+ });
595
+ if (!response.ok) {
596
+ const errorData = await response.json();
597
+ throw new Error(errorData.message || 'Failed to create/update profile');
598
+ }
599
+ return await response.json();
600
+ } catch (error) {
601
+ console.error('Error creating/updating profile:', error);
602
+ throw error;
603
+ }
604
+ };
605
+
606
+ /**
607
+ * Update user's onboarded status
608
+ * @returns Promise that resolves when update is successful
609
+ */
610
+ export const updateUserOnboardedStatus = async () => {
611
+ try {
612
+ const token = await getAuthToken();
613
+ if (!token) {
614
+ throw new Error('No authentication token found');
615
+ }
616
+ const response = await fetch(`${API_BASE_URL}/enoch/auth/update-onboarded`, {
617
+ method: 'POST',
618
+ headers: getAuthHeaders(token),
619
+ body: JSON.stringify({
620
+ onboarded: true
621
+ })
622
+ });
623
+ if (!response.ok) {
624
+ throw new Error('Failed to update onboarded status');
625
+ }
626
+ } catch (error) {
627
+ console.error('Error updating onboarded status:', error);
628
+ throw error;
629
+ }
630
+ };
631
+
632
+ /**
633
+ * Fetch the current timer status from the backend
634
+ * @returns Timer information including expiry and duration
635
+ */
636
+ export const getEventTimer = async () => {
637
+ try {
638
+ const token = await getAuthToken();
639
+ console.log('🕐 Starting timer fetch. Token available:', !!token);
640
+
641
+ // Enhanced token logging for debugging
642
+ if (token) {
643
+ console.log('🔑 [TOKEN DEBUG] Token preview:', `${token.substring(0, 20)}...`);
644
+ console.log('🔑 [TOKEN DEBUG] Token length:', token.length);
645
+
646
+ // Check if token looks like a JWT
647
+ const tokenParts = token.split('.');
648
+ if (tokenParts.length === 3) {
649
+ console.log('🔑 [TOKEN DEBUG] Token appears to be a valid JWT format (3 parts)');
650
+ } else {
651
+ console.warn('🔑 [TOKEN DEBUG] Token does not appear to be JWT format (expected 3 parts, got', tokenParts.length, ')');
652
+ }
653
+ } else {
654
+ console.warn('🔑 [TOKEN DEBUG] No token available - will only try public endpoint');
655
+ }
656
+
657
+ // Try authenticated endpoint first if we have a token
658
+ if (token) {
659
+ try {
660
+ console.log('🕐 Fetching timer from authenticated endpoint:', `${API_BASE_URL}/enoch/event/timer`);
661
+ const response = await fetch(`${API_BASE_URL}/enoch/event/timer`, {
662
+ method: 'GET',
663
+ headers: getAuthHeaders(token)
664
+ });
665
+ if (response.ok) {
666
+ const timerData = await response.json();
667
+ console.log('✅ Timer data received from authenticated endpoint:', timerData);
668
+
669
+ // Handle both direct timer data and wrapped response formats
670
+ if (timerData.success !== undefined) {
671
+ // If wrapped in success object, extract the timer data
672
+ return timerData.success ? timerData : timerData;
673
+ } else {
674
+ // Direct timer data format
675
+ return timerData;
676
+ }
677
+ } else {
678
+ const errorText = await response.text();
679
+ console.warn('⚠️ Authenticated timer endpoint failed:', response.status, errorText);
680
+
681
+ // Enhanced logging for token-related issues
682
+ if (response.status === 403) {
683
+ console.error('🚫 [TOKEN ERROR] 403 Forbidden - Token validation failed');
684
+ console.error('🔍 [TOKEN ERROR] This likely indicates an invalid or expired token');
685
+ console.error('🔍 [TOKEN ERROR] Token used:', token ? `${token.substring(0, 20)}...` : 'No token');
686
+ console.error('🔍 [TOKEN ERROR] Full error response:', errorText);
687
+
688
+ // Try to parse error response for more details
689
+ try {
690
+ const errorData = JSON.parse(errorText);
691
+ if (errorData.error) {
692
+ console.error('🔍 [TOKEN ERROR] Backend error message:', errorData.error);
693
+ }
694
+ if (errorData.code) {
695
+ console.error('🔍 [TOKEN ERROR] Error code:', errorData.code);
696
+ }
697
+ } catch (parseError) {
698
+ console.error('🔍 [TOKEN ERROR] Could not parse error response');
699
+ }
700
+ } else if (response.status === 401) {
701
+ console.error('🚫 [AUTH ERROR] 401 Unauthorized - Missing or invalid authentication');
702
+ console.error('🔍 [AUTH ERROR] Token used:', token ? `${token.substring(0, 20)}...` : 'No token');
703
+ } else {
704
+ console.error('🚫 [API ERROR] Unexpected error status:', response.status);
705
+ console.error('🔍 [API ERROR] Token used:', token ? `${token.substring(0, 20)}...` : 'No token');
706
+ }
707
+ }
708
+ } catch (authError) {
709
+ console.warn('⚠️ Error with authenticated timer endpoint:', authError);
710
+ console.error('🔍 [NETWORK ERROR] Failed to reach authenticated timer endpoint');
711
+ console.error('🔍 [NETWORK ERROR] Token used:', token ? `${token.substring(0, 20)}...` : 'No token');
712
+ console.error('🔍 [NETWORK ERROR] Error details:', authError instanceof Error ? authError.message : authError);
713
+ }
714
+ }
715
+
716
+ // Try public endpoint as fallback
717
+ try {
718
+ console.log('🕐 Fetching timer from public endpoint:', `${API_BASE_URL}/enoch/event/public/timer`);
719
+ const response = await fetch(`${API_BASE_URL}/enoch/event/public/timer`, {
720
+ method: 'GET',
721
+ headers: getApiHeaders()
722
+ });
723
+ if (response.ok) {
724
+ const timerData = await response.json();
725
+ console.log('✅ Timer data received from public endpoint:', timerData);
726
+
727
+ // Handle both direct timer data and wrapped response formats
728
+ if (timerData.success !== undefined) {
729
+ // If wrapped in success object, extract the timer data
730
+ return timerData.success ? timerData : timerData;
731
+ } else {
732
+ // Direct timer data format
733
+ return timerData;
734
+ }
735
+ } else {
736
+ const errorText = await response.text();
737
+ console.warn('⚠️ Public timer endpoint failed:', response.status, errorText);
738
+ }
739
+ } catch (publicError) {
740
+ console.warn('⚠️ Error with public timer endpoint:', publicError);
741
+ }
742
+
743
+ // If both API endpoints fail, provide a realistic fallback timer
744
+ console.log('⚠️ Both timer endpoints failed, using fallback timer');
745
+ const nowInSeconds = Math.floor(Date.now() / 1000);
746
+ const eventTimeInSeconds = nowInSeconds + 3600; // 1 hour from now
747
+ const secondsRemaining = eventTimeInSeconds - nowInSeconds;
748
+
749
+ // Calculate countdown components
750
+ const days = Math.floor(secondsRemaining / (24 * 60 * 60));
751
+ const hours = Math.floor(secondsRemaining % (24 * 60 * 60) / (60 * 60));
752
+ const minutes = Math.floor(secondsRemaining % (60 * 60) / 60);
753
+ const seconds = Math.floor(secondsRemaining % 60);
754
+ return {
755
+ timerExpiry: eventTimeInSeconds,
756
+ timerDuration: 3600,
757
+ isReady: false,
758
+ testMode: true,
759
+ countdown: {
760
+ total: secondsRemaining,
761
+ days,
762
+ hours,
763
+ minutes,
764
+ seconds
765
+ }
766
+ };
767
+ } catch (error) {
768
+ console.error('❌ Error in getEventTimer:', error);
769
+
770
+ // Final fallback timer (30 minutes)
771
+ const nowInSeconds = Math.floor(Date.now() / 1000);
772
+ const eventTimeInSeconds = nowInSeconds + 1800; // 30 minutes from now
773
+
774
+ return {
775
+ timerExpiry: eventTimeInSeconds,
776
+ timerDuration: 1800,
777
+ isReady: false,
778
+ testMode: true,
779
+ countdown: {
780
+ total: 1800,
781
+ days: 0,
782
+ hours: 0,
783
+ minutes: 30,
784
+ seconds: 0
785
+ }
786
+ };
787
+ }
788
+ };
789
+
790
+ /**
791
+ * Check if a user email has admin privileges
792
+ * @param email User email to check
793
+ * @returns True if user is an admin
794
+ */
795
+ export const isAdminEmail = email => {
796
+ if (!email) {
797
+ console.log('🔒 [Admin Check] No email provided');
798
+ return false;
799
+ }
800
+ const adminEmails = ['nicholas.berry@onairos.uk', 'zion.darko@onairos.uk', 'admin@enoch.events', 'admin@onairos.uk'];
801
+ const isAdmin = adminEmails.includes(email.toLowerCase());
802
+ if (isAdmin) {
803
+ console.log('🔑 [Admin Check] Admin access granted for:', email);
804
+ } else {
805
+ console.log('🚫 [Admin Check] No admin access for:', email);
806
+ }
807
+ return isAdmin;
808
+ };
809
+
810
+ /**
811
+ * Get the current admin status from AsyncStorage
812
+ * This could be used for caching admin status between sessions
813
+ */
814
+ export const getAdminStatus = async () => {
815
+ try {
816
+ const adminStatus = await AsyncStorage.getItem('user_admin_status');
817
+ return adminStatus === 'true';
818
+ } catch (error) {
819
+ console.error('Error getting admin status:', error);
820
+ return false;
821
+ }
822
+ };
823
+
824
+ /**
825
+ * Save admin status to AsyncStorage
826
+ * @param isAdmin Whether the user is an admin
827
+ */
828
+ export const saveAdminStatus = async isAdmin => {
829
+ try {
830
+ await AsyncStorage.setItem('user_admin_status', isAdmin.toString());
831
+ } catch (error) {
832
+ console.error('Error saving admin status:', error);
833
+ }
834
+ };
835
+
836
+ /**
837
+ * Get stored Onairos username for API calls
838
+ * This is used for data connector APIs (Reddit, etc.) that need the username
839
+ * @returns Stored username or null if not found
840
+ */
841
+ export const getOnairosUsername = async () => {
842
+ try {
843
+ return await AsyncStorage.getItem('onairos_username');
844
+ } catch (error) {
845
+ console.error('Error getting Onairos username:', error);
846
+ return null;
847
+ }
848
+ };
849
+
850
+ /**
851
+ * Save Onairos username for API calls
852
+ * @param username Username to store
853
+ */
854
+ export const saveOnairosUsername = async username => {
855
+ try {
856
+ await AsyncStorage.setItem('onairos_username', username);
857
+ } catch (error) {
858
+ console.error('Error saving Onairos username:', error);
859
+ }
860
+ };
861
+
862
+ /**
863
+ * Check if user has connected Onairos to Enoch before
864
+ * This checks for actual usage/training data, not just account existence
865
+ * @param userIdentifier - Email, username, or user ID to check
866
+ * @returns Promise<boolean> - true if user has connected Onairos features to Enoch
867
+ */
868
+ export const checkEnochOnairosConnection = async userIdentifier => {
869
+ try {
870
+ console.log('🔍 Checking Enoch-Onairos connection status for:', userIdentifier);
871
+ const token = await getAuthToken();
872
+ const response = await fetch(`${API_BASE_URL}/enoch/user/onairos-connection-status`, {
873
+ method: 'POST',
874
+ headers: token ? getAuthHeaders(token) : getApiHeaders(),
875
+ body: JSON.stringify({
876
+ userIdentifier,
877
+ // Can be email, username, or user ID
878
+ checkType: 'comprehensive' // Check training data, connected platforms, etc.
879
+ })
880
+ });
881
+ if (response.ok) {
882
+ const data = await response.json();
883
+ console.log('✅ Enoch-Onairos connection status:', data);
884
+ return {
885
+ hasConnectedOnairos: data.hasConnectedOnairos || false,
886
+ onairosUserId: data.onairosUserId,
887
+ lastConnectedAt: data.lastConnectedAt,
888
+ connectionDetails: data.connectionDetails
889
+ };
890
+ } else {
891
+ console.warn('⚠️ Connection status check failed:', response.status);
892
+ // Default to false if API call fails
893
+ return {
894
+ hasConnectedOnairos: false
895
+ };
896
+ }
897
+ } catch (error) {
898
+ console.error('❌ Error checking Enoch-Onairos connection:', error);
899
+ // Default to false if error occurs
900
+ return {
901
+ hasConnectedOnairos: false
902
+ };
903
+ }
904
+ };
905
+ //# sourceMappingURL=authService.js.map