@onairos/react-native 3.7.1 → 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 (241) hide show
  1. package/lib/commonjs/api/index.js +219 -9
  2. package/lib/commonjs/assets/icons/spotify.png +0 -0
  3. package/lib/commonjs/assets/images/spotify.png +0 -0
  4. package/lib/commonjs/components/BodyText.js +27 -9
  5. package/lib/commonjs/components/BrandMark.js +111 -10
  6. package/lib/commonjs/components/CodeInput.js +116 -9
  7. package/lib/commonjs/components/EmailInput.js +30 -8
  8. package/lib/commonjs/components/GoogleButton.js +56 -9
  9. package/lib/commonjs/components/HeadingGroup.js +43 -9
  10. package/lib/commonjs/components/LLMDataInputModal.js +664 -14
  11. package/lib/commonjs/components/ModalHeader.js +99 -9
  12. package/lib/commonjs/components/ModalSheet.js +47 -9
  13. package/lib/commonjs/components/Onairos.js +380 -14
  14. package/lib/commonjs/components/OnairosButton.js +313 -13
  15. package/lib/commonjs/components/OnairosSignInButton.js +130 -12
  16. package/lib/commonjs/components/Overlay.js +465 -13
  17. package/lib/commonjs/components/PersonaImage.js +137 -10
  18. package/lib/commonjs/components/PersonaLoadingScreen.js +318 -12
  19. package/lib/commonjs/components/PersonalizationConsentScreen.js +467 -13
  20. package/lib/commonjs/components/PinCreationScreen.js +403 -12
  21. package/lib/commonjs/components/PinInput.js +464 -9
  22. package/lib/commonjs/components/PlatformConnectorsStep.js +1311 -23
  23. package/lib/commonjs/components/PlatformList.js +137 -10
  24. package/lib/commonjs/components/PlatformToggle.js +180 -9
  25. package/lib/commonjs/components/PrimaryButton.js +180 -10
  26. package/lib/commonjs/components/SignInMatchAnimation.js +197 -9
  27. package/lib/commonjs/components/SignInStep.js +345 -12
  28. package/lib/commonjs/components/UniversalOnboarding.js +2780 -30
  29. package/lib/commonjs/components/VerificationStep.js +176 -11
  30. package/lib/commonjs/components/WelcomeScreen.js +461 -22
  31. package/lib/commonjs/components/icons/Basicproficon.js +37 -8
  32. package/lib/commonjs/components/icons/Basicprofile.js +21 -8
  33. package/lib/commonjs/components/icons/Checkbox.js +21 -8
  34. package/lib/commonjs/components/icons/Checkmark.js +27 -8
  35. package/lib/commonjs/components/icons/Contentanalysis.js +21 -8
  36. package/lib/commonjs/components/icons/Contenticon.js +39 -8
  37. package/lib/commonjs/components/icons/EnochE.js +41 -8
  38. package/lib/commonjs/components/icons/Personalityicon.js +30 -8
  39. package/lib/commonjs/components/icons/Personalityprofile.js +21 -8
  40. package/lib/commonjs/components/icons/Personalitytraits.js +21 -8
  41. package/lib/commonjs/components/icons/Userpreferences.js +21 -8
  42. package/lib/commonjs/components/icons/index.js +84 -17
  43. package/lib/commonjs/components/onboarding/OAuthWebView.js +1754 -18
  44. package/lib/commonjs/components/onboarding/OnboardingHeader.js +74 -10
  45. package/lib/commonjs/components/onboarding/PinInput.js +283 -10
  46. package/lib/commonjs/components/onboarding/PlatformConnector.js +249 -11
  47. package/lib/commonjs/config/PLATFORM_APIS.md +849 -0
  48. package/lib/commonjs/config/api.js +56 -7
  49. package/lib/commonjs/constants/index.js +120 -7
  50. package/lib/commonjs/context/AuthContext.js +345 -10
  51. package/lib/commonjs/hooks/useConnectedAccounts.js +111 -9
  52. package/lib/commonjs/hooks/useConnections.js +102 -8
  53. package/lib/commonjs/hooks/useCredentials.js +178 -10
  54. package/lib/commonjs/hooks/useUserConnections.js +148 -10
  55. package/lib/commonjs/index.js +439 -34
  56. package/lib/commonjs/services/apiClient.js +298 -8
  57. package/lib/commonjs/services/biometricPinService.js +180 -8
  58. package/lib/commonjs/services/chatGPTConversationExtractor.js +155 -8
  59. package/lib/commonjs/services/chatGPTConversationService.js +275 -9
  60. package/lib/commonjs/services/claudeConversationExtractor.js +103 -8
  61. package/lib/commonjs/services/claudeConversationService.js +158 -9
  62. package/lib/commonjs/services/connectedAccountsService.js +310 -10
  63. package/lib/commonjs/services/googleAuthService.js +252 -11
  64. package/lib/commonjs/services/hingeDataExtractor.js +105 -8
  65. package/lib/commonjs/services/hingeDataService.js +150 -9
  66. package/lib/commonjs/services/imageCompressionService.js +260 -7
  67. package/lib/commonjs/services/instagramDataExtractor.js +126 -8
  68. package/lib/commonjs/services/instagramDataService.js +163 -9
  69. package/lib/commonjs/services/jwtStorageService.js +276 -7
  70. package/lib/commonjs/services/linkedinDOMExtractor.js +245 -7
  71. package/lib/commonjs/services/linkedinProfileService.js +222 -9
  72. package/lib/commonjs/services/linkedinScrapingService.js +230 -8
  73. package/lib/commonjs/services/llmDataStorage.js +294 -8
  74. package/lib/commonjs/services/mobileTrainingService.js +186 -8
  75. package/lib/commonjs/services/netflixDataExtractor.js +120 -8
  76. package/lib/commonjs/services/netflixDataService.js +198 -9
  77. package/lib/commonjs/services/pinEncryptionService.js +84 -8
  78. package/lib/commonjs/services/pinStorageUtils.js +105 -7
  79. package/lib/commonjs/services/platformAuthService.js +1484 -12
  80. package/lib/commonjs/services/sephoraDataExtractor.js +140 -8
  81. package/lib/commonjs/services/sephoraDataService.js +200 -9
  82. package/lib/commonjs/services/spotifyDataExtractor.js +148 -8
  83. package/lib/commonjs/services/spotifyDataService.js +241 -9
  84. package/lib/commonjs/services/storageService.js +404 -8
  85. package/lib/commonjs/services/telegramDataExtractor.js +115 -8
  86. package/lib/commonjs/services/telegramDataService.js +499 -9
  87. package/lib/commonjs/services/trainingApiHelpers.js +73 -7
  88. package/lib/commonjs/services/userConnectionsService.js +340 -10
  89. package/lib/commonjs/services/youtubeMigrationService.js +416 -10
  90. package/lib/commonjs/theme/index.js +250 -7
  91. package/lib/commonjs/types/ambient.d.js +2 -1
  92. package/lib/commonjs/types/declarations.d.js +2 -1
  93. package/lib/commonjs/types/index.js +6 -1
  94. package/lib/commonjs/types/node-fix.d.js +2 -1
  95. package/lib/commonjs/types/node-override.d.js +2 -1
  96. package/lib/commonjs/types/opacity.d.js +2 -1
  97. package/lib/commonjs/types.js +14 -1
  98. package/lib/commonjs/utils/Portal.js +98 -8
  99. package/lib/commonjs/utils/api.js +130 -9
  100. package/lib/commonjs/utils/assetRegistry.js +210 -35
  101. package/lib/commonjs/utils/auth.js +112 -9
  102. package/lib/commonjs/utils/connectorTests.js +613 -29
  103. package/lib/commonjs/utils/crypto.js +62 -8
  104. package/lib/commonjs/utils/debugHelper.js +64 -1
  105. package/lib/commonjs/utils/encryption.js +76 -7
  106. package/lib/commonjs/utils/eventUtils.js +288 -1
  107. package/lib/commonjs/utils/haptics.js +66 -9
  108. package/lib/commonjs/utils/imagePreloader.js +6 -1
  109. package/lib/commonjs/utils/networkDiagnostics.js +226 -8
  110. package/lib/commonjs/utils/onairosApi.js +350 -9
  111. package/lib/commonjs/utils/programmaticFlow.js +117 -9
  112. package/lib/commonjs/utils/retryHelper.js +220 -1
  113. package/lib/commonjs/utils/secureStorage.js +349 -10
  114. package/lib/commonjs/utils/webviewScripts/chatgpt.js +551 -1
  115. package/lib/commonjs/utils/webviewScripts/claude.js +376 -1
  116. package/lib/commonjs/utils/webviewScripts/hinge.js +411 -1
  117. package/lib/commonjs/utils/webviewScripts/index.js +698 -15
  118. package/lib/commonjs/utils/webviewScripts/instagram.js +454 -1
  119. package/lib/commonjs/utils/webviewScripts/linkedin.js +880 -1
  120. package/lib/commonjs/utils/webviewScripts/netflix.js +382 -1
  121. package/lib/commonjs/utils/webviewScripts/sephora.js +516 -1
  122. package/lib/commonjs/utils/webviewScripts/spotify.js +419 -1
  123. package/lib/commonjs/utils/webviewScripts/telegram.js +678 -1
  124. package/lib/module/api/index.js +211 -1
  125. package/lib/module/assets/icons/spotify.png +0 -0
  126. package/lib/module/assets/images/spotify.png +0 -0
  127. package/lib/module/components/BodyText.js +20 -1
  128. package/lib/module/components/BrandMark.js +104 -1
  129. package/lib/module/components/CodeInput.js +109 -1
  130. package/lib/module/components/EmailInput.js +23 -1
  131. package/lib/module/components/GoogleButton.js +49 -1
  132. package/lib/module/components/HeadingGroup.js +36 -1
  133. package/lib/module/components/LLMDataInputModal.js +656 -7
  134. package/lib/module/components/ModalHeader.js +92 -1
  135. package/lib/module/components/ModalSheet.js +39 -1
  136. package/lib/module/components/Onairos.js +373 -1
  137. package/lib/module/components/OnairosButton.js +305 -1
  138. package/lib/module/components/OnairosSignInButton.js +121 -1
  139. package/lib/module/components/Overlay.js +456 -1
  140. package/lib/module/components/PersonaImage.js +129 -1
  141. package/lib/module/components/PersonaLoadingScreen.js +310 -1
  142. package/lib/module/components/PersonalizationConsentScreen.js +460 -1
  143. package/lib/module/components/PinCreationScreen.js +396 -1
  144. package/lib/module/components/PinInput.js +456 -1
  145. package/lib/module/components/PlatformConnectorsStep.js +1302 -6
  146. package/lib/module/components/PlatformList.js +129 -1
  147. package/lib/module/components/PlatformToggle.js +173 -1
  148. package/lib/module/components/PrimaryButton.js +172 -1
  149. package/lib/module/components/SignInMatchAnimation.js +189 -1
  150. package/lib/module/components/SignInStep.js +338 -1
  151. package/lib/module/components/UniversalOnboarding.js +2770 -1
  152. package/lib/module/components/VerificationStep.js +168 -1
  153. package/lib/module/components/WelcomeScreen.js +453 -1
  154. package/lib/module/components/icons/Basicproficon.js +30 -1
  155. package/lib/module/components/icons/Basicprofile.js +14 -1
  156. package/lib/module/components/icons/Checkbox.js +14 -1
  157. package/lib/module/components/icons/Checkmark.js +20 -1
  158. package/lib/module/components/icons/Contentanalysis.js +14 -1
  159. package/lib/module/components/icons/Contenticon.js +32 -1
  160. package/lib/module/components/icons/EnochE.js +34 -1
  161. package/lib/module/components/icons/Personalityicon.js +23 -1
  162. package/lib/module/components/icons/Personalityprofile.js +14 -1
  163. package/lib/module/components/icons/Personalitytraits.js +14 -1
  164. package/lib/module/components/icons/Userpreferences.js +14 -1
  165. package/lib/module/components/icons/index.js +13 -1
  166. package/lib/module/components/onboarding/OAuthWebView.js +1746 -1
  167. package/lib/module/components/onboarding/OnboardingHeader.js +66 -1
  168. package/lib/module/components/onboarding/PinInput.js +274 -1
  169. package/lib/module/components/onboarding/PlatformConnector.js +240 -1
  170. package/lib/module/config/PLATFORM_APIS.md +849 -0
  171. package/lib/module/config/api.js +47 -1
  172. package/lib/module/constants/index.js +114 -1
  173. package/lib/module/context/AuthContext.js +335 -1
  174. package/lib/module/hooks/useConnectedAccounts.js +106 -1
  175. package/lib/module/hooks/useConnections.js +95 -1
  176. package/lib/module/hooks/useCredentials.js +171 -6
  177. package/lib/module/hooks/useUserConnections.js +140 -1
  178. package/lib/module/index.js +172 -1
  179. package/lib/module/services/apiClient.js +295 -1
  180. package/lib/module/services/biometricPinService.js +169 -1
  181. package/lib/module/services/chatGPTConversationExtractor.js +149 -1
  182. package/lib/module/services/chatGPTConversationService.js +268 -1
  183. package/lib/module/services/claudeConversationExtractor.js +97 -1
  184. package/lib/module/services/claudeConversationService.js +151 -1
  185. package/lib/module/services/connectedAccountsService.js +293 -1
  186. package/lib/module/services/googleAuthService.js +241 -1
  187. package/lib/module/services/hingeDataExtractor.js +99 -1
  188. package/lib/module/services/hingeDataService.js +143 -1
  189. package/lib/module/services/imageCompressionService.js +250 -1
  190. package/lib/module/services/instagramDataExtractor.js +120 -1
  191. package/lib/module/services/instagramDataService.js +156 -1
  192. package/lib/module/services/jwtStorageService.js +257 -1
  193. package/lib/module/services/linkedinDOMExtractor.js +234 -1
  194. package/lib/module/services/linkedinProfileService.js +210 -1
  195. package/lib/module/services/linkedinScrapingService.js +219 -1
  196. package/lib/module/services/llmDataStorage.js +277 -1
  197. package/lib/module/services/mobileTrainingService.js +173 -1
  198. package/lib/module/services/netflixDataExtractor.js +114 -1
  199. package/lib/module/services/netflixDataService.js +191 -1
  200. package/lib/module/services/pinEncryptionService.js +74 -6
  201. package/lib/module/services/pinStorageUtils.js +93 -1
  202. package/lib/module/services/platformAuthService.js +1461 -1
  203. package/lib/module/services/sephoraDataExtractor.js +134 -1
  204. package/lib/module/services/sephoraDataService.js +193 -1
  205. package/lib/module/services/spotifyDataExtractor.js +142 -1
  206. package/lib/module/services/spotifyDataService.js +234 -1
  207. package/lib/module/services/storageService.js +383 -1
  208. package/lib/module/services/telegramDataExtractor.js +109 -1
  209. package/lib/module/services/telegramDataService.js +493 -1
  210. package/lib/module/services/trainingApiHelpers.js +67 -1
  211. package/lib/module/services/userConnectionsService.js +329 -1
  212. package/lib/module/services/youtubeMigrationService.js +405 -1
  213. package/lib/module/theme/index.js +245 -1
  214. package/lib/module/types.js +10 -1
  215. package/lib/module/utils/Portal.js +90 -1
  216. package/lib/module/utils/api.js +118 -1
  217. package/lib/module/utils/assetRegistry.js +200 -34
  218. package/lib/module/utils/auth.js +100 -1
  219. package/lib/module/utils/connectorTests.js +600 -27
  220. package/lib/module/utils/crypto.js +54 -1
  221. package/lib/module/utils/debugHelper.js +54 -1
  222. package/lib/module/utils/encryption.js +67 -1
  223. package/lib/module/utils/eventUtils.js +270 -1
  224. package/lib/module/utils/haptics.js +59 -8
  225. package/lib/module/utils/imagePreloader.js +3 -1
  226. package/lib/module/utils/networkDiagnostics.js +217 -1
  227. package/lib/module/utils/onairosApi.js +333 -1
  228. package/lib/module/utils/programmaticFlow.js +111 -1
  229. package/lib/module/utils/retryHelper.js +211 -1
  230. package/lib/module/utils/secureStorage.js +330 -6
  231. package/lib/module/utils/webviewScripts/chatgpt.js +545 -1
  232. package/lib/module/utils/webviewScripts/claude.js +370 -1
  233. package/lib/module/utils/webviewScripts/hinge.js +405 -1
  234. package/lib/module/utils/webviewScripts/index.js +434 -1
  235. package/lib/module/utils/webviewScripts/instagram.js +448 -1
  236. package/lib/module/utils/webviewScripts/linkedin.js +874 -1
  237. package/lib/module/utils/webviewScripts/netflix.js +376 -1
  238. package/lib/module/utils/webviewScripts/sephora.js +510 -1
  239. package/lib/module/utils/webviewScripts/spotify.js +413 -1
  240. package/lib/module/utils/webviewScripts/telegram.js +672 -1
  241. package/package.json +2 -2
@@ -1 +1,219 @@
1
- function _0x5313(_0x294708,_0x5313e5){_0x294708=_0x294708-0x0;const _0x5689ea=_0x2947();let _0x29434d=_0x5689ea[_0x294708];return _0x29434d;}function _0x2947(){const _0x4c9ff4=['❌\x20[LINKEDIN\x20SCRAPE]\x20Error:','Unknown\x20error\x20occurred\x20during\x20scraping','🔍\x20[LINKEDIN\x20SCRAPE]\x20Starting\x20profile\x20scrape...','🔍\x20[LINKEDIN\x20SCRAPE]\x20Passed\x20User\x20ID:','🔍\x20[LINKEDIN\x20SCRAPE]\x20JWT\x20userId:','❌\x20[LINKEDIN\x20SCRAPE]\x20Invalid\x20LinkedIn\x20URL','AunbL','QFuEr','🔑\x20[LINKEDIN\x20SCRAPE]\x20Using\x20authenticated\x20user\x20headers','❌\x20[LINKEDIN\x20SCRAPE]\x20Failed:','skOUl','TLpcu','log','OPHdE','🔍\x20[LINKEDIN\x20SCRAPE]\x20Profile\x20URL:','Alikc','MnVck','iRYOW','aorhO','xuwAH','OERYu','dwORc','PJIRq','VIToD','warn','BASE_URL','stringify','rgCUW','BDCGt','text','error','status','Scraping\x20failed:\x20','CGBtd','fJqGx','parse','PQxHk','IxkaW','ZvXgm','json','keGkq','profileData','xuADd','headline','ctLFx','experience','length','LECCM','education','WrXMT','cejPc','xSZnq','skills','UIsIU','DHrFi','vPROb','message','MiKyE','CfWbX','❌\x20[LINKEDIN]\x20Error\x20extracting\x20username:','MNpqd','https://linkedin.com','match','BeFpu','VdsGF','string','cHRIT','DjQou','test','rlqKk','ZvxCH','❌\x20[LINKEDIN]\x20Error\x20getting\x20connection\x20status:','VvIoG','jwBAt','Invalid\x20LinkedIn\x20profile\x20URL.\x20Please\x20use\x20format:\x20https://linkedin.com/in/username','http://','https://','Tyfkz','TiDIO','hqoyO','startsWith','shjNi','fbJDe','includes','dERAb','BuvXp','hmMTm','https://linkedin.com/in/','GRYLX','FsjEx','LZwTc','❌\x20[LINKEDIN]\x20Error\x20checking\x20scrape\x20availability:','/user/','/connections','YZqzB','gghpQ','connections','LinkedIn','CynFN','DQnnR','XKqQi','iqMMb','tzRQl','DPLpx','WGjpD','savoe','fGlHS','FlHGs','/enoch/linkedin-scrape/scrape-profile/','JMMXJ'];_0x2947=function(){return _0x4c9ff4;};return _0x2947();}import{getUserAuthHeaders,getApiHeaders}from'../config/api';import{API_CONFIG}from'../config/api';import{getUserIdFromToken}from'./jwtStorageService';export const scrapeLinkedInProfile=async(_0x2543ec,_0x198dbf)=>{const _0xf9601d={'VIToD':function(_0x584a65){return _0x584a65();},'PQxHk':_0x5313(0x0),'IxkaW':function(_0x3d84c1,_0x44dfae){return _0x3d84c1 instanceof _0x44dfae;},'ZvXgm':_0x5313(0x1),'AOnvZ':_0x5313(0x2),'OPHdE':_0x5313(0x3),'Alikc':function(_0x52e18e,_0x2dc7ab){return _0x52e18e||_0x2dc7ab;},'MnVck':_0x5313(0x4),'iRYOW':function(_0x4b4499,_0x238011){return _0x4b4499(_0x238011);},'aorhO':_0x5313(0x5),'xuwAH':'Invalid\x20LinkedIn\x20profile\x20URL.\x20Please\x20use\x20format:\x20https://linkedin.com/in/username','OERYu':function(_0x214093,_0x3cd5ab){return _0x214093!==_0x3cd5ab;},'dwORc':_0x5313(0x6),'FFVOW':_0x5313(0x7),'PJIRq':_0x5313(0x8),'BDCGt':'rgCUW','skmaU':_0x5313(0x9),'CGBtd':function(_0x194636,_0x19c990){return _0x194636===_0x19c990;},'fJqGx':_0x5313(0xa),'buNTP':function(_0x456cec,_0x13787f){return _0x456cec===_0x13787f;},'keGkq':function(_0x26d393,_0x1b185c){return _0x26d393===_0x1b185c;},'xuADd':function(_0x557837,_0x1a834f){return _0x557837===_0x1a834f;},'ctLFx':function(_0x2f56ed,_0x20c144){return _0x2f56ed===_0x20c144;},'eNuEu':function(_0x2720b2,_0x24b432){return _0x2720b2===_0x24b432;},'lMnEl':function(_0x1d3f52,_0xe7fb0){return _0x1d3f52===_0xe7fb0;},'LECCM':function(_0x1ef1d8,_0x35f1dc){return _0x1ef1d8===_0x35f1dc;},'WrXMT':function(_0x320fab,_0x9a391b){return _0x320fab===_0x9a391b;},'cejPc':function(_0x49bf90,_0x4e9f9a){return _0x49bf90===_0x4e9f9a;},'xSZnq':function(_0x2083fd,_0x826b18){return _0x2083fd===_0x826b18;},'UIsIU':'Profile\x20scraped\x20successfully','vPROb':_0x5313(0xb)};try{var _0x3a2636,_0x3f1c8f,_0x29b987,_0x5a9479,_0x576b24;console['log'](_0xf9601d['AOnvZ']),console[_0x5313(0xc)](_0xf9601d[_0x5313(0xd)],_0x2543ec),console['log'](_0x5313(0xe),_0x198dbf);const _0x3bb83e=await getUserIdFromToken(),_0x3a2879=_0xf9601d[_0x5313(0xf)](_0x3bb83e,_0x2543ec);console[_0x5313(0xc)](_0xf9601d[_0x5313(0x10)],_0x3bb83e),console['log']('🔍\x20[LINKEDIN\x20SCRAPE]\x20Effective\x20userId\x20(will\x20use):',_0x3a2879);if(!_0xf9601d[_0x5313(0x11)](isValidLinkedInUrl,_0x198dbf))return console['error'](_0xf9601d[_0x5313(0x12)]),{'success':![],'error':_0xf9601d[_0x5313(0x13)]};let _0x2a0ad1;try{_0xf9601d[_0x5313(0x14)](_0xf9601d[_0x5313(0x15)],_0xf9601d['FFVOW'])?(_0x2a0ad1=await getUserAuthHeaders(),console[_0x5313(0xc)](_0xf9601d[_0x5313(0x16)])):_0x2d639d=_0xf9601d[_0x5313(0x17)](_0x34ca3f);}catch(_0x21b054){console[_0x5313(0x18)]('⚠️\x20[LINKEDIN\x20SCRAPE]\x20No\x20user\x20auth\x20available,\x20using\x20basic\x20headers:',_0x21b054),_0x2a0ad1=_0xf9601d[_0x5313(0x17)](getApiHeaders);}const _0x38a27e=await fetch(API_CONFIG[_0x5313(0x19)]+'/enoch/linkedin-scrape/scrape-profile',{'method':'POST','headers':_0x2a0ad1,'body':JSON[_0x5313(0x1a)]({'userId':_0x3a2879,'profileUrl':_0x198dbf})});if(!_0x38a27e['ok']){if(_0x5313(0x1b)===_0xf9601d[_0x5313(0x1c)]){const _0x4bf8b0=await _0x38a27e[_0x5313(0x1d)]();console[_0x5313(0x1e)](_0xf9601d['skmaU'],_0x38a27e[_0x5313(0x1f)],_0x4bf8b0);let _0x144f8f=_0x5313(0x20)+_0x38a27e[_0x5313(0x1f)];try{if(_0xf9601d[_0x5313(0x21)](_0xf9601d[_0x5313(0x22)],_0xf9601d[_0x5313(0x22)])){const _0x28b78b=JSON[_0x5313(0x23)](_0x4bf8b0);_0x144f8f=_0x28b78b[_0x5313(0x1e)]||_0x28b78b['message']||_0x144f8f;}else return _0x304529[_0x5313(0x1e)](_0xf9601d[_0x5313(0x24)],_0x39b344),{'success':![],'error':_0xf9601d[_0x5313(0x25)](_0x4f8239,_0x823334)?_0x5c0cb0['message']:_0xf9601d[_0x5313(0x26)]};}catch{}return{'success':![],'error':_0x144f8f};}else return _0x2430bb;}const _0x13a48a=await _0x38a27e[_0x5313(0x27)]();return console[_0x5313(0xc)]('✅\x20[LINKEDIN\x20SCRAPE]\x20Profile\x20scraped\x20successfully'),console[_0x5313(0xc)]('📊\x20[LINKEDIN\x20SCRAPE]\x20Data\x20preview:',{'name':_0xf9601d['CGBtd'](_0x3a2636=_0x13a48a['profileData'],null)||_0xf9601d['buNTP'](_0x3a2636,void 0x0)?void 0x0:_0x3a2636['fullName'],'headline':_0xf9601d[_0x5313(0x28)](_0x3f1c8f=_0x13a48a[_0x5313(0x29)],null)||_0xf9601d[_0x5313(0x2a)](_0x3f1c8f,void 0x0)?void 0x0:_0x3f1c8f[_0x5313(0x2b)],'experienceCount':(_0xf9601d[_0x5313(0x2c)](_0x29b987=_0x13a48a[_0x5313(0x29)],null)||_0xf9601d[_0x5313(0x21)](_0x29b987,void 0x0)||_0xf9601d[_0x5313(0x2a)](_0x29b987=_0x29b987[_0x5313(0x2d)],null)||_0xf9601d['eNuEu'](_0x29b987,void 0x0)?void 0x0:_0x29b987[_0x5313(0x2e)])||0x0,'educationCount':(_0xf9601d['lMnEl'](_0x5a9479=_0x13a48a['profileData'],null)||_0xf9601d[_0x5313(0x2f)](_0x5a9479,void 0x0)||_0xf9601d['CGBtd'](_0x5a9479=_0x5a9479[_0x5313(0x30)],null)||_0xf9601d[_0x5313(0x31)](_0x5a9479,void 0x0)?void 0x0:_0x5a9479[_0x5313(0x2e)])||0x0,'skillsCount':((_0x576b24=_0x13a48a[_0x5313(0x29)])===null||_0xf9601d[_0x5313(0x32)](_0x576b24,void 0x0)||_0xf9601d[_0x5313(0x33)](_0x576b24=_0x576b24[_0x5313(0x34)],null)||_0xf9601d[_0x5313(0x2a)](_0x576b24,void 0x0)?void 0x0:_0x576b24[_0x5313(0x2e)])||0x0}),{'success':!![],'data':_0x13a48a['profileData'],'message':_0xf9601d[_0x5313(0x35)]};}catch(_0x4a76ac){if(_0xf9601d[_0x5313(0x14)](_0x5313(0x36),_0xf9601d[_0x5313(0x37)]))return console['error'](_0xf9601d['PQxHk'],_0x4a76ac),{'success':![],'error':_0xf9601d[_0x5313(0x25)](_0x4a76ac,Error)?_0x4a76ac[_0x5313(0x38)]:_0xf9601d[_0x5313(0x26)]};else{const _0x3311c2=_0x38076e['parse'](_0x51471c);_0x2653d2=_0x3311c2[_0x5313(0x1e)]||_0x3311c2[_0x5313(0x38)]||_0x57f754;}}};export const extractLinkedInUsername=_0x418ac8=>{const _0x2c5acb={'bsVXM':function(_0xe526c0,_0x1bb965){return _0xe526c0!==_0x1bb965;},'MNpqd':_0x5313(0x39),'xUznD':function(_0x108b31,_0xa4d956){return _0x108b31===_0xa4d956;},'BeFpu':_0x5313(0x3a),'VdsGF':_0x5313(0x3b)};try{if(_0x2c5acb['bsVXM'](_0x2c5acb[_0x5313(0x3c)],_0x2c5acb[_0x5313(0x3c)]))return _0x5313(0x3d)+_0x34dfa4;else{const _0x312f96=_0x418ac8[_0x5313(0x3e)](/linkedin\.com\/in\/([^\/\?#]+)/);return _0x312f96?_0x312f96[0x1]:null;}}catch(_0x1de817){return _0x2c5acb['xUznD'](_0x2c5acb['BeFpu'],_0x2c5acb[_0x5313(0x3f)])?(console[_0x5313(0x1e)](_0x2c5acb[_0x5313(0x40)],_0x1de817),null):'https://'+_0x3efa2e;}};export const isValidLinkedInUrl=_0x1e2431=>{const _0x1e6f0f={'cHRIT':function(_0x2ec959,_0x1b4e3f){return _0x2ec959!==_0x1b4e3f;},'DjQou':'DjZwT','rlqKk':function(_0x1b4316,_0x316dcd){return _0x1b4316!==_0x316dcd;},'ZvxCH':'SRlIC','VvIoG':function(_0x36a367,_0x113523){return _0x36a367(_0x113523);},'VpEaf':function(_0x5579db,_0x536969){return _0x5579db!==_0x536969;},'jwBAt':function(_0x547257,_0x32b383){return _0x547257>_0x32b383;}};if(!_0x1e2431||_0x1e6f0f['cHRIT'](typeof _0x1e2431,_0x5313(0x41)))return _0x1e6f0f[_0x5313(0x42)](_0x1e6f0f[_0x5313(0x43)],'JyYIH')?![]:![];const _0x117b96=/linkedin\.com\/in\/[^\/\?#]+/[_0x5313(0x44)](_0x1e2431);if(!_0x117b96)return _0x1e6f0f[_0x5313(0x45)](_0x1e6f0f[_0x5313(0x46)],_0x1e6f0f['ZvxCH'])?(_0x6faf4d[_0x5313(0x1e)](_0x5313(0x47),_0xe99db4),{'connected':![]}):![];const _0x5ba5af=_0x1e6f0f[_0x5313(0x48)](extractLinkedInUsername,_0x1e2431);return _0x1e6f0f['VpEaf'](_0x5ba5af,null)&&_0x1e6f0f[_0x5313(0x49)](_0x5ba5af[_0x5313(0x2e)],0x0);};export const formatLinkedInUrl=_0x34c974=>{const _0x500aa2={'hmMTm':_0x5313(0x5),'cZyBw':_0x5313(0x4a),'shjNi':_0x5313(0x4b),'fbJDe':_0x5313(0x4c),'dERAb':function(_0x1a74bf,_0x5ffea2){return _0x1a74bf!==_0x5ffea2;},'BuvXp':_0x5313(0x4d),'mUEpN':'linkedin.com/in/','GRYLX':function(_0xc787b4,_0x2c38b5){return _0xc787b4===_0x2c38b5;},'tdxDd':_0x5313(0x4e),'FsjEx':_0x5313(0x4f),'LZwTc':'/in/'};if(_0x34c974[_0x5313(0x50)](_0x500aa2[_0x5313(0x51)])||_0x34c974[_0x5313(0x50)](_0x500aa2[_0x5313(0x52)]))return _0x34c974;if(!_0x34c974[_0x5313(0x53)]('/'))return _0x500aa2[_0x5313(0x54)](_0x500aa2[_0x5313(0x55)],_0x500aa2[_0x5313(0x55)])?(_0x40066c[_0x5313(0x1e)](_0x500aa2[_0x5313(0x56)]),{'success':![],'error':_0x500aa2['cZyBw']}):_0x5313(0x57)+_0x34c974;if(_0x34c974[_0x5313(0x50)](_0x500aa2['mUEpN']))return _0x500aa2[_0x5313(0x58)](_0x500aa2['tdxDd'],_0x500aa2[_0x5313(0x59)])?![]:_0x5313(0x4c)+_0x34c974;if(_0x34c974['startsWith'](_0x500aa2[_0x5313(0x5a)]))return _0x5313(0x3d)+_0x34c974;return _0x5313(0x57)+_0x34c974;};export const canScrapeProfile=async _0x3b7919=>{const _0x29a90c={'xnwuw':function(_0x57ce3d){return _0x57ce3d();},'sraVy':function(_0x1d652f,_0x171224,_0x1faa27){return _0x1d652f(_0x171224,_0x1faa27);},'YZqzB':function(_0x7942cf,_0x4d400d){return _0x7942cf!==_0x4d400d;},'gghpQ':function(_0x2570ea,_0x276868){return _0x2570ea===_0x276868;},'CynFN':_0x5313(0x5b)};try{let _0x3d11c9;try{_0x3d11c9=await getUserAuthHeaders();}catch{_0x3d11c9=_0x29a90c['xnwuw'](getApiHeaders);}const _0x387937=await _0x29a90c['sraVy'](fetch,API_CONFIG['BASE_URL']+_0x5313(0x5c)+_0x3b7919+_0x5313(0x5d),{'headers':_0x3d11c9});if(_0x387937['ok']){var _0x2bfaa5;const _0x462972=await _0x387937[_0x5313(0x27)]();return _0x29a90c[_0x5313(0x5e)](_0x29a90c[_0x5313(0x5f)](_0x2bfaa5=_0x462972[_0x5313(0x60)],null)||_0x2bfaa5===void 0x0?void 0x0:_0x2bfaa5[_0x5313(0x61)],undefined);}return![];}catch(_0x4e12ca){return console[_0x5313(0x1e)](_0x29a90c[_0x5313(0x62)],_0x4e12ca),![];}};export const getLinkedInConnectionStatus=async _0x1fd126=>{const _0x1850a0={'WGjpD':_0x5313(0x3b),'iqMMb':function(_0xdb3391,_0x1aee30){return _0xdb3391===_0x1aee30;},'DPLpx':_0x5313(0x63),'savoe':_0x5313(0x64),'fGlHS':function(_0x1c3f5d){return _0x1c3f5d();},'FlHGs':function(_0x39cbec,_0x13bfbb,_0x47c88e){return _0x39cbec(_0x13bfbb,_0x47c88e);},'JMMXJ':'❌\x20[LINKEDIN]\x20Error\x20getting\x20connection\x20status:'};try{let _0x37a6a7;try{if(_0x1850a0[_0x5313(0x65)](_0x5313(0x66),_0x1850a0[_0x5313(0x67)]))return _0x586336[_0x5313(0x1e)](_0x1850a0[_0x5313(0x68)],_0xe9fe0e),null;else _0x37a6a7=await getUserAuthHeaders();}catch{if(_0x1850a0[_0x5313(0x69)]===_0x5313(0x64))_0x37a6a7=_0x1850a0[_0x5313(0x6a)](getApiHeaders);else try{const _0xffb32c=_0x5696cf[_0x5313(0x3e)](/linkedin\.com\/in\/([^\/\?#]+)/);return _0xffb32c?_0xffb32c[0x1]:null;}catch(_0x438178){return _0x5e76a8['error'](_0x1850a0['WGjpD'],_0x438178),null;}}const _0x294174=await _0x1850a0[_0x5313(0x6b)](fetch,API_CONFIG[_0x5313(0x19)]+_0x5313(0x6c)+_0x1fd126,{'headers':_0x37a6a7});if(_0x294174['ok']){const _0x1a2c53=await _0x294174[_0x5313(0x27)]();return _0x1a2c53;}return{'connected':![]};}catch(_0x46c729){return console['error'](_0x1850a0[_0x5313(0x6d)],_0x46c729),{'connected':![]};}};
1
+ /**
2
+ * LinkedIn Profile Scraping Service
3
+ * Handles profile scraping after OAuth connection using Apify
4
+ */
5
+
6
+ import { getUserAuthHeaders, getApiHeaders } from '../config/api';
7
+ import { API_CONFIG } from '../config/api';
8
+ import { getUserIdFromToken } from './jwtStorageService';
9
+ /**
10
+ * Scrape LinkedIn profile after OAuth connection
11
+ * @param userId - User ID (username or email) - will be overridden by JWT userId if available
12
+ * @param profileUrl - LinkedIn profile URL (e.g., https://linkedin.com/in/username)
13
+ */
14
+ export const scrapeLinkedInProfile = async (userId, profileUrl) => {
15
+ try {
16
+ var _data$profileData, _data$profileData2, _data$profileData3, _data$profileData4, _data$profileData5;
17
+ console.log('🔍 [LINKEDIN SCRAPE] Starting profile scrape...');
18
+ console.log('🔍 [LINKEDIN SCRAPE] Passed User ID:', userId);
19
+ console.log('🔍 [LINKEDIN SCRAPE] Profile URL:', profileUrl);
20
+
21
+ // Get the actual userId (UUID) from JWT token - this is critical for correct user lookup
22
+ const jwtUserId = await getUserIdFromToken();
23
+ const effectiveUserId = jwtUserId || userId;
24
+ console.log('🔍 [LINKEDIN SCRAPE] JWT userId:', jwtUserId);
25
+ console.log('🔍 [LINKEDIN SCRAPE] Effective userId (will use):', effectiveUserId);
26
+
27
+ // Validate profile URL
28
+ if (!isValidLinkedInUrl(profileUrl)) {
29
+ console.error('❌ [LINKEDIN SCRAPE] Invalid LinkedIn URL');
30
+ return {
31
+ success: false,
32
+ error: 'Invalid LinkedIn profile URL. Please use format: https://linkedin.com/in/username'
33
+ };
34
+ }
35
+
36
+ // Get user-authenticated headers (includes JWT token)
37
+ let headers;
38
+ try {
39
+ headers = await getUserAuthHeaders();
40
+ console.log('🔑 [LINKEDIN SCRAPE] Using authenticated user headers');
41
+ } catch (authError) {
42
+ console.warn('⚠️ [LINKEDIN SCRAPE] No user auth available, using basic headers:', authError);
43
+ headers = getApiHeaders();
44
+ }
45
+ const response = await fetch(`${API_CONFIG.BASE_URL}/enoch/linkedin-scrape/scrape-profile`, {
46
+ method: 'POST',
47
+ headers,
48
+ body: JSON.stringify({
49
+ userId: effectiveUserId,
50
+ profileUrl: profileUrl
51
+ })
52
+ });
53
+ if (!response.ok) {
54
+ const errorText = await response.text();
55
+ console.error('❌ [LINKEDIN SCRAPE] Failed:', response.status, errorText);
56
+
57
+ // Parse error message if available
58
+ let errorMessage = `Scraping failed: ${response.status}`;
59
+ try {
60
+ const errorData = JSON.parse(errorText);
61
+ errorMessage = errorData.error || errorData.message || errorMessage;
62
+ } catch {
63
+ // Use default error message
64
+ }
65
+ return {
66
+ success: false,
67
+ error: errorMessage
68
+ };
69
+ }
70
+ const data = await response.json();
71
+ console.log('✅ [LINKEDIN SCRAPE] Profile scraped successfully');
72
+ console.log('📊 [LINKEDIN SCRAPE] Data preview:', {
73
+ name: (_data$profileData = data.profileData) === null || _data$profileData === void 0 ? void 0 : _data$profileData.fullName,
74
+ headline: (_data$profileData2 = data.profileData) === null || _data$profileData2 === void 0 ? void 0 : _data$profileData2.headline,
75
+ experienceCount: ((_data$profileData3 = data.profileData) === null || _data$profileData3 === void 0 || (_data$profileData3 = _data$profileData3.experience) === null || _data$profileData3 === void 0 ? void 0 : _data$profileData3.length) || 0,
76
+ educationCount: ((_data$profileData4 = data.profileData) === null || _data$profileData4 === void 0 || (_data$profileData4 = _data$profileData4.education) === null || _data$profileData4 === void 0 ? void 0 : _data$profileData4.length) || 0,
77
+ skillsCount: ((_data$profileData5 = data.profileData) === null || _data$profileData5 === void 0 || (_data$profileData5 = _data$profileData5.skills) === null || _data$profileData5 === void 0 ? void 0 : _data$profileData5.length) || 0
78
+ });
79
+ return {
80
+ success: true,
81
+ data: data.profileData,
82
+ message: 'Profile scraped successfully'
83
+ };
84
+ } catch (error) {
85
+ console.error('❌ [LINKEDIN SCRAPE] Error:', error);
86
+ return {
87
+ success: false,
88
+ error: error instanceof Error ? error.message : 'Unknown error occurred during scraping'
89
+ };
90
+ }
91
+ };
92
+
93
+ /**
94
+ * Extract LinkedIn username from profile URL
95
+ * @param url - LinkedIn profile URL
96
+ * @returns username or null if invalid
97
+ */
98
+ export const extractLinkedInUsername = url => {
99
+ try {
100
+ // Match various LinkedIn URL formats:
101
+ // - https://linkedin.com/in/username
102
+ // - https://www.linkedin.com/in/username/
103
+ // - linkedin.com/in/username
104
+ const match = url.match(/linkedin\.com\/in\/([^\/\?#]+)/);
105
+ return match ? match[1] : null;
106
+ } catch (error) {
107
+ console.error('❌ [LINKEDIN] Error extracting username:', error);
108
+ return null;
109
+ }
110
+ };
111
+
112
+ /**
113
+ * Validate LinkedIn profile URL
114
+ * @param url - URL to validate
115
+ * @returns true if valid LinkedIn profile URL
116
+ */
117
+ export const isValidLinkedInUrl = url => {
118
+ if (!url || typeof url !== 'string') {
119
+ return false;
120
+ }
121
+
122
+ // Check if URL contains linkedin.com/in/
123
+ const hasLinkedInPattern = /linkedin\.com\/in\/[^\/\?#]+/.test(url);
124
+ if (!hasLinkedInPattern) {
125
+ return false;
126
+ }
127
+
128
+ // Try to extract username
129
+ const username = extractLinkedInUsername(url);
130
+ return username !== null && username.length > 0;
131
+ };
132
+
133
+ /**
134
+ * Format LinkedIn URL (ensure proper format)
135
+ * @param url - URL or username
136
+ * @returns properly formatted LinkedIn URL
137
+ */
138
+ export const formatLinkedInUrl = url => {
139
+ // If it's already a full URL, return as is
140
+ if (url.startsWith('http://') || url.startsWith('https://')) {
141
+ return url;
142
+ }
143
+
144
+ // If it's just a username, construct URL
145
+ if (!url.includes('/')) {
146
+ return `https://linkedin.com/in/${url}`;
147
+ }
148
+
149
+ // If it's a partial path
150
+ if (url.startsWith('linkedin.com/in/')) {
151
+ return `https://${url}`;
152
+ }
153
+ if (url.startsWith('/in/')) {
154
+ return `https://linkedin.com${url}`;
155
+ }
156
+
157
+ // Default: assume it's a username
158
+ return `https://linkedin.com/in/${url}`;
159
+ };
160
+
161
+ /**
162
+ * Check if profile scraping is available for a user
163
+ * @param userId - User ID
164
+ */
165
+ export const canScrapeProfile = async userId => {
166
+ try {
167
+ // Check if user has LinkedIn connected
168
+ // This would typically query your backend
169
+ let headers;
170
+ try {
171
+ headers = await getUserAuthHeaders();
172
+ } catch {
173
+ headers = getApiHeaders();
174
+ }
175
+ const response = await fetch(`${API_CONFIG.BASE_URL}/user/${userId}/connections`, {
176
+ headers
177
+ });
178
+ if (response.ok) {
179
+ var _data$connections;
180
+ const data = await response.json();
181
+ return ((_data$connections = data.connections) === null || _data$connections === void 0 ? void 0 : _data$connections.LinkedIn) !== undefined;
182
+ }
183
+ return false;
184
+ } catch (error) {
185
+ console.error('❌ [LINKEDIN] Error checking scrape availability:', error);
186
+ return false;
187
+ }
188
+ };
189
+
190
+ /**
191
+ * Get LinkedIn connection status for a user
192
+ * @param userId - User ID
193
+ */
194
+ export const getLinkedInConnectionStatus = async userId => {
195
+ try {
196
+ let headers;
197
+ try {
198
+ headers = await getUserAuthHeaders();
199
+ } catch {
200
+ headers = getApiHeaders();
201
+ }
202
+ const response = await fetch(`${API_CONFIG.BASE_URL}/enoch/linkedin-scrape/scrape-profile/${userId}`, {
203
+ headers
204
+ });
205
+ if (response.ok) {
206
+ const data = await response.json();
207
+ return data;
208
+ }
209
+ return {
210
+ connected: false
211
+ };
212
+ } catch (error) {
213
+ console.error('❌ [LINKEDIN] Error getting connection status:', error);
214
+ return {
215
+ connected: false
216
+ };
217
+ }
218
+ };
219
+ //# sourceMappingURL=linkedinScrapingService.js.map
@@ -1 +1,277 @@
1
- import AsyncStorage from'@react-native-async-storage/async-storage';function _0x2847(){const _0x846f0b=['@onairos:llm_data','@onairos:llm_metadata','❌\x20Failed\x20to\x20retrieve\x20LLM\x20metadata:','yjmHM','connected','oBYFm','error','uSKGP','💾\x20Storing\x20LLM\x20data\x20locally\x20(temporary)...','setItem','userId','stringify','email','appName','timestamp','data','log','📊\x20Data\x20size:\x20','dataSize','\x20bytes','WSyZk','yXgQw','JvzgG','ℹ️\x20No\x20LLM\x20data\x20found\x20for\x20user:','❌\x20Failed\x20to\x20retrieve\x20LLM\x20data:','JvgJf','XZgkv','❌\x20Failed\x20to\x20store\x20LLM\x20data:','getItem','bCovh','yrLwE','ezqId','jtxll','parse','cncKc','REWfG','❌\x20Failed\x20to\x20request\x20LLM\x20data\x20from\x20backend:','⚠️\x20No\x20LLM\x20metadata\x20found\x20for\x20user:','jqIFl','VMlez','❌\x20Failed\x20to\x20update\x20LLM\x20status:','EqKGK','VycsX','yOHoa','message','Unknown\x20error','connectionStatus','✅\x20Updated\x20LLM\x20status\x20to:\x20','jSfPi','jEXMX','warn','gGfej','ZfviI','removeItem','dbhSA','XWqWT','llm','chatgpt','entries','map','includes','cHgjQ','length','1.0','rszXW','HEPbi','conversations','chatHistory','customData','LiMtK','❌\x20Failed\x20to\x20clear\x20LLM\x20data:','📡\x20Sending\x20LLM\x20data\x20to\x20backend\x20for\x20processing...','LEQcs','❌\x20Backend\x20data\x20ingestion\x20failed:','vMMRw','❌\x20Failed\x20to\x20send\x20data\x20to\x20backend:','IxYsV','sCIVZ','BASE_URL','/llmdata','csdos','Tdydd','toISOString','tokenExpiry','VnmGo','json','ohzuT','❌\x20Failed\x20to\x20get\x20LLM\x20data\x20keys:','status','Backend\x20error:\x20','imTVD','cFIOY','qNCKn','✅\x20Backend\x20processing\x20LLM\x20data\x20request:','DCtgn','❌\x20Failed\x20to\x20request\x20LLM\x20data:','VJfop','/llmdata/request','apiUrl','xjwQS','LNGzq','text','filter','cyMoq','qMsow','KHydu','BYqTq','veaDB','yJJii','preferences','startsWith','PIYOi'];_0x2847=function(){return _0x846f0b;};return _0x2847();}import{API_CONFIG}from'../config/api';const LLM_DATA_STORAGE_KEY=_0x4604(0x0),LLM_METADATA_STORAGE_KEY=_0x4604(0x1);export const storeLLMData=async _0x2e54ef=>{const _0x1fe7a8={'uSKGP':_0x4604(0x2),'aDXwV':function(_0x53ed4a,_0x2f1eb9){return _0x53ed4a!==_0x2f1eb9;},'oBYFm':_0x4604(0x3),'JdZVW':_0x4604(0x4),'WSyZk':'❌\x20Failed\x20to\x20store\x20LLM\x20data:'};try{if(_0x1fe7a8['aDXwV'](_0x1fe7a8[_0x4604(0x5)],_0x1fe7a8['oBYFm']))return _0x22bf77[_0x4604(0x6)](_0x1fe7a8[_0x4604(0x7)],_0xaf5e24),null;else{console['log'](_0x4604(0x8)),await AsyncStorage[_0x4604(0x9)](LLM_DATA_STORAGE_KEY+':'+_0x2e54ef[_0x4604(0xa)],JSON[_0x4604(0xb)](_0x2e54ef));const _0x49d813={'userId':_0x2e54ef['userId'],'email':_0x2e54ef[_0x4604(0xc)],'appName':_0x2e54ef[_0x4604(0xd)],'timestamp':_0x2e54ef[_0x4604(0xe)],'hasData':!![],'dataSize':JSON[_0x4604(0xb)](_0x2e54ef[_0x4604(0xf)])['length'],'connectionStatus':_0x1fe7a8['JdZVW']};return await AsyncStorage[_0x4604(0x9)](LLM_METADATA_STORAGE_KEY+':'+_0x2e54ef['userId'],JSON[_0x4604(0xb)](_0x49d813)),console[_0x4604(0x10)]('✅\x20LLM\x20data\x20stored\x20locally\x20successfully'),console['log'](_0x4604(0x11)+_0x49d813[_0x4604(0x12)]+_0x4604(0x13)),!![];}}catch(_0x744bc5){return console[_0x4604(0x6)](_0x1fe7a8[_0x4604(0x14)],_0x744bc5),![];}};export const getLLMData=async _0x2e0ec1=>{const _0x377d00={'bCovh':function(_0x223448,_0x22873a){return _0x223448===_0x22873a;},'XZgkv':_0x4604(0x15),'ezqId':_0x4604(0x16),'jtxll':_0x4604(0x17),'cncKc':'✅\x20Retrieved\x20LLM\x20data\x20for\x20user:','REWfG':_0x4604(0x18)};try{if(_0x377d00['bCovh'](_0x4604(0x19),_0x377d00[_0x4604(0x1a)]))return _0x19005f[_0x4604(0x6)](_0x4604(0x1b),_0x498fb3),![];else{const _0x44ddda=await AsyncStorage[_0x4604(0x1c)](LLM_DATA_STORAGE_KEY+':'+_0x2e0ec1);if(!_0x44ddda)return _0x377d00[_0x4604(0x1d)](_0x4604(0x1e),_0x377d00[_0x4604(0x1f)])?(_0x23f725[_0x4604(0x6)](_0x4604(0x18),_0xd2b0e),null):(console[_0x4604(0x10)](_0x377d00[_0x4604(0x20)],_0x2e0ec1),null);const _0x32bce9=JSON[_0x4604(0x21)](_0x44ddda);return console[_0x4604(0x10)](_0x377d00[_0x4604(0x22)],_0x2e0ec1),_0x32bce9;}}catch(_0x4ee7a6){return console[_0x4604(0x6)](_0x377d00[_0x4604(0x23)],_0x4ee7a6),null;}};export const getLLMMetadata=async _0x8a9c6c=>{const _0x2c4d9d={'fCKDd':_0x4604(0x2)};try{const _0x585844=await AsyncStorage[_0x4604(0x1c)](LLM_METADATA_STORAGE_KEY+':'+_0x8a9c6c);if(!_0x585844)return null;return JSON[_0x4604(0x21)](_0x585844);}catch(_0x2fa18b){return console['error'](_0x2c4d9d['fCKDd'],_0x2fa18b),null;}};export const updateLLMStatus=async(_0xf7868a,_0x2406d3)=>{const _0x1b931e={'VycsX':_0x4604(0x24),'yOHoa':function(_0x4c684c,_0x296787){return _0x4c684c instanceof _0x296787;},'gGfej':_0x4604(0x25),'EqKGK':_0x4604(0x26),'aWnkl':function(_0x936716,_0x2d9862){return _0x936716===_0x2d9862;},'jSfPi':_0x4604(0x27),'ZfviI':_0x4604(0x28)};try{const _0x38c82a=await getLLMMetadata(_0xf7868a);if(!_0x38c82a)return _0x1b931e['EqKGK']===_0x1b931e[_0x4604(0x29)]?(console['warn'](_0x1b931e['gGfej'],_0xf7868a),![]):(_0x3f9432[_0x4604(0x6)](_0x1b931e[_0x4604(0x2a)],_0x5f57c0),{'success':![],'message':_0x1b931e[_0x4604(0x2b)](_0x9c7068,_0x518e0c)?_0x38d13f[_0x4604(0x2c)]:_0x4604(0x2d)});return _0x38c82a[_0x4604(0x2e)]=_0x2406d3,await AsyncStorage[_0x4604(0x9)](LLM_METADATA_STORAGE_KEY+':'+_0xf7868a,JSON[_0x4604(0xb)](_0x38c82a)),console['log'](_0x4604(0x2f)+_0x2406d3),!![];}catch(_0x1daaeb){return _0x1b931e['aWnkl'](_0x1b931e[_0x4604(0x30)],_0x4604(0x31))?(_0x4338de[_0x4604(0x32)](_0x1b931e[_0x4604(0x33)],_0x23565e),![]):(console[_0x4604(0x6)](_0x1b931e[_0x4604(0x34)],_0x1daaeb),![]);}};function _0x4604(_0x284767,_0x460426){_0x284767=_0x284767-0x0;const _0x2e5053=_0x2847();let _0x2284c3=_0x2e5053[_0x284767];return _0x2284c3;}export const clearLLMData=async _0x48994a=>{const _0x4da23a={'dbhSA':'✅\x20LLM\x20data\x20cleared\x20for\x20user:','XWqWT':'❌\x20Failed\x20to\x20clear\x20LLM\x20data:'};try{return await AsyncStorage['removeItem'](LLM_DATA_STORAGE_KEY+':'+_0x48994a),await AsyncStorage[_0x4604(0x35)](LLM_METADATA_STORAGE_KEY+':'+_0x48994a),console[_0x4604(0x10)](_0x4da23a[_0x4604(0x36)],_0x48994a),!![];}catch(_0xc11b99){return console[_0x4604(0x6)](_0x4da23a[_0x4604(0x37)],_0xc11b99),![];}};export const hasOnlyLLMConnection=_0xcfc321=>{const _0x4561f4={'cHgjQ':_0x4604(0x38),'MiztU':_0x4604(0x39),'PusWL':function(_0x315a54,_0x271ef1){return _0x315a54===_0x271ef1;}},_0x2c705d=Object[_0x4604(0x3a)](_0xcfc321)['filter'](([_0x1173b5,_0x1ce617])=>_0x1ce617)[_0x4604(0x3b)](([_0x39afc4,_0x1bd1fc])=>_0x39afc4),_0x4b7c17=_0x2c705d[_0x4604(0x3c)](_0x4561f4[_0x4604(0x3d)])||_0x2c705d[_0x4604(0x3c)](_0x4561f4['MiztU']),_0x21b664=_0x4561f4['PusWL'](_0x2c705d[_0x4604(0x3e)],0x1)&&_0x4b7c17;return console['log']('🔍\x20Platform\x20connection\x20check:',{'connectedPlatforms':_0x2c705d,'hasLLM':_0x4b7c17,'onlyLLM':_0x21b664}),_0x21b664;};export const formatLLMDataForDeveloper=_0x2cca04=>{const _0x3511f5={'rszXW':_0x4604(0x38),'HEPbi':_0x4604(0x39),'LiMtK':_0x4604(0x3f)};return{'platform':_0x3511f5[_0x4604(0x40)],'userId':_0x2cca04[_0x4604(0xa)],'email':_0x2cca04[_0x4604(0xc)],'timestamp':_0x2cca04['timestamp'],'data':{'type':_0x3511f5[_0x4604(0x41)],'conversations':_0x2cca04[_0x4604(0xf)][_0x4604(0x42)]||[],'chatHistory':_0x2cca04[_0x4604(0xf)][_0x4604(0x43)]||[],'preferences':_0x2cca04[_0x4604(0xf)]['preferences']||{},'customData':_0x2cca04[_0x4604(0xf)][_0x4604(0x44)]||{}},'metadata':{'appName':_0x2cca04[_0x4604(0xd)],'collectedAt':new Date(_0x2cca04[_0x4604(0xe)])['toISOString'](),'dataVersion':_0x3511f5[_0x4604(0x45)]}};};export const sendLLMDataToBackend=async(_0x3d3621,_0x162f94)=>{const _0x5ed162={'KKghp':_0x4604(0x46),'IxYsV':_0x4604(0x47),'sCIVZ':function(_0x3261cc,_0x29e32c,_0x2cfc09){return _0x3261cc(_0x29e32c,_0x2cfc09);},'csdos':function(_0x49c805,_0x273369){return _0x49c805&&_0x273369;},'Tdydd':_0x4604(0x38),'bHyIO':_0x4604(0x39),'VnmGo':_0x4604(0x3f),'DrDUU':_0x4604(0x48),'ohzuT':'✅\x20Backend\x20received\x20and\x20stored\x20LLM\x20data:','evDWF':_0x4604(0x49),'imTVD':_0x4604(0x4a),'cFIOY':'OXsdt','xVNJL':_0x4604(0x4b),'FwnXD':function(_0x4b7b32,_0x15839d){return _0x4b7b32 instanceof _0x15839d;},'qNCKn':_0x4604(0x2d)};try{console[_0x4604(0x10)](_0x5ed162[_0x4604(0x4c)]);const _0x4746b4=await _0x5ed162[_0x4604(0x4d)](fetch,API_CONFIG[_0x4604(0x4e)]+_0x4604(0x4f),{'method':'POST','headers':{'Content-Type':'application/json',..._0x5ed162[_0x4604(0x50)](_0x162f94,{'Authorization':'Bearer\x20'+_0x162f94})},'body':JSON[_0x4604(0xb)]({'userId':_0x3d3621[_0x4604(0xa)],'email':_0x3d3621[_0x4604(0xc)],'appName':_0x3d3621[_0x4604(0xd)],'platform':_0x5ed162[_0x4604(0x51)],'connectionType':_0x5ed162['bHyIO'],'timestamp':new Date()[_0x4604(0x52)](),'data':_0x3d3621[_0x4604(0xf)],'accessToken':_0x3d3621['accessToken'],'refreshToken':_0x3d3621['refreshToken'],'tokenExpiry':_0x3d3621[_0x4604(0x53)],'metadata':{'collectedAt':new Date(_0x3d3621[_0x4604(0xe)])[_0x4604(0x52)](),'dataVersion':_0x5ed162[_0x4604(0x54)]}})});if(_0x4746b4['ok']){if(_0x5ed162['DrDUU']===_0x4604(0x48)){const _0x3b05bc=await _0x4746b4[_0x4604(0x55)]();return console[_0x4604(0x10)](_0x5ed162[_0x4604(0x56)],_0x3b05bc),{'success':!![],'message':_0x3b05bc[_0x4604(0x2c)],'connectionId':_0x3b05bc['connectionId']};}else return _0x403470[_0x4604(0x6)](_0x4604(0x57),_0x3afcf7),[];}else{const _0x5ed088=await _0x4746b4['text']();return console[_0x4604(0x6)](_0x5ed162['evDWF'],_0x4746b4[_0x4604(0x58)],_0x5ed088),{'success':![],'message':_0x4604(0x59)+_0x4746b4['status']};}}catch(_0x58481f){return _0x5ed162[_0x4604(0x5a)]!==_0x5ed162[_0x4604(0x5b)]?(console[_0x4604(0x6)](_0x5ed162['xVNJL'],_0x58481f),{'success':![],'message':_0x5ed162['FwnXD'](_0x58481f,Error)?_0x58481f[_0x4604(0x2c)]:_0x5ed162[_0x4604(0x5c)]}):(_0x3ec039[_0x4604(0x6)](_0x5ed162['KKghp'],_0x3eef2f),![]);}};export const requestLLMDataForDeveloper=async(_0x4c58f6,_0x3d1851,_0x228568,_0x34f252,_0x28f6aa)=>{const _0x13bdfd={'cyMoq':_0x4604(0x39),'FEueu':function(_0x3e764a,_0x42060e){return _0x3e764a===_0x42060e;},'VJfop':'📤\x20Requesting\x20backend\x20to\x20send\x20LLM\x20data\x20to\x20developer...','NlUdD':function(_0x4fea64,_0x1e079c,_0x5460b4){return _0x4fea64(_0x1e079c,_0x5460b4);},'vCGRR':_0x4604(0x5d),'xjwQS':function(_0x276ed7,_0x5f7f0c){return _0x276ed7!==_0x5f7f0c;},'UFQSZ':_0x4604(0x5e),'ZZuNu':_0x4604(0x5f),'qMsow':'❌\x20Failed\x20to\x20request\x20LLM\x20data\x20from\x20backend:','WVfma':function(_0x49d820,_0x1810e6){return _0x49d820 instanceof _0x1810e6;},'yCXYm':_0x4604(0x2d)};try{console[_0x4604(0x10)](_0x13bdfd[_0x4604(0x60)]);const _0x12bdeb=await _0x13bdfd['NlUdD'](fetch,API_CONFIG[_0x4604(0x4e)]+_0x4604(0x61),{'method':'POST','headers':{'Content-Type':'application/json','Authorization':'Bearer\x20'+_0x28f6aa},'body':JSON['stringify']({'userId':_0x4c58f6,'email':_0x3d1851,'appName':_0x228568,'requestedData':_0x34f252,'timestamp':new Date()[_0x4604(0x52)]()})});if(_0x12bdeb['ok']){const _0x54f7b6=await _0x12bdeb[_0x4604(0x55)]();return console[_0x4604(0x10)](_0x13bdfd['vCGRR'],_0x54f7b6),{'success':!![],'message':_0x54f7b6['message'],'apiUrl':_0x54f7b6[_0x4604(0x62)],'token':_0x54f7b6['token']};}else{if(_0x13bdfd[_0x4604(0x63)](_0x13bdfd['UFQSZ'],_0x4604(0x64))){const _0x43ba6c=await _0x12bdeb[_0x4604(0x65)]();return console[_0x4604(0x6)](_0x13bdfd['ZZuNu'],_0x12bdeb['status'],_0x43ba6c),{'success':![],'message':'Backend\x20error:\x20'+_0x12bdeb[_0x4604(0x58)]};}else{const _0x2ca622=_0x8475b6[_0x4604(0x3a)](_0x3cfffd)[_0x4604(0x66)](([_0x5b529a,_0x3eb2a0])=>_0x3eb2a0)[_0x4604(0x3b)](([_0x4d6daa,_0x202a7e])=>_0x4d6daa),_0x4a24e6=_0x2ca622[_0x4604(0x3c)](_0x4604(0x38))||_0x2ca622[_0x4604(0x3c)](_0x13bdfd[_0x4604(0x67)]),_0x57fc95=_0x13bdfd['FEueu'](_0x2ca622[_0x4604(0x3e)],0x1)&&_0x4a24e6;return _0x373386[_0x4604(0x10)]('🔍\x20Platform\x20connection\x20check:',{'connectedPlatforms':_0x2ca622,'hasLLM':_0x4a24e6,'onlyLLM':_0x57fc95}),_0x57fc95;}}}catch(_0x19856b){return console['error'](_0x13bdfd[_0x4604(0x68)],_0x19856b),{'success':![],'message':_0x13bdfd['WVfma'](_0x19856b,Error)?_0x19856b[_0x4604(0x2c)]:_0x13bdfd['yCXYm']};}};export const getAllLLMDataKeys=async()=>{const _0x1a144d={'yJJii':_0x4604(0x39),'MjtMa':function(_0x52d25d,_0x4b4093){return _0x52d25d===_0x4b4093;},'BYqTq':_0x4604(0x69),'PIYOi':_0x4604(0x57)};try{if(_0x1a144d['MjtMa'](_0x1a144d[_0x4604(0x6a)],_0x4604(0x6b)))return{'platform':_0x4604(0x38),'userId':_0x2d9d77[_0x4604(0xa)],'email':_0x3fdd53['email'],'timestamp':_0x4fc2be[_0x4604(0xe)],'data':{'type':_0x1a144d[_0x4604(0x6c)],'conversations':_0x3ba764['data'][_0x4604(0x42)]||[],'chatHistory':_0x57c9d0['data'][_0x4604(0x43)]||[],'preferences':_0x5ae8c9['data'][_0x4604(0x6d)]||{},'customData':_0x1fd412[_0x4604(0xf)][_0x4604(0x44)]||{}},'metadata':{'appName':_0x47645c[_0x4604(0xd)],'collectedAt':new _0x1edd44(_0x3649b3[_0x4604(0xe)])[_0x4604(0x52)](),'dataVersion':_0x4604(0x3f)}};else{const _0x223ca0=await AsyncStorage['getAllKeys'](),_0x2c7b4b=_0x223ca0[_0x4604(0x66)](_0x5e4510=>_0x5e4510[_0x4604(0x6e)](LLM_DATA_STORAGE_KEY)||_0x5e4510[_0x4604(0x6e)](LLM_METADATA_STORAGE_KEY));return _0x2c7b4b;}}catch(_0x14d534){return console['error'](_0x1a144d[_0x4604(0x6f)],_0x14d534),[];}};
1
+ /**
2
+ * LLM Data Storage Service
3
+ *
4
+ * Temporary storage solution for LLM (ChatGPT) data until full backend processing is implemented.
5
+ *
6
+ * Flow:
7
+ * 1. When user connects ONLY LLM data → Store data locally, send metadata to backend
8
+ * 2. When user accepts data request → Send stored LLM data directly to developer
9
+ *
10
+ * This is a TEMPORARY feature until full LLM data processing is available.
11
+ */
12
+
13
+ import AsyncStorage from '@react-native-async-storage/async-storage';
14
+ import { API_CONFIG } from '../config/api';
15
+ const LLM_DATA_STORAGE_KEY = '@onairos:llm_data';
16
+ const LLM_METADATA_STORAGE_KEY = '@onairos:llm_metadata';
17
+ /**
18
+ * Store LLM data locally (temporary storage)
19
+ */
20
+ export const storeLLMData = async payload => {
21
+ try {
22
+ console.log('💾 Storing LLM data locally (temporary)...');
23
+
24
+ // Store the full data payload
25
+ await AsyncStorage.setItem(`${LLM_DATA_STORAGE_KEY}:${payload.userId}`, JSON.stringify(payload));
26
+
27
+ // Store metadata separately for quick access
28
+ const metadata = {
29
+ userId: payload.userId,
30
+ email: payload.email,
31
+ appName: payload.appName,
32
+ timestamp: payload.timestamp,
33
+ hasData: true,
34
+ dataSize: JSON.stringify(payload.data).length,
35
+ connectionStatus: 'connected'
36
+ };
37
+ await AsyncStorage.setItem(`${LLM_METADATA_STORAGE_KEY}:${payload.userId}`, JSON.stringify(metadata));
38
+ console.log('✅ LLM data stored locally successfully');
39
+ console.log(`📊 Data size: ${metadata.dataSize} bytes`);
40
+ return true;
41
+ } catch (error) {
42
+ console.error('❌ Failed to store LLM data:', error);
43
+ return false;
44
+ }
45
+ };
46
+
47
+ /**
48
+ * Retrieve stored LLM data
49
+ */
50
+ export const getLLMData = async userId => {
51
+ try {
52
+ const storedData = await AsyncStorage.getItem(`${LLM_DATA_STORAGE_KEY}:${userId}`);
53
+ if (!storedData) {
54
+ console.log('ℹ️ No LLM data found for user:', userId);
55
+ return null;
56
+ }
57
+ const payload = JSON.parse(storedData);
58
+ console.log('✅ Retrieved LLM data for user:', userId);
59
+ return payload;
60
+ } catch (error) {
61
+ console.error('❌ Failed to retrieve LLM data:', error);
62
+ return null;
63
+ }
64
+ };
65
+
66
+ /**
67
+ * Get LLM metadata (quick check without loading full data)
68
+ */
69
+ export const getLLMMetadata = async userId => {
70
+ try {
71
+ const storedMetadata = await AsyncStorage.getItem(`${LLM_METADATA_STORAGE_KEY}:${userId}`);
72
+ if (!storedMetadata) {
73
+ return null;
74
+ }
75
+ return JSON.parse(storedMetadata);
76
+ } catch (error) {
77
+ console.error('❌ Failed to retrieve LLM metadata:', error);
78
+ return null;
79
+ }
80
+ };
81
+
82
+ /**
83
+ * Update LLM connection status
84
+ */
85
+ export const updateLLMStatus = async (userId, status) => {
86
+ try {
87
+ const metadata = await getLLMMetadata(userId);
88
+ if (!metadata) {
89
+ console.warn('⚠️ No LLM metadata found for user:', userId);
90
+ return false;
91
+ }
92
+ metadata.connectionStatus = status;
93
+ await AsyncStorage.setItem(`${LLM_METADATA_STORAGE_KEY}:${userId}`, JSON.stringify(metadata));
94
+ console.log(`✅ Updated LLM status to: ${status}`);
95
+ return true;
96
+ } catch (error) {
97
+ console.error('❌ Failed to update LLM status:', error);
98
+ return false;
99
+ }
100
+ };
101
+
102
+ /**
103
+ * Clear stored LLM data after successful transmission
104
+ */
105
+ export const clearLLMData = async userId => {
106
+ try {
107
+ await AsyncStorage.removeItem(`${LLM_DATA_STORAGE_KEY}:${userId}`);
108
+ await AsyncStorage.removeItem(`${LLM_METADATA_STORAGE_KEY}:${userId}`);
109
+ console.log('✅ LLM data cleared for user:', userId);
110
+ return true;
111
+ } catch (error) {
112
+ console.error('❌ Failed to clear LLM data:', error);
113
+ return false;
114
+ }
115
+ };
116
+
117
+ /**
118
+ * Check if user has ONLY LLM data connected (no other platforms)
119
+ */
120
+ export const hasOnlyLLMConnection = platformToggles => {
121
+ const connectedPlatforms = Object.entries(platformToggles).filter(([_, connected]) => connected).map(([platform, _]) => platform);
122
+
123
+ // Check if ONLY 'llm' or 'chatgpt' is connected
124
+ const hasLLM = connectedPlatforms.includes('llm') || connectedPlatforms.includes('chatgpt');
125
+ const onlyLLM = connectedPlatforms.length === 1 && hasLLM;
126
+ console.log('🔍 Platform connection check:', {
127
+ connectedPlatforms,
128
+ hasLLM,
129
+ onlyLLM
130
+ });
131
+ return onlyLLM;
132
+ };
133
+
134
+ /**
135
+ * Format LLM data for developer API
136
+ */
137
+ export const formatLLMDataForDeveloper = payload => {
138
+ return {
139
+ platform: 'llm',
140
+ userId: payload.userId,
141
+ email: payload.email,
142
+ timestamp: payload.timestamp,
143
+ data: {
144
+ type: 'chatgpt',
145
+ conversations: payload.data.conversations || [],
146
+ chatHistory: payload.data.chatHistory || [],
147
+ preferences: payload.data.preferences || {},
148
+ customData: payload.data.customData || {}
149
+ },
150
+ metadata: {
151
+ appName: payload.appName,
152
+ collectedAt: new Date(payload.timestamp).toISOString(),
153
+ dataVersion: '1.0'
154
+ }
155
+ };
156
+ };
157
+
158
+ /**
159
+ * Send LLM data directly to backend for processing and storage
160
+ * FULL BACKEND IMPLEMENTATION - Backend handles all data processing
161
+ */
162
+ export const sendLLMDataToBackend = async (payload, authToken) => {
163
+ try {
164
+ console.log('📡 Sending LLM data to backend for processing...');
165
+ const response = await fetch(`${API_CONFIG.BASE_URL}/llmdata`, {
166
+ method: 'POST',
167
+ headers: {
168
+ 'Content-Type': 'application/json',
169
+ ...(authToken && {
170
+ 'Authorization': `Bearer ${authToken}`
171
+ })
172
+ },
173
+ body: JSON.stringify({
174
+ userId: payload.userId,
175
+ email: payload.email,
176
+ appName: payload.appName,
177
+ platform: 'llm',
178
+ connectionType: 'chatgpt',
179
+ timestamp: new Date().toISOString(),
180
+ data: payload.data,
181
+ accessToken: payload.accessToken,
182
+ refreshToken: payload.refreshToken,
183
+ tokenExpiry: payload.tokenExpiry,
184
+ metadata: {
185
+ collectedAt: new Date(payload.timestamp).toISOString(),
186
+ dataVersion: '1.0'
187
+ }
188
+ })
189
+ });
190
+ if (response.ok) {
191
+ const result = await response.json();
192
+ console.log('✅ Backend received and stored LLM data:', result);
193
+ return {
194
+ success: true,
195
+ message: result.message,
196
+ connectionId: result.connectionId
197
+ };
198
+ } else {
199
+ const errorText = await response.text();
200
+ console.error('❌ Backend data ingestion failed:', response.status, errorText);
201
+ return {
202
+ success: false,
203
+ message: `Backend error: ${response.status}`
204
+ };
205
+ }
206
+ } catch (error) {
207
+ console.error('❌ Failed to send data to backend:', error);
208
+ return {
209
+ success: false,
210
+ message: error instanceof Error ? error.message : 'Unknown error'
211
+ };
212
+ }
213
+ };
214
+
215
+ /**
216
+ * Request LLM data from backend to be sent to developer
217
+ * FULL BACKEND IMPLEMENTATION - Backend retrieves stored data and forwards to developer
218
+ */
219
+ export const requestLLMDataForDeveloper = async (userId, email, appName, requestedData, authToken) => {
220
+ try {
221
+ console.log('📤 Requesting backend to send LLM data to developer...');
222
+
223
+ // Request backend to process and forward LLM data to developer
224
+ const response = await fetch(`${API_CONFIG.BASE_URL}/llmdata/request`, {
225
+ method: 'POST',
226
+ headers: {
227
+ 'Content-Type': 'application/json',
228
+ 'Authorization': `Bearer ${authToken}`
229
+ },
230
+ body: JSON.stringify({
231
+ userId,
232
+ email,
233
+ appName,
234
+ requestedData,
235
+ timestamp: new Date().toISOString()
236
+ })
237
+ });
238
+ if (response.ok) {
239
+ const result = await response.json();
240
+ console.log('✅ Backend processing LLM data request:', result);
241
+ return {
242
+ success: true,
243
+ message: result.message,
244
+ apiUrl: result.apiUrl,
245
+ token: result.token
246
+ };
247
+ } else {
248
+ const errorText = await response.text();
249
+ console.error('❌ Failed to request LLM data:', response.status, errorText);
250
+ return {
251
+ success: false,
252
+ message: `Backend error: ${response.status}`
253
+ };
254
+ }
255
+ } catch (error) {
256
+ console.error('❌ Failed to request LLM data from backend:', error);
257
+ return {
258
+ success: false,
259
+ message: error instanceof Error ? error.message : 'Unknown error'
260
+ };
261
+ }
262
+ };
263
+
264
+ /**
265
+ * Get all stored LLM data keys (for debugging/admin purposes)
266
+ */
267
+ export const getAllLLMDataKeys = async () => {
268
+ try {
269
+ const allKeys = await AsyncStorage.getAllKeys();
270
+ const llmKeys = allKeys.filter(key => key.startsWith(LLM_DATA_STORAGE_KEY) || key.startsWith(LLM_METADATA_STORAGE_KEY));
271
+ return llmKeys;
272
+ } catch (error) {
273
+ console.error('❌ Failed to get LLM data keys:', error);
274
+ return [];
275
+ }
276
+ };
277
+ //# sourceMappingURL=llmDataStorage.js.map