@onairos/react-native 3.7.2 → 3.7.3

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 (237) hide show
  1. package/lib/commonjs/api/index.js +219 -9
  2. package/lib/commonjs/components/BodyText.js +27 -9
  3. package/lib/commonjs/components/BrandMark.js +111 -10
  4. package/lib/commonjs/components/CodeInput.js +116 -9
  5. package/lib/commonjs/components/EmailInput.js +30 -8
  6. package/lib/commonjs/components/GoogleButton.js +56 -9
  7. package/lib/commonjs/components/HeadingGroup.js +43 -9
  8. package/lib/commonjs/components/LLMDataInputModal.js +664 -14
  9. package/lib/commonjs/components/ModalHeader.js +99 -9
  10. package/lib/commonjs/components/ModalSheet.js +47 -9
  11. package/lib/commonjs/components/Onairos.js +380 -14
  12. package/lib/commonjs/components/OnairosButton.js +313 -13
  13. package/lib/commonjs/components/OnairosSignInButton.js +130 -12
  14. package/lib/commonjs/components/Overlay.js +465 -13
  15. package/lib/commonjs/components/PersonaImage.js +137 -10
  16. package/lib/commonjs/components/PersonaLoadingScreen.js +318 -12
  17. package/lib/commonjs/components/PersonalizationConsentScreen.js +467 -13
  18. package/lib/commonjs/components/PinCreationScreen.js +403 -12
  19. package/lib/commonjs/components/PinInput.js +464 -9
  20. package/lib/commonjs/components/PlatformConnectorsStep.js +1311 -23
  21. package/lib/commonjs/components/PlatformList.js +137 -10
  22. package/lib/commonjs/components/PlatformToggle.js +180 -9
  23. package/lib/commonjs/components/PrimaryButton.js +180 -10
  24. package/lib/commonjs/components/SignInMatchAnimation.js +197 -9
  25. package/lib/commonjs/components/SignInStep.js +345 -12
  26. package/lib/commonjs/components/UniversalOnboarding.js +2780 -30
  27. package/lib/commonjs/components/VerificationStep.js +176 -11
  28. package/lib/commonjs/components/WelcomeScreen.js +461 -22
  29. package/lib/commonjs/components/icons/Basicproficon.js +37 -8
  30. package/lib/commonjs/components/icons/Basicprofile.js +21 -8
  31. package/lib/commonjs/components/icons/Checkbox.js +21 -8
  32. package/lib/commonjs/components/icons/Checkmark.js +27 -8
  33. package/lib/commonjs/components/icons/Contentanalysis.js +21 -8
  34. package/lib/commonjs/components/icons/Contenticon.js +39 -8
  35. package/lib/commonjs/components/icons/EnochE.js +41 -8
  36. package/lib/commonjs/components/icons/Personalityicon.js +30 -8
  37. package/lib/commonjs/components/icons/Personalityprofile.js +21 -8
  38. package/lib/commonjs/components/icons/Personalitytraits.js +21 -8
  39. package/lib/commonjs/components/icons/Userpreferences.js +21 -8
  40. package/lib/commonjs/components/icons/index.js +84 -17
  41. package/lib/commonjs/components/onboarding/OAuthWebView.js +1754 -18
  42. package/lib/commonjs/components/onboarding/OnboardingHeader.js +74 -10
  43. package/lib/commonjs/components/onboarding/PinInput.js +283 -10
  44. package/lib/commonjs/components/onboarding/PlatformConnector.js +249 -11
  45. package/lib/commonjs/config/PLATFORM_APIS.md +849 -0
  46. package/lib/commonjs/config/api.js +56 -7
  47. package/lib/commonjs/constants/index.js +120 -7
  48. package/lib/commonjs/context/AuthContext.js +345 -10
  49. package/lib/commonjs/hooks/useConnectedAccounts.js +111 -9
  50. package/lib/commonjs/hooks/useConnections.js +102 -8
  51. package/lib/commonjs/hooks/useCredentials.js +178 -10
  52. package/lib/commonjs/hooks/useUserConnections.js +148 -10
  53. package/lib/commonjs/index.js +439 -34
  54. package/lib/commonjs/services/apiClient.js +298 -8
  55. package/lib/commonjs/services/biometricPinService.js +180 -8
  56. package/lib/commonjs/services/chatGPTConversationExtractor.js +155 -8
  57. package/lib/commonjs/services/chatGPTConversationService.js +275 -9
  58. package/lib/commonjs/services/claudeConversationExtractor.js +103 -8
  59. package/lib/commonjs/services/claudeConversationService.js +158 -9
  60. package/lib/commonjs/services/connectedAccountsService.js +310 -10
  61. package/lib/commonjs/services/googleAuthService.js +252 -11
  62. package/lib/commonjs/services/hingeDataExtractor.js +105 -8
  63. package/lib/commonjs/services/hingeDataService.js +150 -9
  64. package/lib/commonjs/services/imageCompressionService.js +260 -7
  65. package/lib/commonjs/services/instagramDataExtractor.js +126 -8
  66. package/lib/commonjs/services/instagramDataService.js +163 -9
  67. package/lib/commonjs/services/jwtStorageService.js +276 -7
  68. package/lib/commonjs/services/linkedinDOMExtractor.js +245 -7
  69. package/lib/commonjs/services/linkedinProfileService.js +222 -9
  70. package/lib/commonjs/services/linkedinScrapingService.js +230 -8
  71. package/lib/commonjs/services/llmDataStorage.js +294 -8
  72. package/lib/commonjs/services/mobileTrainingService.js +186 -8
  73. package/lib/commonjs/services/netflixDataExtractor.js +120 -8
  74. package/lib/commonjs/services/netflixDataService.js +198 -9
  75. package/lib/commonjs/services/pinEncryptionService.js +84 -8
  76. package/lib/commonjs/services/pinStorageUtils.js +105 -7
  77. package/lib/commonjs/services/platformAuthService.js +1484 -12
  78. package/lib/commonjs/services/sephoraDataExtractor.js +140 -8
  79. package/lib/commonjs/services/sephoraDataService.js +200 -9
  80. package/lib/commonjs/services/spotifyDataExtractor.js +148 -8
  81. package/lib/commonjs/services/spotifyDataService.js +241 -9
  82. package/lib/commonjs/services/storageService.js +404 -8
  83. package/lib/commonjs/services/telegramDataExtractor.js +115 -8
  84. package/lib/commonjs/services/telegramDataService.js +499 -9
  85. package/lib/commonjs/services/trainingApiHelpers.js +73 -7
  86. package/lib/commonjs/services/userConnectionsService.js +340 -10
  87. package/lib/commonjs/services/youtubeMigrationService.js +416 -10
  88. package/lib/commonjs/theme/index.js +250 -7
  89. package/lib/commonjs/types/ambient.d.js +2 -1
  90. package/lib/commonjs/types/declarations.d.js +2 -1
  91. package/lib/commonjs/types/index.js +6 -1
  92. package/lib/commonjs/types/node-fix.d.js +2 -1
  93. package/lib/commonjs/types/node-override.d.js +2 -1
  94. package/lib/commonjs/types/opacity.d.js +2 -1
  95. package/lib/commonjs/types.js +14 -1
  96. package/lib/commonjs/utils/Portal.js +98 -8
  97. package/lib/commonjs/utils/api.js +130 -9
  98. package/lib/commonjs/utils/assetRegistry.js +210 -35
  99. package/lib/commonjs/utils/auth.js +112 -9
  100. package/lib/commonjs/utils/connectorTests.js +613 -29
  101. package/lib/commonjs/utils/crypto.js +62 -8
  102. package/lib/commonjs/utils/debugHelper.js +64 -1
  103. package/lib/commonjs/utils/encryption.js +76 -7
  104. package/lib/commonjs/utils/eventUtils.js +288 -1
  105. package/lib/commonjs/utils/haptics.js +66 -9
  106. package/lib/commonjs/utils/imagePreloader.js +6 -1
  107. package/lib/commonjs/utils/networkDiagnostics.js +226 -8
  108. package/lib/commonjs/utils/onairosApi.js +350 -9
  109. package/lib/commonjs/utils/programmaticFlow.js +117 -9
  110. package/lib/commonjs/utils/retryHelper.js +220 -1
  111. package/lib/commonjs/utils/secureStorage.js +349 -10
  112. package/lib/commonjs/utils/webviewScripts/chatgpt.js +551 -1
  113. package/lib/commonjs/utils/webviewScripts/claude.js +376 -1
  114. package/lib/commonjs/utils/webviewScripts/hinge.js +411 -1
  115. package/lib/commonjs/utils/webviewScripts/index.js +698 -15
  116. package/lib/commonjs/utils/webviewScripts/instagram.js +454 -1
  117. package/lib/commonjs/utils/webviewScripts/linkedin.js +880 -1
  118. package/lib/commonjs/utils/webviewScripts/netflix.js +382 -1
  119. package/lib/commonjs/utils/webviewScripts/sephora.js +516 -1
  120. package/lib/commonjs/utils/webviewScripts/spotify.js +419 -1
  121. package/lib/commonjs/utils/webviewScripts/telegram.js +678 -1
  122. package/lib/module/api/index.js +211 -1
  123. package/lib/module/components/BodyText.js +20 -1
  124. package/lib/module/components/BrandMark.js +104 -1
  125. package/lib/module/components/CodeInput.js +109 -1
  126. package/lib/module/components/EmailInput.js +23 -1
  127. package/lib/module/components/GoogleButton.js +49 -1
  128. package/lib/module/components/HeadingGroup.js +36 -1
  129. package/lib/module/components/LLMDataInputModal.js +656 -7
  130. package/lib/module/components/ModalHeader.js +92 -1
  131. package/lib/module/components/ModalSheet.js +39 -1
  132. package/lib/module/components/Onairos.js +373 -1
  133. package/lib/module/components/OnairosButton.js +305 -1
  134. package/lib/module/components/OnairosSignInButton.js +121 -1
  135. package/lib/module/components/Overlay.js +456 -1
  136. package/lib/module/components/PersonaImage.js +129 -1
  137. package/lib/module/components/PersonaLoadingScreen.js +310 -1
  138. package/lib/module/components/PersonalizationConsentScreen.js +460 -1
  139. package/lib/module/components/PinCreationScreen.js +396 -1
  140. package/lib/module/components/PinInput.js +456 -1
  141. package/lib/module/components/PlatformConnectorsStep.js +1302 -6
  142. package/lib/module/components/PlatformList.js +129 -1
  143. package/lib/module/components/PlatformToggle.js +173 -1
  144. package/lib/module/components/PrimaryButton.js +172 -1
  145. package/lib/module/components/SignInMatchAnimation.js +189 -1
  146. package/lib/module/components/SignInStep.js +338 -1
  147. package/lib/module/components/UniversalOnboarding.js +2770 -1
  148. package/lib/module/components/VerificationStep.js +168 -1
  149. package/lib/module/components/WelcomeScreen.js +453 -1
  150. package/lib/module/components/icons/Basicproficon.js +30 -1
  151. package/lib/module/components/icons/Basicprofile.js +14 -1
  152. package/lib/module/components/icons/Checkbox.js +14 -1
  153. package/lib/module/components/icons/Checkmark.js +20 -1
  154. package/lib/module/components/icons/Contentanalysis.js +14 -1
  155. package/lib/module/components/icons/Contenticon.js +32 -1
  156. package/lib/module/components/icons/EnochE.js +34 -1
  157. package/lib/module/components/icons/Personalityicon.js +23 -1
  158. package/lib/module/components/icons/Personalityprofile.js +14 -1
  159. package/lib/module/components/icons/Personalitytraits.js +14 -1
  160. package/lib/module/components/icons/Userpreferences.js +14 -1
  161. package/lib/module/components/icons/index.js +13 -1
  162. package/lib/module/components/onboarding/OAuthWebView.js +1746 -1
  163. package/lib/module/components/onboarding/OnboardingHeader.js +66 -1
  164. package/lib/module/components/onboarding/PinInput.js +274 -1
  165. package/lib/module/components/onboarding/PlatformConnector.js +240 -1
  166. package/lib/module/config/PLATFORM_APIS.md +849 -0
  167. package/lib/module/config/api.js +47 -1
  168. package/lib/module/constants/index.js +114 -1
  169. package/lib/module/context/AuthContext.js +335 -1
  170. package/lib/module/hooks/useConnectedAccounts.js +106 -1
  171. package/lib/module/hooks/useConnections.js +95 -1
  172. package/lib/module/hooks/useCredentials.js +171 -6
  173. package/lib/module/hooks/useUserConnections.js +140 -1
  174. package/lib/module/index.js +172 -1
  175. package/lib/module/services/apiClient.js +295 -1
  176. package/lib/module/services/biometricPinService.js +169 -1
  177. package/lib/module/services/chatGPTConversationExtractor.js +149 -1
  178. package/lib/module/services/chatGPTConversationService.js +268 -1
  179. package/lib/module/services/claudeConversationExtractor.js +97 -1
  180. package/lib/module/services/claudeConversationService.js +151 -1
  181. package/lib/module/services/connectedAccountsService.js +293 -1
  182. package/lib/module/services/googleAuthService.js +241 -1
  183. package/lib/module/services/hingeDataExtractor.js +99 -1
  184. package/lib/module/services/hingeDataService.js +143 -1
  185. package/lib/module/services/imageCompressionService.js +250 -1
  186. package/lib/module/services/instagramDataExtractor.js +120 -1
  187. package/lib/module/services/instagramDataService.js +156 -1
  188. package/lib/module/services/jwtStorageService.js +257 -1
  189. package/lib/module/services/linkedinDOMExtractor.js +234 -1
  190. package/lib/module/services/linkedinProfileService.js +210 -1
  191. package/lib/module/services/linkedinScrapingService.js +219 -1
  192. package/lib/module/services/llmDataStorage.js +277 -1
  193. package/lib/module/services/mobileTrainingService.js +173 -1
  194. package/lib/module/services/netflixDataExtractor.js +114 -1
  195. package/lib/module/services/netflixDataService.js +191 -1
  196. package/lib/module/services/pinEncryptionService.js +74 -6
  197. package/lib/module/services/pinStorageUtils.js +93 -1
  198. package/lib/module/services/platformAuthService.js +1461 -1
  199. package/lib/module/services/sephoraDataExtractor.js +134 -1
  200. package/lib/module/services/sephoraDataService.js +193 -1
  201. package/lib/module/services/spotifyDataExtractor.js +142 -1
  202. package/lib/module/services/spotifyDataService.js +234 -1
  203. package/lib/module/services/storageService.js +383 -1
  204. package/lib/module/services/telegramDataExtractor.js +109 -1
  205. package/lib/module/services/telegramDataService.js +493 -1
  206. package/lib/module/services/trainingApiHelpers.js +67 -1
  207. package/lib/module/services/userConnectionsService.js +329 -1
  208. package/lib/module/services/youtubeMigrationService.js +405 -1
  209. package/lib/module/theme/index.js +245 -1
  210. package/lib/module/types.js +10 -1
  211. package/lib/module/utils/Portal.js +90 -1
  212. package/lib/module/utils/api.js +118 -1
  213. package/lib/module/utils/assetRegistry.js +200 -34
  214. package/lib/module/utils/auth.js +100 -1
  215. package/lib/module/utils/connectorTests.js +600 -27
  216. package/lib/module/utils/crypto.js +54 -1
  217. package/lib/module/utils/debugHelper.js +54 -1
  218. package/lib/module/utils/encryption.js +67 -1
  219. package/lib/module/utils/eventUtils.js +270 -1
  220. package/lib/module/utils/haptics.js +59 -8
  221. package/lib/module/utils/imagePreloader.js +3 -1
  222. package/lib/module/utils/networkDiagnostics.js +217 -1
  223. package/lib/module/utils/onairosApi.js +333 -1
  224. package/lib/module/utils/programmaticFlow.js +111 -1
  225. package/lib/module/utils/retryHelper.js +211 -1
  226. package/lib/module/utils/secureStorage.js +330 -6
  227. package/lib/module/utils/webviewScripts/chatgpt.js +545 -1
  228. package/lib/module/utils/webviewScripts/claude.js +370 -1
  229. package/lib/module/utils/webviewScripts/hinge.js +405 -1
  230. package/lib/module/utils/webviewScripts/index.js +434 -1
  231. package/lib/module/utils/webviewScripts/instagram.js +448 -1
  232. package/lib/module/utils/webviewScripts/linkedin.js +874 -1
  233. package/lib/module/utils/webviewScripts/netflix.js +376 -1
  234. package/lib/module/utils/webviewScripts/sephora.js +510 -1
  235. package/lib/module/utils/webviewScripts/spotify.js +413 -1
  236. package/lib/module/utils/webviewScripts/telegram.js +672 -1
  237. package/package.json +2 -2
@@ -1,7 +1,331 @@
1
+ import { Platform } from 'react-native';
2
+ import { STORAGE_KEYS } from '../constants';
3
+ import AsyncStorage from '@react-native-async-storage/async-storage';
1
4
 
2
- // Onairos SDK - Asset Registry (auto-generated)
3
- var __ONAIROS_REQ_REGISTRY__ = [
4
- require('react-native-keychain')
5
- ];
6
- function __ONAIROS_REQ_FUNC__(i) { return __ONAIROS_REQ_REGISTRY__[i]; }
7
- import{Platform}from'react-native';import{STORAGE_KEYS}from'../constants';import AsyncStorage from'@react-native-async-storage/async-storage';const JWT_TOKEN_KEY=_0x5024(0x0),mockStorage={};let Keychain=null;try{Keychain=__ONAIROS_REQ_FUNC__(0x0);}catch(_0x2b92f3){console[_0x5024(0x1)]('react-native-keychain module not available, using mock storage'),Keychain={'ACCESS_CONTROL':{'BIOMETRY_ANY_OR_DEVICE_PASSCODE':_0x5024(0x2)},'ACCESSIBLE':{'WHEN_UNLOCKED':_0x5024(0x2)},'getGenericPassword':async()=>null,'setGenericPassword':async()=>!![],'resetGenericPassword':async()=>!![]};}const isKeychainAvailable=()=>{const _0x4fc4e8={'knKJk':_0x5024(0x3),'wanZm':function(_0x47cdc4,_0x33ee32){return _0x47cdc4===_0x33ee32;},'hWakL':_0x5024(0x4),'jxNAE':function(_0x1ed38f,_0x428152){return _0x1ed38f===_0x428152;},'cCDQA':_0x5024(0x5),'cmJwb':'bRHKV'};try{return _0x4fc4e8['wanZm'](_0x5024(0x4),_0x4fc4e8[_0x5024(0x6)])?Keychain&&_0x4fc4e8[_0x5024(0x7)](typeof Keychain[_0x5024(0x8)],_0x4fc4e8[_0x5024(0x9)]):(_0x529e5b[_0x5024(0xa)](_0x4fc4e8[_0x5024(0xb)],_0x38c460),![]);}catch(_0x4bdcba){if(_0x4fc4e8[_0x5024(0xc)]===_0x4fc4e8[_0x5024(0xc)])return![];else{const _0x17dffb=_0x55198f[_0x5024(0xd)]()['toString'](0x24)[_0x5024(0xe)](0x2,0xa);return _0x5024(0xf)+_0x17dffb;}}},safeGetGenericPassword=async _0x163827=>{const _0x119a3c={'dHtqV':function(_0x56d82f){return _0x56d82f();},'kemqM':function(_0x3fb99a,_0xd17714){return _0x3fb99a===_0xd17714;},'NMQGZ':_0x5024(0x10)};try{if(_0x119a3c['dHtqV'](isKeychainAvailable))return await Keychain['getGenericPassword'](_0x163827);else{const _0x28c77e=(_0x163827===null||_0x163827===void 0x0?void 0x0:_0x163827[_0x5024(0x11)])||'default';return mockStorage[_0x28c77e]||null;}}catch(_0x1fb211){console[_0x5024(0x1)](_0x5024(0x12),_0x1fb211);const _0x93ee1c=(_0x119a3c[_0x5024(0x13)](_0x163827,null)||_0x163827===void 0x0?void 0x0:_0x163827[_0x5024(0x11)])||_0x119a3c[_0x5024(0x14)];return mockStorage[_0x93ee1c]||null;}},safeSetGenericPassword=async(_0x5c9e62,_0x1f157e,_0x3520d9)=>{const _0x20cb13={'nJcgb':_0x5024(0x15),'qLoKB':_0x5024(0x16),'KHxYk':function(_0x3f1568,_0x3d426a){return _0x3f1568===_0x3d426a;},'OjtPd':_0x5024(0x10),'qSRQe':_0x5024(0x12),'ZIcfz':function(_0x2034bd,_0xe50730){return _0x2034bd===_0xe50730;}};try{if(isKeychainAvailable())return _0x20cb13['qLoKB']!==_0x20cb13[_0x5024(0x17)]?(_0x3e3d2a[_0x5024(0xa)](_0x20cb13['nJcgb'],_0x6adc4),![]):await Keychain[_0x5024(0x18)](_0x5c9e62,_0x1f157e,_0x3520d9);else{const _0x2df848=(_0x3520d9===null||_0x20cb13['KHxYk'](_0x3520d9,void 0x0)?void 0x0:_0x3520d9[_0x5024(0x11)])||_0x20cb13[_0x5024(0x19)];return mockStorage[_0x2df848]={'username':_0x5c9e62,'password':_0x1f157e},!![];}}catch(_0x200eba){console[_0x5024(0x1)](_0x20cb13['qSRQe'],_0x200eba);const _0x42ed90=(_0x20cb13[_0x5024(0x1a)](_0x3520d9,null)||_0x20cb13[_0x5024(0x1b)](_0x3520d9,void 0x0)?void 0x0:_0x3520d9[_0x5024(0x11)])||_0x20cb13[_0x5024(0x19)];return mockStorage[_0x42ed90]={'username':_0x5c9e62,'password':_0x1f157e},!![];}},safeResetGenericPassword=async _0x33214d=>{const _0x3977e9={'MSKyb':_0x5024(0x2),'qllft':function(_0x13dea9){return _0x13dea9();},'dXbNk':'default','woBfy':_0x5024(0x1c),'rnSMP':_0x5024(0x12),'sLtHY':function(_0x41748b,_0xac8de6){return _0x41748b===_0xac8de6;}};try{if(_0x3977e9[_0x5024(0x1d)](isKeychainAvailable))return await Keychain[_0x5024(0x1e)](_0x33214d);else{const _0x5706a0=(_0x33214d===null||_0x33214d===void 0x0?void 0x0:_0x33214d[_0x5024(0x11)])||_0x3977e9['dXbNk'];return delete mockStorage[_0x5706a0],!![];}}catch(_0x59e3db){if(_0x5024(0x1c)===_0x3977e9[_0x5024(0x1f)]){console[_0x5024(0x1)](_0x3977e9['rnSMP'],_0x59e3db);const _0x69bb2d=(_0x3977e9[_0x5024(0x20)](_0x33214d,null)||_0x33214d===void 0x0?void 0x0:_0x33214d[_0x5024(0x11)])||_0x3977e9[_0x5024(0x21)];return delete mockStorage[_0x69bb2d],!![];}else _0xdcc42e['warn']('react-native-keychain module not available, using mock storage'),Keychain={'ACCESS_CONTROL':{'BIOMETRY_ANY_OR_DEVICE_PASSCODE':_0x3977e9['MSKyb']},'ACCESSIBLE':{'WHEN_UNLOCKED':_0x3977e9['MSKyb']},'getGenericPassword':async()=>null,'setGenericPassword':async()=>!![],'resetGenericPassword':async()=>!![]};}};export const storeCredentials=async _0x264b35=>{const _0x439aac={'yWoXm':function(_0x36bd74){return _0x36bd74();},'dszQs':function(_0x11eb34,_0x471913){return _0x11eb34===_0x471913;},'ECPLP':function(_0x41eb96,_0x5c3ab1){return _0x41eb96===_0x5c3ab1;},'kfFVm':_0x5024(0x22),'yPWeu':_0x5024(0x23),'Zzpyc':_0x5024(0x24)};try{const _0x1dc794=await _0x439aac[_0x5024(0x25)](getCredentials),_0x1817fd={..._0x1dc794,..._0x264b35,'createdAt':(_0x439aac[_0x5024(0x26)](_0x1dc794,null)||_0x439aac[_0x5024(0x27)](_0x1dc794,void 0x0)?void 0x0:_0x1dc794[_0x5024(0x28)])||Date[_0x5024(0x29)]()},_0x48bb18=_0x1817fd[_0x5024(0x2a)];if(!_0x48bb18)throw new Error(_0x439aac[_0x5024(0x2b)]);const _0x18a868={'service':STORAGE_KEYS[_0x5024(0x2c)]};return Platform['OS']!==_0x439aac[_0x5024(0x2d)]&&_0x439aac[_0x5024(0x25)](isKeychainAvailable)&&(_0x18a868[_0x5024(0x2e)]=Keychain['ACCESS_CONTROL'][_0x5024(0x2f)],_0x18a868[_0x5024(0x30)]=Keychain['ACCESSIBLE']['WHEN_UNLOCKED']),await safeSetGenericPassword(_0x48bb18,JSON[_0x5024(0x31)](_0x1817fd),_0x18a868),!![];}catch(_0x1c5982){return console[_0x5024(0xa)](_0x439aac['Zzpyc'],_0x1c5982),![];}};export const getCredentials=async()=>{const _0x2a9c76={'PzlFH':function(_0x552660,_0x4732d1){return _0x552660(_0x4732d1);},'PdTLD':_0x5024(0x32),'PcSaH':function(_0x3787ae,_0x42e4ec){return _0x3787ae!==_0x42e4ec;},'RRLHP':_0x5024(0x33),'KRGib':_0x5024(0x34),'QlcxR':function(_0x5375fa,_0x28a826){return _0x5375fa===_0x28a826;},'baYHb':_0x5024(0x35),'aroUu':_0x5024(0x36)};try{if(_0x2a9c76[_0x5024(0x37)](_0x2a9c76[_0x5024(0x38)],_0x2a9c76[_0x5024(0x39)])){const _0x1908ee=await _0x2a9c76[_0x5024(0x3a)](safeGetGenericPassword,{'service':STORAGE_KEYS[_0x5024(0x2c)]});if(_0x1908ee)return JSON[_0x5024(0x3b)](_0x1908ee[_0x5024(0x3c)]);return null;}else Keychain=_0x2a9c76[_0x5024(0x3a)](_0x1bbb8d,0x0);}catch(_0x4392c5){return _0x2a9c76[_0x5024(0x3d)](_0x2a9c76['baYHb'],_0x2a9c76['aroUu'])?(_0x12d55b[_0x5024(0xa)](_0x2a9c76[_0x5024(0x3e)],_0x1eda89),null):(console['error'](_0x2a9c76[_0x5024(0x3e)],_0x4392c5),null);}};export const hasCredentials=async()=>{const _0x49da5b={'TiogD':_0x5024(0x12),'CxXBb':function(_0x174fc2,_0x4a2829){return _0x174fc2===_0x4a2829;},'VcAxv':function(_0x24fa5e,_0x4dc799){return _0x24fa5e===_0x4dc799;},'BJwPo':_0x5024(0x10),'NgdxX':function(_0x487b0b,_0x1b3015){return _0x487b0b!==_0x1b3015;},'TvErA':'Error\x20checking\x20credentials:'};try{const _0x34f449=await safeGetGenericPassword({'service':STORAGE_KEYS[_0x5024(0x2c)]});return!!_0x34f449;}catch(_0x283ae9){if(_0x49da5b[_0x5024(0x3f)](_0x5024(0x40),_0x5024(0x40))){_0x12e72e[_0x5024(0x1)](_0x49da5b[_0x5024(0x41)],_0x4c75a2);const _0xea9e13=(_0x49da5b[_0x5024(0x42)](_0x2c5631,null)||_0x49da5b[_0x5024(0x43)](_0x2bab44,void 0x0)?void 0x0:_0x293985[_0x5024(0x11)])||_0x49da5b['BJwPo'];return _0x50ff75[_0xea9e13]={'username':_0x5bb259,'password':_0x2b136c},!![];}else return console[_0x5024(0xa)](_0x49da5b[_0x5024(0x44)],_0x283ae9),![];}};export const deleteCredentials=async()=>{const _0x363b66={'UOxtT':_0x5024(0x45)};try{return await safeResetGenericPassword({'service':STORAGE_KEYS[_0x5024(0x2c)]}),!![];}catch(_0x17db16){return _0x363b66[_0x5024(0x46)]!==_0x363b66[_0x5024(0x46)]?!![]:(console[_0x5024(0xa)](_0x5024(0x47),_0x17db16),![]);}};export const updateCredentials=async _0x1339e3=>{return storeCredentials(_0x1339e3);};export const generateDeviceUsername=()=>{const _0x5b24a7=Math['random']()[_0x5024(0x48)](0x24)[_0x5024(0xe)](0x2,0xa);return _0x5024(0xf)+_0x5b24a7;};export const verifyCredentials=async _0x2daec3=>{const _0x405c05={'BMiOj':function(_0x536e5b){return _0x536e5b();},'sCOGM':function(_0x4600bf,_0xf4e8da){return _0x4600bf===_0xf4e8da;},'ZJVSi':_0x5024(0x49),'TWiuz':'rQPWS','bsYiv':'Error\x20verifying\x20credentials:'};try{if(!_0x405c05[_0x5024(0x4a)](isKeychainAvailable)){if(_0x405c05[_0x5024(0x4b)](_0x405c05[_0x5024(0x4c)],_0x405c05['TWiuz']))_0x2d093a[_0x5024(0x2e)]=Keychain['ACCESS_CONTROL']['BIOMETRY_ANY_OR_DEVICE_PASSCODE'],_0x58b9ca[_0x5024(0x30)]=Keychain['ACCESSIBLE'][_0x5024(0x4d)];else return!![];}return!![];}catch(_0x16b52f){return console['error'](_0x405c05[_0x5024(0x4e)],_0x16b52f),![];}};export const getJWT=async()=>{const _0x32bb94={'HHDDl':function(_0x144e4c,_0x991ab5){return _0x144e4c===_0x991ab5;},'tkGrU':function(_0x544209,_0x157474){return _0x544209===_0x157474;},'rnSIa':function(_0x3b3327,_0x367eba){return _0x3b3327!==_0x367eba;},'sOvPu':_0x5024(0x4f),'yyEIs':_0x5024(0x50)};try{const _0x5cc564=await AsyncStorage[_0x5024(0x51)](JWT_TOKEN_KEY);return _0x5cc564;}catch(_0x55b326){if(_0x32bb94[_0x5024(0x52)](_0x32bb94['sOvPu'],_0x32bb94[_0x5024(0x53)])){const _0x56a89f=(_0x32bb94[_0x5024(0x54)](_0xcea88f,null)||_0x32bb94[_0x5024(0x55)](_0x2d9d3d,void 0x0)?void 0x0:_0x2bdef4['service'])||'default';return _0xf70cc1[_0x56a89f]||null;}else return console[_0x5024(0xa)](_0x32bb94[_0x5024(0x56)],_0x55b326),null;}};export const hasJWT=async()=>{const _0x472a22={'cfiTe':function(_0x45e549,_0x5c9b2e){return _0x45e549(_0x5c9b2e);},'RqXVB':function(_0x565ded,_0x40bd0b){return _0x565ded===_0x40bd0b;},'hxlbM':_0x5024(0x57)};try{if(_0x472a22[_0x5024(0x58)](_0x472a22[_0x5024(0x59)],_0x5024(0x5a)))return _0x472a22['cfiTe'](_0x281d41,_0x31732d);else{const _0x3b3bb9=await AsyncStorage[_0x5024(0x51)](JWT_TOKEN_KEY);return!!_0x3b3bb9;}}catch(_0x1e3db8){return console[_0x5024(0xa)](_0x5024(0x15),_0x1e3db8),![];}};export const clearJWT=async()=>{const _0xe32faf={'NsZMI':_0x5024(0x5b),'hEqSe':_0x5024(0x5c)};try{return await AsyncStorage[_0x5024(0x5d)](JWT_TOKEN_KEY),console[_0x5024(0x5e)](_0xe32faf[_0x5024(0x5f)]),!![];}catch(_0xf371d){return console['error'](_0xe32faf[_0x5024(0x60)],_0xf371d),![];}};function _0x14c1(){const _0x21b170=['onairos_jwt_token','warn','mock','Error\x20checking\x20credentials:','pBDZW','function','hWakL','jxNAE','getGenericPassword','cCDQA','error','knKJk','cmJwb','random','substring','dev_','default','service','Keychain\x20access\x20failed,\x20using\x20mock\x20storage','kemqM','NMQGZ','❌\x20Failed\x20to\x20check\x20JWT\x20token:','oYDec','qLoKB','setGenericPassword','OjtPd','KHxYk','ZIcfz','bESzX','qllft','resetGenericPassword','woBfy','sLtHY','dXbNk','Username\x20is\x20required\x20for\x20storing\x20credentials','web','Error\x20storing\x20credentials:','yWoXm','dszQs','ECPLP','createdAt','now','username','kfFVm','credentials','yPWeu','accessControl','BIOMETRY_ANY_OR_DEVICE_PASSCODE','accessible','stringify','Error\x20getting\x20credentials:','jeIIp','lcqrZ','Eaufj','qgtMB','PcSaH','RRLHP','KRGib','PzlFH','parse','password','QlcxR','PdTLD','NgdxX','zmvtu','TiogD','CxXBb','VcAxv','TvErA','AkZPN','UOxtT','Error\x20deleting\x20credentials:','toString','YXkhe','BMiOj','sCOGM','ZJVSi','WHEN_UNLOCKED','bsYiv','OxZiI','❌\x20Failed\x20to\x20retrieve\x20JWT\x20token:','getItem','rnSIa','sOvPu','HHDDl','tkGrU','yyEIs','QybQQ','RqXVB','hxlbM','svfEl','🗑️\x20JWT\x20token\x20cleared','❌\x20Failed\x20to\x20clear\x20JWT\x20token:','removeItem','log','NsZMI','hEqSe','ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/','pwLDG','length','sCeDo','bitlw','QQwbi','ygbgd','indexOf','charAt','HDDpK','wftrQ','IGHeg','UjUAf','pzjQX','dWnqK','DzBkX','fromCharCode','CaAIQ','❌\x20Failed\x20to\x20decode\x20JWT\x20payload:','TPwTt','PXZhe','IiqWZ','udbkS','split','peAtW','❌\x20Failed\x20to\x20check\x20JWT\x20expiration:','uGCZs','exp','ywPcq','EgDib'];_0x14c1=function(){return _0x21b170;};return _0x14c1();}const base64Decode=_0x39e64c=>{const _0x46c904={'pwLDG':function(_0xaa9cd4,_0x5f3630){return _0xaa9cd4%_0x5f3630;},'sCeDo':'LLPVo','bitlw':'YtrTl','QQwbi':_0x5024(0x61),'ygbgd':function(_0xf77ba4,_0x1c3da4){return _0xf77ba4<_0x1c3da4;},'HDDpK':function(_0x5a62dc,_0x536349){return _0x5a62dc+_0x536349;},'wftrQ':function(_0x2f01c0,_0x58573d){return _0x2f01c0|_0x58573d;},'IGHeg':function(_0x358e31,_0x2a5685){return _0x358e31|_0x2a5685;},'UjUAf':function(_0x39f518,_0x5becbc){return _0x39f518<<_0x5becbc;},'pzjQX':function(_0x5d5e30,_0x5d542c){return _0x5d5e30<<_0x5d542c;},'dWnqK':function(_0x391f45,_0x5b7c15){return _0x391f45&_0x5b7c15;},'DzBkX':function(_0x3079f9,_0x391908){return _0x3079f9>>_0x391908;},'CaAIQ':function(_0x2e2b39,_0x2edc00){return _0x2e2b39!==_0x2edc00;},'hheze':function(_0x78bd83,_0x257bd0){return _0x78bd83&_0x257bd0;}};while(_0x46c904[_0x5024(0x62)](_0x39e64c[_0x5024(0x63)],0x4)){if(_0x46c904[_0x5024(0x64)]!==_0x46c904[_0x5024(0x65)])_0x39e64c+='=';else{if(!_0x5c0cd4())return!![];return!![];}}const _0x5d7e86=_0x46c904[_0x5024(0x66)];let _0x2c0baa='';for(let _0x437859=0x0;_0x46c904[_0x5024(0x67)](_0x437859,_0x39e64c[_0x5024(0x63)]);_0x437859+=0x4){const _0x1c4bce=_0x5d7e86[_0x5024(0x68)](_0x39e64c[_0x5024(0x69)](_0x437859)),_0x378048=_0x5d7e86['indexOf'](_0x39e64c[_0x5024(0x69)](_0x437859+0x1)),_0x27ba52=_0x5d7e86[_0x5024(0x68)](_0x39e64c[_0x5024(0x69)](_0x46c904[_0x5024(0x6a)](_0x437859,0x2))),_0x55d2aa=_0x5d7e86[_0x5024(0x68)](_0x39e64c[_0x5024(0x69)](_0x437859+0x3)),_0x4c6a29=_0x46c904[_0x5024(0x6b)](_0x46c904[_0x5024(0x6c)](_0x1c4bce<<0x12,_0x46c904[_0x5024(0x6d)](_0x378048,0xc))|_0x46c904[_0x5024(0x6e)](_0x27ba52,0x6),_0x55d2aa);_0x2c0baa+=String['fromCharCode'](_0x46c904[_0x5024(0x6f)](_0x46c904[_0x5024(0x70)](_0x4c6a29,0x10),0xff));if(_0x27ba52!==0x40)_0x2c0baa+=String[_0x5024(0x71)](_0x46c904[_0x5024(0x70)](_0x4c6a29,0x8)&0xff);if(_0x46c904[_0x5024(0x72)](_0x55d2aa,0x40))_0x2c0baa+=String[_0x5024(0x71)](_0x46c904['hheze'](_0x4c6a29,0xff));}return _0x2c0baa;};export const getJWTPayload=async()=>{const _0x223843={'udbkS':_0x5024(0x73),'PXZhe':function(_0x5a543a,_0x165a22){return _0x5a543a!==_0x165a22;},'IiqWZ':_0x5024(0x74),'rXbxH':function(_0x23c09f){return _0x23c09f();},'vcVQT':function(_0x36005a,_0x293cf2){return _0x36005a!==_0x293cf2;},'peAtW':function(_0x470da9,_0x573743){return _0x470da9(_0x573743);}};try{if(_0x223843[_0x5024(0x75)](_0x223843[_0x5024(0x76)],_0x223843[_0x5024(0x76)]))return _0x27fc6e[_0x5024(0xa)](_0x223843[_0x5024(0x77)],_0x148f95),null;else{const _0x3ec073=await _0x223843['rXbxH'](getJWT);if(!_0x3ec073)return null;const _0x405012=_0x3ec073[_0x5024(0x78)]('.');if(_0x223843['vcVQT'](_0x405012[_0x5024(0x63)],0x3))return null;const _0x373121=_0x223843[_0x5024(0x79)](base64Decode,_0x405012[0x1]),_0x53b460=JSON[_0x5024(0x3b)](_0x373121);return _0x53b460;}}catch(_0x275642){return console['error'](_0x223843[_0x5024(0x77)],_0x275642),null;}};function _0x5024(_0x14c17f,_0x502460){_0x14c17f=_0x14c17f-0x0;const _0x1d1b43=_0x14c1();let _0x511a3e=_0x1d1b43[_0x14c17f];return _0x511a3e;}export const isJWTExpired=async()=>{const _0x5c5d61={'uGCZs':function(_0x45a74f){return _0x45a74f();},'ywPcq':function(_0x276908,_0x17c52c){return _0x276908/_0x17c52c;},'EgDib':_0x5024(0x7a)};try{const _0x398a6e=await _0x5c5d61[_0x5024(0x7b)](getJWTPayload);if(!_0x398a6e||!_0x398a6e[_0x5024(0x7c)])return!![];const _0x4ff7e7=Math['floor'](_0x5c5d61[_0x5024(0x7d)](Date['now'](),0x3e8));return _0x398a6e[_0x5024(0x7c)]<_0x4ff7e7;}catch(_0x18a4f5){return console['error'](_0x5c5d61[_0x5024(0x7e)],_0x18a4f5),!![];}};
5
+ // JWT token storage key
6
+ const JWT_TOKEN_KEY = 'onairos_jwt_token';
7
+
8
+ // Define OnairosCredentials interface locally to avoid circular dependencies
9
+
10
+ // Create a mock storage for environments without Keychain access (like Expo Go)
11
+ const mockStorage = {};
12
+
13
+ // Try to import Keychain, but provide fallbacks if not available
14
+ let Keychain = null;
15
+ try {
16
+ // This import might fail in Expo Go or environments without native modules
17
+ Keychain = require('react-native-keychain');
18
+ } catch (error) {
19
+ console.warn('react-native-keychain module not available, using mock storage');
20
+ // Create minimal mock implementation
21
+ Keychain = {
22
+ ACCESS_CONTROL: {
23
+ BIOMETRY_ANY_OR_DEVICE_PASSCODE: 'mock'
24
+ },
25
+ ACCESSIBLE: {
26
+ WHEN_UNLOCKED: 'mock'
27
+ },
28
+ getGenericPassword: async () => null,
29
+ setGenericPassword: async () => true,
30
+ resetGenericPassword: async () => true
31
+ };
32
+ }
33
+
34
+ // Check if Keychain is properly initialized and available
35
+ const isKeychainAvailable = () => {
36
+ try {
37
+ return Keychain && typeof Keychain.getGenericPassword === 'function';
38
+ } catch (e) {
39
+ return false;
40
+ }
41
+ };
42
+
43
+ // Wrapper for getGenericPassword that falls back to mock storage
44
+ const safeGetGenericPassword = async options => {
45
+ try {
46
+ if (isKeychainAvailable()) {
47
+ return await Keychain.getGenericPassword(options);
48
+ } else {
49
+ // Fall back to mock storage in memory
50
+ const key = (options === null || options === void 0 ? void 0 : options.service) || 'default';
51
+ return mockStorage[key] || null;
52
+ }
53
+ } catch (error) {
54
+ console.warn('Keychain access failed, using mock storage', error);
55
+ // Fall back to mock storage on error
56
+ const key = (options === null || options === void 0 ? void 0 : options.service) || 'default';
57
+ return mockStorage[key] || null;
58
+ }
59
+ };
60
+
61
+ // Wrapper for setGenericPassword that falls back to mock storage
62
+ const safeSetGenericPassword = async (username, password, options) => {
63
+ try {
64
+ if (isKeychainAvailable()) {
65
+ return await Keychain.setGenericPassword(username, password, options);
66
+ } else {
67
+ // Fall back to mock storage in memory
68
+ const key = (options === null || options === void 0 ? void 0 : options.service) || 'default';
69
+ mockStorage[key] = {
70
+ username,
71
+ password
72
+ };
73
+ return true;
74
+ }
75
+ } catch (error) {
76
+ console.warn('Keychain access failed, using mock storage', error);
77
+ // Fall back to mock storage on error
78
+ const key = (options === null || options === void 0 ? void 0 : options.service) || 'default';
79
+ mockStorage[key] = {
80
+ username,
81
+ password
82
+ };
83
+ return true;
84
+ }
85
+ };
86
+
87
+ // Wrapper for resetGenericPassword that falls back to mock storage
88
+ const safeResetGenericPassword = async options => {
89
+ try {
90
+ if (isKeychainAvailable()) {
91
+ return await Keychain.resetGenericPassword(options);
92
+ } else {
93
+ // Fall back to mock storage in memory
94
+ const key = (options === null || options === void 0 ? void 0 : options.service) || 'default';
95
+ delete mockStorage[key];
96
+ return true;
97
+ }
98
+ } catch (error) {
99
+ console.warn('Keychain access failed, using mock storage', error);
100
+ // Fall back to mock storage on error
101
+ const key = (options === null || options === void 0 ? void 0 : options.service) || 'default';
102
+ delete mockStorage[key];
103
+ return true;
104
+ }
105
+ };
106
+
107
+ /**
108
+ * Store credentials in memory (temporary solution)
109
+ */
110
+ export const storeCredentials = async credentials => {
111
+ try {
112
+ const existingCredentials = await getCredentials();
113
+ const updatedCredentials = {
114
+ ...existingCredentials,
115
+ ...credentials,
116
+ createdAt: (existingCredentials === null || existingCredentials === void 0 ? void 0 : existingCredentials.createdAt) || Date.now()
117
+ };
118
+ const username = updatedCredentials.username;
119
+ if (!username) {
120
+ throw new Error('Username is required for storing credentials');
121
+ }
122
+ const options = {
123
+ service: STORAGE_KEYS.credentials
124
+ };
125
+
126
+ // Only use secure storage options on real devices
127
+ if (Platform.OS !== 'web' && isKeychainAvailable()) {
128
+ options.accessControl = Keychain.ACCESS_CONTROL.BIOMETRY_ANY_OR_DEVICE_PASSCODE;
129
+ options.accessible = Keychain.ACCESSIBLE.WHEN_UNLOCKED;
130
+ }
131
+ await safeSetGenericPassword(username, JSON.stringify(updatedCredentials), options);
132
+ return true;
133
+ } catch (error) {
134
+ console.error('Error storing credentials:', error);
135
+ return false;
136
+ }
137
+ };
138
+
139
+ /**
140
+ * Retrieve credentials from memory (temporary solution)
141
+ */
142
+ export const getCredentials = async () => {
143
+ try {
144
+ const credentials = await safeGetGenericPassword({
145
+ service: STORAGE_KEYS.credentials
146
+ });
147
+ if (credentials) {
148
+ return JSON.parse(credentials.password);
149
+ }
150
+ return null;
151
+ } catch (error) {
152
+ console.error('Error getting credentials:', error);
153
+ return null;
154
+ }
155
+ };
156
+
157
+ /**
158
+ * Check if the user has stored credentials
159
+ */
160
+ export const hasCredentials = async () => {
161
+ try {
162
+ const credentials = await safeGetGenericPassword({
163
+ service: STORAGE_KEYS.credentials
164
+ });
165
+ return !!credentials;
166
+ } catch (error) {
167
+ console.error('Error checking credentials:', error);
168
+ return false;
169
+ }
170
+ };
171
+
172
+ /**
173
+ * Delete stored credentials
174
+ */
175
+ export const deleteCredentials = async () => {
176
+ try {
177
+ await safeResetGenericPassword({
178
+ service: STORAGE_KEYS.credentials
179
+ });
180
+ return true;
181
+ } catch (error) {
182
+ console.error('Error deleting credentials:', error);
183
+ return false;
184
+ }
185
+ };
186
+
187
+ /**
188
+ * Update specific fields in the stored credentials
189
+ */
190
+ export const updateCredentials = async credentials => {
191
+ return storeCredentials(credentials);
192
+ };
193
+
194
+ /**
195
+ * Generate a device-specific unique username
196
+ */
197
+ export const generateDeviceUsername = () => {
198
+ const randomId = Math.random().toString(36).substring(2, 10);
199
+ return `dev_${randomId}`;
200
+ };
201
+
202
+ /**
203
+ * Verify credentials (temporary mock implementation)
204
+ */
205
+ export const verifyCredentials = async username => {
206
+ try {
207
+ // For Expo Go or development, always return true
208
+ if (!isKeychainAvailable()) {
209
+ return true;
210
+ }
211
+
212
+ // TODO: Implement actual verification with API
213
+ return true;
214
+ } catch (error) {
215
+ console.error('Error verifying credentials:', error);
216
+ return false;
217
+ }
218
+ };
219
+
220
+ /**
221
+ * JWT Token Storage Functions
222
+ * These functions handle JWT tokens from email verification
223
+ *
224
+ * Note: Main JWT token management is handled in apiKeyService.ts
225
+ * These are utility functions for backwards compatibility
226
+ */
227
+
228
+ /**
229
+ * Retrieve JWT token
230
+ * @returns JWT token or null if not found
231
+ */
232
+ export const getJWT = async () => {
233
+ try {
234
+ const token = await AsyncStorage.getItem(JWT_TOKEN_KEY);
235
+ return token;
236
+ } catch (error) {
237
+ console.error('❌ Failed to retrieve JWT token:', error);
238
+ return null;
239
+ }
240
+ };
241
+
242
+ /**
243
+ * Check if JWT token exists
244
+ * @returns True if JWT token exists
245
+ */
246
+ export const hasJWT = async () => {
247
+ try {
248
+ const token = await AsyncStorage.getItem(JWT_TOKEN_KEY);
249
+ return !!token;
250
+ } catch (error) {
251
+ console.error('❌ Failed to check JWT token:', error);
252
+ return false;
253
+ }
254
+ };
255
+
256
+ /**
257
+ * Clear JWT token
258
+ */
259
+ export const clearJWT = async () => {
260
+ try {
261
+ await AsyncStorage.removeItem(JWT_TOKEN_KEY);
262
+ console.log('🗑️ JWT token cleared');
263
+ return true;
264
+ } catch (error) {
265
+ console.error('❌ Failed to clear JWT token:', error);
266
+ return false;
267
+ }
268
+ };
269
+
270
+ /**
271
+ * Simple base64 decoder for React Native
272
+ */
273
+ const base64Decode = str => {
274
+ // Add padding if needed
275
+ while (str.length % 4) {
276
+ str += '=';
277
+ }
278
+
279
+ // Simple base64 decoding
280
+ const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
281
+ let result = '';
282
+ for (let i = 0; i < str.length; i += 4) {
283
+ const a = chars.indexOf(str.charAt(i));
284
+ const b = chars.indexOf(str.charAt(i + 1));
285
+ const c = chars.indexOf(str.charAt(i + 2));
286
+ const d = chars.indexOf(str.charAt(i + 3));
287
+ const bitmap = a << 18 | b << 12 | c << 6 | d;
288
+ result += String.fromCharCode(bitmap >> 16 & 255);
289
+ if (c !== 64) result += String.fromCharCode(bitmap >> 8 & 255);
290
+ if (d !== 64) result += String.fromCharCode(bitmap & 255);
291
+ }
292
+ return result;
293
+ };
294
+
295
+ /**
296
+ * Get JWT token payload (decoded)
297
+ * @returns Decoded JWT payload or null if invalid
298
+ */
299
+ export const getJWTPayload = async () => {
300
+ try {
301
+ const token = await getJWT();
302
+ if (!token) return null;
303
+
304
+ // Decode JWT payload (middle part of token)
305
+ const parts = token.split('.');
306
+ if (parts.length !== 3) return null;
307
+ const decodedPayload = base64Decode(parts[1]);
308
+ const payload = JSON.parse(decodedPayload);
309
+ return payload;
310
+ } catch (error) {
311
+ console.error('❌ Failed to decode JWT payload:', error);
312
+ return null;
313
+ }
314
+ };
315
+
316
+ /**
317
+ * Check if JWT token is expired
318
+ * @returns True if token is expired or invalid
319
+ */
320
+ export const isJWTExpired = async () => {
321
+ try {
322
+ const payload = await getJWTPayload();
323
+ if (!payload || !payload.exp) return true;
324
+ const currentTime = Math.floor(Date.now() / 1000);
325
+ return payload.exp < currentTime;
326
+ } catch (error) {
327
+ console.error('❌ Failed to check JWT expiration:', error);
328
+ return true;
329
+ }
330
+ };
331
+ //# sourceMappingURL=secureStorage.js.map