@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.
- package/lib/commonjs/api/index.js +219 -9
- package/lib/commonjs/assets/icons/spotify.png +0 -0
- package/lib/commonjs/assets/images/spotify.png +0 -0
- package/lib/commonjs/components/BodyText.js +27 -9
- package/lib/commonjs/components/BrandMark.js +111 -10
- package/lib/commonjs/components/CodeInput.js +116 -9
- package/lib/commonjs/components/EmailInput.js +30 -8
- package/lib/commonjs/components/GoogleButton.js +56 -9
- package/lib/commonjs/components/HeadingGroup.js +43 -9
- package/lib/commonjs/components/LLMDataInputModal.js +664 -14
- package/lib/commonjs/components/ModalHeader.js +99 -9
- package/lib/commonjs/components/ModalSheet.js +47 -9
- package/lib/commonjs/components/Onairos.js +380 -14
- package/lib/commonjs/components/OnairosButton.js +313 -13
- package/lib/commonjs/components/OnairosSignInButton.js +130 -12
- package/lib/commonjs/components/Overlay.js +465 -13
- package/lib/commonjs/components/PersonaImage.js +137 -10
- package/lib/commonjs/components/PersonaLoadingScreen.js +318 -12
- package/lib/commonjs/components/PersonalizationConsentScreen.js +467 -13
- package/lib/commonjs/components/PinCreationScreen.js +403 -12
- package/lib/commonjs/components/PinInput.js +464 -9
- package/lib/commonjs/components/PlatformConnectorsStep.js +1311 -23
- package/lib/commonjs/components/PlatformList.js +137 -10
- package/lib/commonjs/components/PlatformToggle.js +180 -9
- package/lib/commonjs/components/PrimaryButton.js +180 -10
- package/lib/commonjs/components/SignInMatchAnimation.js +197 -9
- package/lib/commonjs/components/SignInStep.js +345 -12
- package/lib/commonjs/components/UniversalOnboarding.js +2780 -30
- package/lib/commonjs/components/VerificationStep.js +176 -11
- package/lib/commonjs/components/WelcomeScreen.js +461 -22
- package/lib/commonjs/components/icons/Basicproficon.js +37 -8
- package/lib/commonjs/components/icons/Basicprofile.js +21 -8
- package/lib/commonjs/components/icons/Checkbox.js +21 -8
- package/lib/commonjs/components/icons/Checkmark.js +27 -8
- package/lib/commonjs/components/icons/Contentanalysis.js +21 -8
- package/lib/commonjs/components/icons/Contenticon.js +39 -8
- package/lib/commonjs/components/icons/EnochE.js +41 -8
- package/lib/commonjs/components/icons/Personalityicon.js +30 -8
- package/lib/commonjs/components/icons/Personalityprofile.js +21 -8
- package/lib/commonjs/components/icons/Personalitytraits.js +21 -8
- package/lib/commonjs/components/icons/Userpreferences.js +21 -8
- package/lib/commonjs/components/icons/index.js +84 -17
- package/lib/commonjs/components/onboarding/OAuthWebView.js +1754 -18
- package/lib/commonjs/components/onboarding/OnboardingHeader.js +74 -10
- package/lib/commonjs/components/onboarding/PinInput.js +283 -10
- package/lib/commonjs/components/onboarding/PlatformConnector.js +249 -11
- package/lib/commonjs/config/PLATFORM_APIS.md +849 -0
- package/lib/commonjs/config/api.js +56 -7
- package/lib/commonjs/constants/index.js +120 -7
- package/lib/commonjs/context/AuthContext.js +345 -10
- package/lib/commonjs/hooks/useConnectedAccounts.js +111 -9
- package/lib/commonjs/hooks/useConnections.js +102 -8
- package/lib/commonjs/hooks/useCredentials.js +178 -10
- package/lib/commonjs/hooks/useUserConnections.js +148 -10
- package/lib/commonjs/index.js +439 -34
- package/lib/commonjs/services/apiClient.js +298 -8
- package/lib/commonjs/services/biometricPinService.js +180 -8
- package/lib/commonjs/services/chatGPTConversationExtractor.js +155 -8
- package/lib/commonjs/services/chatGPTConversationService.js +275 -9
- package/lib/commonjs/services/claudeConversationExtractor.js +103 -8
- package/lib/commonjs/services/claudeConversationService.js +158 -9
- package/lib/commonjs/services/connectedAccountsService.js +310 -10
- package/lib/commonjs/services/googleAuthService.js +252 -11
- package/lib/commonjs/services/hingeDataExtractor.js +105 -8
- package/lib/commonjs/services/hingeDataService.js +150 -9
- package/lib/commonjs/services/imageCompressionService.js +260 -7
- package/lib/commonjs/services/instagramDataExtractor.js +126 -8
- package/lib/commonjs/services/instagramDataService.js +163 -9
- package/lib/commonjs/services/jwtStorageService.js +276 -7
- package/lib/commonjs/services/linkedinDOMExtractor.js +245 -7
- package/lib/commonjs/services/linkedinProfileService.js +222 -9
- package/lib/commonjs/services/linkedinScrapingService.js +230 -8
- package/lib/commonjs/services/llmDataStorage.js +294 -8
- package/lib/commonjs/services/mobileTrainingService.js +186 -8
- package/lib/commonjs/services/netflixDataExtractor.js +120 -8
- package/lib/commonjs/services/netflixDataService.js +198 -9
- package/lib/commonjs/services/pinEncryptionService.js +84 -8
- package/lib/commonjs/services/pinStorageUtils.js +105 -7
- package/lib/commonjs/services/platformAuthService.js +1484 -12
- package/lib/commonjs/services/sephoraDataExtractor.js +140 -8
- package/lib/commonjs/services/sephoraDataService.js +200 -9
- package/lib/commonjs/services/spotifyDataExtractor.js +148 -8
- package/lib/commonjs/services/spotifyDataService.js +241 -9
- package/lib/commonjs/services/storageService.js +404 -8
- package/lib/commonjs/services/telegramDataExtractor.js +115 -8
- package/lib/commonjs/services/telegramDataService.js +499 -9
- package/lib/commonjs/services/trainingApiHelpers.js +73 -7
- package/lib/commonjs/services/userConnectionsService.js +340 -10
- package/lib/commonjs/services/youtubeMigrationService.js +416 -10
- package/lib/commonjs/theme/index.js +250 -7
- package/lib/commonjs/types/ambient.d.js +2 -1
- package/lib/commonjs/types/declarations.d.js +2 -1
- package/lib/commonjs/types/index.js +6 -1
- package/lib/commonjs/types/node-fix.d.js +2 -1
- package/lib/commonjs/types/node-override.d.js +2 -1
- package/lib/commonjs/types/opacity.d.js +2 -1
- package/lib/commonjs/types.js +14 -1
- package/lib/commonjs/utils/Portal.js +98 -8
- package/lib/commonjs/utils/api.js +130 -9
- package/lib/commonjs/utils/assetRegistry.js +210 -35
- package/lib/commonjs/utils/auth.js +112 -9
- package/lib/commonjs/utils/connectorTests.js +613 -29
- package/lib/commonjs/utils/crypto.js +62 -8
- package/lib/commonjs/utils/debugHelper.js +64 -1
- package/lib/commonjs/utils/encryption.js +76 -7
- package/lib/commonjs/utils/eventUtils.js +288 -1
- package/lib/commonjs/utils/haptics.js +66 -9
- package/lib/commonjs/utils/imagePreloader.js +6 -1
- package/lib/commonjs/utils/networkDiagnostics.js +226 -8
- package/lib/commonjs/utils/onairosApi.js +350 -9
- package/lib/commonjs/utils/programmaticFlow.js +117 -9
- package/lib/commonjs/utils/retryHelper.js +220 -1
- package/lib/commonjs/utils/secureStorage.js +349 -10
- package/lib/commonjs/utils/webviewScripts/chatgpt.js +551 -1
- package/lib/commonjs/utils/webviewScripts/claude.js +376 -1
- package/lib/commonjs/utils/webviewScripts/hinge.js +411 -1
- package/lib/commonjs/utils/webviewScripts/index.js +698 -15
- package/lib/commonjs/utils/webviewScripts/instagram.js +454 -1
- package/lib/commonjs/utils/webviewScripts/linkedin.js +880 -1
- package/lib/commonjs/utils/webviewScripts/netflix.js +382 -1
- package/lib/commonjs/utils/webviewScripts/sephora.js +516 -1
- package/lib/commonjs/utils/webviewScripts/spotify.js +419 -1
- package/lib/commonjs/utils/webviewScripts/telegram.js +678 -1
- package/lib/module/api/index.js +211 -1
- package/lib/module/assets/icons/spotify.png +0 -0
- package/lib/module/assets/images/spotify.png +0 -0
- package/lib/module/components/BodyText.js +20 -1
- package/lib/module/components/BrandMark.js +104 -1
- package/lib/module/components/CodeInput.js +109 -1
- package/lib/module/components/EmailInput.js +23 -1
- package/lib/module/components/GoogleButton.js +49 -1
- package/lib/module/components/HeadingGroup.js +36 -1
- package/lib/module/components/LLMDataInputModal.js +656 -7
- package/lib/module/components/ModalHeader.js +92 -1
- package/lib/module/components/ModalSheet.js +39 -1
- package/lib/module/components/Onairos.js +373 -1
- package/lib/module/components/OnairosButton.js +305 -1
- package/lib/module/components/OnairosSignInButton.js +121 -1
- package/lib/module/components/Overlay.js +456 -1
- package/lib/module/components/PersonaImage.js +129 -1
- package/lib/module/components/PersonaLoadingScreen.js +310 -1
- package/lib/module/components/PersonalizationConsentScreen.js +460 -1
- package/lib/module/components/PinCreationScreen.js +396 -1
- package/lib/module/components/PinInput.js +456 -1
- package/lib/module/components/PlatformConnectorsStep.js +1302 -6
- package/lib/module/components/PlatformList.js +129 -1
- package/lib/module/components/PlatformToggle.js +173 -1
- package/lib/module/components/PrimaryButton.js +172 -1
- package/lib/module/components/SignInMatchAnimation.js +189 -1
- package/lib/module/components/SignInStep.js +338 -1
- package/lib/module/components/UniversalOnboarding.js +2770 -1
- package/lib/module/components/VerificationStep.js +168 -1
- package/lib/module/components/WelcomeScreen.js +453 -1
- package/lib/module/components/icons/Basicproficon.js +30 -1
- package/lib/module/components/icons/Basicprofile.js +14 -1
- package/lib/module/components/icons/Checkbox.js +14 -1
- package/lib/module/components/icons/Checkmark.js +20 -1
- package/lib/module/components/icons/Contentanalysis.js +14 -1
- package/lib/module/components/icons/Contenticon.js +32 -1
- package/lib/module/components/icons/EnochE.js +34 -1
- package/lib/module/components/icons/Personalityicon.js +23 -1
- package/lib/module/components/icons/Personalityprofile.js +14 -1
- package/lib/module/components/icons/Personalitytraits.js +14 -1
- package/lib/module/components/icons/Userpreferences.js +14 -1
- package/lib/module/components/icons/index.js +13 -1
- package/lib/module/components/onboarding/OAuthWebView.js +1746 -1
- package/lib/module/components/onboarding/OnboardingHeader.js +66 -1
- package/lib/module/components/onboarding/PinInput.js +274 -1
- package/lib/module/components/onboarding/PlatformConnector.js +240 -1
- package/lib/module/config/PLATFORM_APIS.md +849 -0
- package/lib/module/config/api.js +47 -1
- package/lib/module/constants/index.js +114 -1
- package/lib/module/context/AuthContext.js +335 -1
- package/lib/module/hooks/useConnectedAccounts.js +106 -1
- package/lib/module/hooks/useConnections.js +95 -1
- package/lib/module/hooks/useCredentials.js +171 -6
- package/lib/module/hooks/useUserConnections.js +140 -1
- package/lib/module/index.js +172 -1
- package/lib/module/services/apiClient.js +295 -1
- package/lib/module/services/biometricPinService.js +169 -1
- package/lib/module/services/chatGPTConversationExtractor.js +149 -1
- package/lib/module/services/chatGPTConversationService.js +268 -1
- package/lib/module/services/claudeConversationExtractor.js +97 -1
- package/lib/module/services/claudeConversationService.js +151 -1
- package/lib/module/services/connectedAccountsService.js +293 -1
- package/lib/module/services/googleAuthService.js +241 -1
- package/lib/module/services/hingeDataExtractor.js +99 -1
- package/lib/module/services/hingeDataService.js +143 -1
- package/lib/module/services/imageCompressionService.js +250 -1
- package/lib/module/services/instagramDataExtractor.js +120 -1
- package/lib/module/services/instagramDataService.js +156 -1
- package/lib/module/services/jwtStorageService.js +257 -1
- package/lib/module/services/linkedinDOMExtractor.js +234 -1
- package/lib/module/services/linkedinProfileService.js +210 -1
- package/lib/module/services/linkedinScrapingService.js +219 -1
- package/lib/module/services/llmDataStorage.js +277 -1
- package/lib/module/services/mobileTrainingService.js +173 -1
- package/lib/module/services/netflixDataExtractor.js +114 -1
- package/lib/module/services/netflixDataService.js +191 -1
- package/lib/module/services/pinEncryptionService.js +74 -6
- package/lib/module/services/pinStorageUtils.js +93 -1
- package/lib/module/services/platformAuthService.js +1461 -1
- package/lib/module/services/sephoraDataExtractor.js +134 -1
- package/lib/module/services/sephoraDataService.js +193 -1
- package/lib/module/services/spotifyDataExtractor.js +142 -1
- package/lib/module/services/spotifyDataService.js +234 -1
- package/lib/module/services/storageService.js +383 -1
- package/lib/module/services/telegramDataExtractor.js +109 -1
- package/lib/module/services/telegramDataService.js +493 -1
- package/lib/module/services/trainingApiHelpers.js +67 -1
- package/lib/module/services/userConnectionsService.js +329 -1
- package/lib/module/services/youtubeMigrationService.js +405 -1
- package/lib/module/theme/index.js +245 -1
- package/lib/module/types.js +10 -1
- package/lib/module/utils/Portal.js +90 -1
- package/lib/module/utils/api.js +118 -1
- package/lib/module/utils/assetRegistry.js +200 -34
- package/lib/module/utils/auth.js +100 -1
- package/lib/module/utils/connectorTests.js +600 -27
- package/lib/module/utils/crypto.js +54 -1
- package/lib/module/utils/debugHelper.js +54 -1
- package/lib/module/utils/encryption.js +67 -1
- package/lib/module/utils/eventUtils.js +270 -1
- package/lib/module/utils/haptics.js +59 -8
- package/lib/module/utils/imagePreloader.js +3 -1
- package/lib/module/utils/networkDiagnostics.js +217 -1
- package/lib/module/utils/onairosApi.js +333 -1
- package/lib/module/utils/programmaticFlow.js +111 -1
- package/lib/module/utils/retryHelper.js +211 -1
- package/lib/module/utils/secureStorage.js +330 -6
- package/lib/module/utils/webviewScripts/chatgpt.js +545 -1
- package/lib/module/utils/webviewScripts/claude.js +370 -1
- package/lib/module/utils/webviewScripts/hinge.js +405 -1
- package/lib/module/utils/webviewScripts/index.js +434 -1
- package/lib/module/utils/webviewScripts/instagram.js +448 -1
- package/lib/module/utils/webviewScripts/linkedin.js +874 -1
- package/lib/module/utils/webviewScripts/netflix.js +376 -1
- package/lib/module/utils/webviewScripts/sephora.js +510 -1
- package/lib/module/utils/webviewScripts/spotify.js +413 -1
- package/lib/module/utils/webviewScripts/telegram.js +672 -1
- 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
|