@onairos/react-native 3.7.2 → 3.7.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/commonjs/api/index.js +219 -9
- 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/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,8 +1,120 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.useNetflixDataExtractor = void 0;
|
|
7
|
+
var _netflixDataService = require("./netflixDataService");
|
|
8
|
+
var _reactNative = require("react-native");
|
|
9
|
+
/**
|
|
10
|
+
* Netflix Data Extractor
|
|
11
|
+
*
|
|
12
|
+
* Orchestrates the Netflix data export flow:
|
|
13
|
+
* 1. Receives extracted viewing data from WebView
|
|
14
|
+
* 2. Validates and formats data
|
|
15
|
+
* 3. Sends to backend via netflixDataService
|
|
16
|
+
*
|
|
17
|
+
* This acts as the bridge between OAuthWebView and the backend API.
|
|
18
|
+
*
|
|
19
|
+
* @reference Sephora implementation: src/services/sephoraDataExtractor.ts
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Combined Netflix export data from WebView - matches netflix.ts script output
|
|
24
|
+
*/
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Hook for Netflix data extraction operations
|
|
28
|
+
*/
|
|
29
|
+
const useNetflixDataExtractor = () => {
|
|
30
|
+
/**
|
|
31
|
+
* Initiate data export to backend
|
|
32
|
+
*
|
|
33
|
+
* @param username - User identifier
|
|
34
|
+
* @param data - Extracted Netflix data (viewingHistory, myList, ratings, profile)
|
|
35
|
+
* @returns true if successful, false otherwise
|
|
36
|
+
*/
|
|
37
|
+
const initiateDataExport = async (username, data) => {
|
|
38
|
+
var _data$viewingHistory, _data$myList, _data$ratings, _data$viewingHistory2;
|
|
39
|
+
console.log('🚀 [NETFLIX_EXTRACTOR] Initiating data export');
|
|
40
|
+
console.log('👤 [NETFLIX_EXTRACTOR] Username:', username);
|
|
41
|
+
console.log('📊 [NETFLIX_EXTRACTOR] Summary:', data.summary);
|
|
42
|
+
if (!username) {
|
|
43
|
+
console.error('❌ [NETFLIX_EXTRACTOR] Username is required');
|
|
44
|
+
_reactNative.Alert.alert('Error', 'Username is required to export Netflix data.', [{
|
|
45
|
+
text: 'OK',
|
|
46
|
+
style: 'default'
|
|
47
|
+
}]);
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
const totalItems = (((_data$viewingHistory = data.viewingHistory) === null || _data$viewingHistory === void 0 || (_data$viewingHistory = _data$viewingHistory.items) === null || _data$viewingHistory === void 0 ? void 0 : _data$viewingHistory.length) || 0) + (((_data$myList = data.myList) === null || _data$myList === void 0 ? void 0 : _data$myList.length) || 0) + (((_data$ratings = data.ratings) === null || _data$ratings === void 0 ? void 0 : _data$ratings.length) || 0);
|
|
51
|
+
if (totalItems === 0) {
|
|
52
|
+
console.log('ℹ️ [NETFLIX_EXTRACTOR] No data to export - treating as success (connected)');
|
|
53
|
+
return true;
|
|
54
|
+
}
|
|
55
|
+
const validViewingHistory = (((_data$viewingHistory2 = data.viewingHistory) === null || _data$viewingHistory2 === void 0 ? void 0 : _data$viewingHistory2.items) || []).filter(item => {
|
|
56
|
+
const isValid = item.videoId && item.title;
|
|
57
|
+
if (!isValid) {
|
|
58
|
+
console.warn('⚠️ [NETFLIX_EXTRACTOR] Invalid viewing history item:', item);
|
|
59
|
+
}
|
|
60
|
+
return isValid;
|
|
61
|
+
});
|
|
62
|
+
const validMyList = (data.myList || []).filter(item => {
|
|
63
|
+
const isValid = item.videoId && item.title;
|
|
64
|
+
if (!isValid) {
|
|
65
|
+
console.warn('⚠️ [NETFLIX_EXTRACTOR] Invalid My List item:', item);
|
|
66
|
+
}
|
|
67
|
+
return isValid;
|
|
68
|
+
});
|
|
69
|
+
const validRatings = (data.ratings || []).filter(rating => {
|
|
70
|
+
const isValid = rating.videoId && rating.rating;
|
|
71
|
+
if (!isValid) {
|
|
72
|
+
console.warn('⚠️ [NETFLIX_EXTRACTOR] Invalid rating:', rating);
|
|
73
|
+
}
|
|
74
|
+
return isValid;
|
|
75
|
+
});
|
|
76
|
+
const originalCount = totalItems;
|
|
77
|
+
const validCount = validViewingHistory.length + validMyList.length + validRatings.length;
|
|
78
|
+
if (validCount < originalCount) {
|
|
79
|
+
console.warn(`⚠️ [NETFLIX_EXTRACTOR] Filtered out ${originalCount - validCount} invalid items`);
|
|
80
|
+
}
|
|
81
|
+
try {
|
|
82
|
+
console.log('📡 [NETFLIX_EXTRACTOR] Sending to backend...');
|
|
83
|
+
const result = await (0, _netflixDataService.storeNetflixData)(username, {
|
|
84
|
+
viewingHistory: {
|
|
85
|
+
items: validViewingHistory,
|
|
86
|
+
totalCount: validViewingHistory.length
|
|
87
|
+
},
|
|
88
|
+
myList: validMyList,
|
|
89
|
+
ratings: validRatings,
|
|
90
|
+
profile: data.profile,
|
|
91
|
+
tokenExpiry: data.tokenExpiry,
|
|
92
|
+
profileId: data.profileId
|
|
93
|
+
});
|
|
94
|
+
if (result.success) {
|
|
95
|
+
console.log('✅ [NETFLIX_EXTRACTOR] Export completed successfully');
|
|
96
|
+
console.log('📊 [NETFLIX_EXTRACTOR] Backend response:', result.data);
|
|
97
|
+
return true;
|
|
98
|
+
} else {
|
|
99
|
+
console.error('❌ [NETFLIX_EXTRACTOR] Backend storage failed:', result.error);
|
|
100
|
+
_reactNative.Alert.alert('Export Failed', result.error || 'An unknown error occurred during data storage.', [{
|
|
101
|
+
text: 'OK',
|
|
102
|
+
style: 'default'
|
|
103
|
+
}]);
|
|
104
|
+
return false;
|
|
105
|
+
}
|
|
106
|
+
} catch (error) {
|
|
107
|
+
console.error('❌ [NETFLIX_EXTRACTOR] Unexpected error during export:', error);
|
|
108
|
+
_reactNative.Alert.alert('Export Error', 'Failed to connect to the data storage service. Please check your network connection.', [{
|
|
109
|
+
text: 'OK',
|
|
110
|
+
style: 'default'
|
|
111
|
+
}]);
|
|
112
|
+
return false;
|
|
113
|
+
}
|
|
114
|
+
};
|
|
115
|
+
return {
|
|
116
|
+
initiateDataExport
|
|
117
|
+
};
|
|
118
|
+
};
|
|
119
|
+
exports.useNetflixDataExtractor = useNetflixDataExtractor;
|
|
120
|
+
//# sourceMappingURL=netflixDataExtractor.js.map
|
|
@@ -1,9 +1,198 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
function _0x1828(){const _0x2a859a=['__esModule','storeNetflixData','Unknown\x20error','❌\x20[NETFLIX_SERVICE]\x20No\x20auth\x20token\x20found','Authentication\x20token\x20not\x20found.\x20Please\x20log\x20in\x20again.','📊\x20[NETFLIX_SERVICE]\x20Has\x20profile:','❌\x20[NETFLIX_SERVICE]\x20Invalid\x20input:\x20userId\x20missing','ffuBg','iOWJc','WqNcl','ios','17.0','iPhone','Android','mobile-netflix','streaming','✅\x20[NETFLIX_SERVICE]\x20Successfully\x20stored\x20Netflix\x20data','mTVbH','log','🚀\x20[NETFLIX_SERVICE]\x20Storing\x20Netflix\x20data\x20for:','qaImP','OgOnD','viewingHistory','gefLm','items','length','myList','📊\x20[NETFLIX_SERVICE]\x20Ratings:','ratings','EbFIf','JhFoN','profile','HaaGL','cBXBL','error','Invalid\x20input:\x20userId\x20missing.','message','ecEXF','data','iCdOt','default','getItem','enoch_token','auth_token','jjGCI','aqsdv','tvAjM','HTZSA','warn','⚠️\x20[NETFLIX_SERVICE]\x20Backend\x20returned\x20status:\x20','⚠️\x20[NETFLIX_SERVICE]\x20Error:\x20','VLuSv','HTTP\x20','status','🔑\x20[NETFLIX_SERVICE]\x20Auth\x20token\x20found','Platform','webview-api','1.0.0','Gkmae','CAaiB','vjObL','GexJl','toISOString','tokenExpiry','UKnQF','nHpAT','RrEhU','map','videoId','title','seriesTitle','seasonNumber','episodeNumber','watchedAt','watchDuration','totalDuration','percentWatched','genres','GLgTF','JIRSy','fVCmj','type','addedAt','maturityRating','year','rating','ratedAt','profileId','profileName','maturityLevel','language','subtitlePreferences','dhRhW','cauFP','thumbs_down','mWeiR','vMSHN','📍\x20[NETFLIX_SERVICE]\x20URL:','/platform-data/store','API_CONFIG','BASE_URL','Bearer\x20','OnairosSDK/1.0.0\x20(','json','pefWR','📝\x20[NETFLIX_SERVICE]\x20Backend\x20response:\x20','pAUza','eIOtY','❌\x20[NETFLIX_SERVICE]\x20Network\x20error:'];_0x1828=function(){return _0x2a859a;};return _0x1828();}Object['defineProperty'](exports,_0x2123(0x0),{'value':!![]}),exports[_0x2123(0x1)]=void 0x0;var _api=__ONAIROS_REQ_FUNC__(0x0),_asyncStorage=_interopRequireDefault(__ONAIROS_REQ_FUNC__(0x1)),_reactNative=__ONAIROS_REQ_FUNC__(0x2);function _0x2123(_0x18288f,_0x21237b){_0x18288f=_0x18288f-0x0;const _0x5479b4=_0x1828();let _0x2c54c2=_0x5479b4[_0x18288f];return _0x2c54c2;}function _interopRequireDefault(_0x2defde){return _0x2defde&&_0x2defde[_0x2123(0x0)]?_0x2defde:{'default':_0x2defde};}const storeNetflixData=async(_0x5b77be,_0x2c964e)=>{const _0x5d049d={'ecEXF':'Netflix\x20data\x20stored\x20successfully','VLuSv':_0x2123(0x2),'tvAjM':_0x2123(0x3),'HTZSA':_0x2123(0x4),'qaImP':'📊\x20[NETFLIX_SERVICE]\x20Viewing\x20history\x20items:','OgOnD':function(_0x524f27,_0x20fc69){return _0x524f27===_0x20fc69;},'JIRSy':function(_0x37bacb,_0xe18f43){return _0x37bacb===_0xe18f43;},'gefLm':function(_0x247f40,_0x1c31bd){return _0x247f40===_0x1c31bd;},'EbFIf':function(_0x2a8a40,_0x517a15){return _0x2a8a40===_0x517a15;},'JhFoN':_0x2123(0x5),'HaaGL':'cBXBL','guuqa':_0x2123(0x6),'jjGCI':function(_0x1f0afa,_0x509b56){return _0x1f0afa!==_0x509b56;},'iCdOt':'uPYfe','dNwhX':_0x2123(0x7),'zWKpC':_0x2123(0x8),'aqsdv':_0x2123(0x9),'Gkmae':_0x2123(0xa),'CAaiB':_0x2123(0xb),'vjObL':_0x2123(0xc),'GexJl':_0x2123(0xd),'UKnQF':_0x2123(0xe),'nHpAT':_0x2123(0xf),'RrEhU':function(_0x25ae00,_0x1aabd8){return _0x25ae00===_0x1aabd8;},'GLgTF':function(_0x5f2e61,_0xa6fcc5){return _0x5f2e61===_0xa6fcc5;},'fVCmj':function(_0x49ed7b,_0x51e59a){return _0x49ed7b===_0x51e59a;},'dhRhW':function(_0x238062,_0x459997){return _0x238062===_0x459997;},'cjRoA':function(_0x10f188,_0x3373ab){return _0x10f188===_0x3373ab;},'cauFP':function(_0x48ea1e,_0x14e5b6){return _0x48ea1e===_0x14e5b6;},'eGKzQ':function(_0x319ff8,_0x34864b){return _0x319ff8===_0x34864b;},'mWeiR':function(_0x30ab11,_0x1ee37e){return _0x30ab11===_0x1ee37e;},'vMSHN':'unknown','ZQPhh':function(_0x20d1e9,_0x71f832,_0x287725){return _0x20d1e9(_0x71f832,_0x287725);},'pefWR':_0x2123(0x10),'pAUza':_0x2123(0x11),'eIOtY':'lxgmq'};var _0x3902fd,_0x43c714,_0x15bdb1;console[_0x2123(0x12)](_0x2123(0x13),_0x5b77be),console[_0x2123(0x12)](_0x5d049d[_0x2123(0x14)],(_0x5d049d[_0x2123(0x15)](_0x3902fd=_0x2c964e[_0x2123(0x16)],null)||_0x5d049d['JIRSy'](_0x3902fd,void 0x0)||_0x5d049d[_0x2123(0x17)](_0x3902fd=_0x3902fd[_0x2123(0x18)],null)||_0x5d049d['EbFIf'](_0x3902fd,void 0x0)?void 0x0:_0x3902fd[_0x2123(0x19)])||0x0),console['log']('📊\x20[NETFLIX_SERVICE]\x20My\x20List\x20items:',((_0x43c714=_0x2c964e[_0x2123(0x1a)])===null||_0x5d049d[_0x2123(0x17)](_0x43c714,void 0x0)?void 0x0:_0x43c714[_0x2123(0x19)])||0x0),console[_0x2123(0x12)](_0x2123(0x1b),((_0x15bdb1=_0x2c964e[_0x2123(0x1c)])===null||_0x5d049d[_0x2123(0x1d)](_0x15bdb1,void 0x0)?void 0x0:_0x15bdb1[_0x2123(0x19)])||0x0),console['log'](_0x5d049d[_0x2123(0x1e)],!!_0x2c964e[_0x2123(0x1f)]);if(!_0x5b77be)return _0x5d049d[_0x2123(0x15)](_0x5d049d[_0x2123(0x20)],_0x2123(0x21))?(console[_0x2123(0x22)](_0x5d049d['guuqa']),{'success':![],'error':_0x2123(0x23)}):(_0x49405a[_0x2123(0x12)]('✅\x20[NETFLIX_SERVICE]\x20Successfully\x20stored\x20Netflix\x20data'),_0x15e809[_0x2123(0x24)]&&_0x5bd1f6[_0x2123(0x12)]('📝\x20[NETFLIX_SERVICE]\x20Backend\x20response:\x20'+_0x2ae21a[_0x2123(0x24)]),{'success':!![],'message':_0x267105['message']||_0x5d049d[_0x2123(0x25)],'data':_0x276bef[_0x2123(0x26)]});try{if(_0x5d049d['jjGCI'](_0x5d049d[_0x2123(0x27)],_0x5d049d['dNwhX'])){var _0x3f892c,_0x4724f0,_0xc15edb,_0xae13ce,_0x868ee1,_0x2367a3,_0x2bbf59,_0x38e191;const _0x2057b5=await _asyncStorage[_0x2123(0x28)][_0x2123(0x29)]('onairos_jwt_token')||await _asyncStorage['default'][_0x2123(0x29)](_0x2123(0x2a))||await _asyncStorage['default'][_0x2123(0x29)](_0x2123(0x2b));if(!_0x2057b5)return _0x5d049d[_0x2123(0x2c)](_0x5d049d['zWKpC'],_0x5d049d[_0x2123(0x2d)])?(console[_0x2123(0x22)](_0x5d049d[_0x2123(0x2e)]),{'success':![],'error':_0x5d049d[_0x2123(0x2f)]}):(_0x1c876f[_0x2123(0x30)](_0x2123(0x31)+_0xe07311['status']),_0x1fa707[_0x2123(0x30)](_0x2123(0x32)+(_0x267b7c[_0x2123(0x22)]||_0x5d049d[_0x2123(0x33)])),{'success':![],'error':_0xabe095[_0x2123(0x22)]||_0x2123(0x34)+_0x5bdf1f[_0x2123(0x35)]});console[_0x2123(0x12)](_0x2123(0x36));const _0x382b46={'platform':_reactNative[_0x2123(0x37)]['OS'],'source':_0x2123(0x38),'appVersion':_0x2123(0x39),'osVersion':_reactNative[_0x2123(0x37)]['OS']===_0x5d049d[_0x2123(0x3a)]?_0x5d049d[_0x2123(0x3b)]:_reactNative[_0x2123(0x37)]['OS'],'deviceModel':_reactNative[_0x2123(0x37)]['OS']===_0x5d049d['Gkmae']?_0x5d049d[_0x2123(0x3c)]:_0x5d049d[_0x2123(0x3d)],'isOfflineSync':![],'extractedAt':new Date()[_0x2123(0x3e)](),'tokenExpiry':_0x2c964e[_0x2123(0x3f)]},_0x464ab8={'platform':_0x5d049d[_0x2123(0x40)],'dataType':_0x5d049d[_0x2123(0x41)],'data':{'viewingHistory':{'items':((_0x5d049d[_0x2123(0x42)](_0x3f892c=_0x2c964e[_0x2123(0x16)],null)||_0x3f892c===void 0x0?void 0x0:_0x3f892c[_0x2123(0x18)])||[])[_0x2123(0x43)](_0x10210=>({'videoId':_0x10210[_0x2123(0x44)],'title':_0x10210[_0x2123(0x45)],'type':_0x10210['type'],'seriesTitle':_0x10210[_0x2123(0x46)],'seasonNumber':_0x10210[_0x2123(0x47)],'episodeNumber':_0x10210[_0x2123(0x48)],'watchedAt':_0x10210[_0x2123(0x49)],'watchDuration':_0x10210[_0x2123(0x4a)],'totalDuration':_0x10210[_0x2123(0x4b)],'percentWatched':_0x10210[_0x2123(0x4c)],'imageUrl':_0x10210['imageUrl'],'genres':_0x10210[_0x2123(0x4d)]})),'totalCount':((_0x4724f0=_0x2c964e['viewingHistory'])===null||_0x4724f0===void 0x0?void 0x0:_0x4724f0['totalCount'])||(_0x5d049d['EbFIf'](_0xc15edb=_0x2c964e[_0x2123(0x16)],null)||_0x5d049d[_0x2123(0x4e)](_0xc15edb,void 0x0)||_0x5d049d[_0x2123(0x4f)](_0xc15edb=_0xc15edb[_0x2123(0x18)],null)||_0x5d049d[_0x2123(0x50)](_0xc15edb,void 0x0)?void 0x0:_0xc15edb[_0x2123(0x19)])||0x0},'myList':(_0x2c964e[_0x2123(0x1a)]||[])[_0x2123(0x43)](_0xe65f59=>({'videoId':_0xe65f59['videoId'],'title':_0xe65f59[_0x2123(0x45)],'type':_0xe65f59[_0x2123(0x51)],'addedAt':_0xe65f59[_0x2123(0x52)],'imageUrl':_0xe65f59['imageUrl'],'genres':_0xe65f59[_0x2123(0x4d)],'maturityRating':_0xe65f59[_0x2123(0x53)],'year':_0xe65f59[_0x2123(0x54)]})),'ratings':(_0x2c964e['ratings']||[])[_0x2123(0x43)](_0x4e90e0=>({'videoId':_0x4e90e0[_0x2123(0x44)],'title':_0x4e90e0[_0x2123(0x45)],'rating':_0x4e90e0[_0x2123(0x55)],'ratedAt':_0x4e90e0[_0x2123(0x56)]})),'profile':_0x2c964e[_0x2123(0x1f)]?{'profileId':_0x2c964e['profile'][_0x2123(0x57)],'profileName':_0x2c964e[_0x2123(0x1f)][_0x2123(0x58)],'maturityLevel':_0x2c964e[_0x2123(0x1f)][_0x2123(0x59)],'language':_0x2c964e['profile'][_0x2123(0x5a)],'subtitlePreferences':_0x2c964e[_0x2123(0x1f)][_0x2123(0x5b)],'autoplayPreferences':_0x2c964e[_0x2123(0x1f)]['autoplayPreferences']}:null,'netflixProfileId':_0x2c964e[_0x2123(0x57)]||(_0x5d049d[_0x2123(0x5c)](_0xae13ce=_0x2c964e['profile'],null)||_0x5d049d['cjRoA'](_0xae13ce,void 0x0)?void 0x0:_0xae13ce[_0x2123(0x57)])},'summary':{'viewingHistoryCount':((_0x868ee1=_0x2c964e[_0x2123(0x16)])===null||_0x5d049d[_0x2123(0x4f)](_0x868ee1,void 0x0)||(_0x868ee1=_0x868ee1['items'])===null||_0x868ee1===void 0x0?void 0x0:_0x868ee1['length'])||0x0,'myListCount':(_0x5d049d[_0x2123(0x4e)](_0x2367a3=_0x2c964e[_0x2123(0x1a)],null)||_0x5d049d[_0x2123(0x5d)](_0x2367a3,void 0x0)?void 0x0:_0x2367a3[_0x2123(0x19)])||0x0,'ratingsCount':(_0x5d049d['eGKzQ'](_0x2bbf59=_0x2c964e['ratings'],null)||_0x5d049d[_0x2123(0x42)](_0x2bbf59,void 0x0)?void 0x0:_0x2bbf59['length'])||0x0,'thumbsUpCount':(_0x2c964e[_0x2123(0x1c)]||[])['filter'](_0x380ad4=>_0x380ad4['rating']==='thumbs_up')['length'],'thumbsDownCount':(_0x2c964e[_0x2123(0x1c)]||[])['filter'](_0x5d077b=>_0x5d077b[_0x2123(0x55)]===_0x2123(0x5e))['length'],'profileName':(_0x5d049d[_0x2123(0x15)](_0x38e191=_0x2c964e[_0x2123(0x1f)],null)||_0x5d049d[_0x2123(0x5f)](_0x38e191,void 0x0)?void 0x0:_0x38e191['profileName'])||_0x5d049d[_0x2123(0x60)]},'mobileMetadata':_0x382b46};console[_0x2123(0x12)]('📡\x20[NETFLIX_SERVICE]\x20Sending\x20to\x20backend...'),console[_0x2123(0x12)](_0x2123(0x61),_api['API_CONFIG']['BASE_URL']+_0x2123(0x62));const _0x5331f6=await _0x5d049d['ZQPhh'](fetch,_api[_0x2123(0x63)][_0x2123(0x64)]+_0x2123(0x62),{'method':'POST','headers':{'Content-Type':'application/json','Authorization':_0x2123(0x65)+_0x2057b5,'User-Agent':_0x2123(0x66)+_reactNative['Platform']['OS']+')'},'body':JSON['stringify'](_0x464ab8)}),_0x2780b0=await _0x5331f6[_0x2123(0x67)]();return _0x5331f6['ok']?(console[_0x2123(0x12)](_0x5d049d[_0x2123(0x68)]),_0x2780b0[_0x2123(0x24)]&&console[_0x2123(0x12)](_0x2123(0x69)+_0x2780b0['message']),{'success':!![],'message':_0x2780b0[_0x2123(0x24)]||_0x5d049d[_0x2123(0x25)],'data':_0x2780b0['data']}):_0x5d049d[_0x2123(0x6a)]!==_0x5d049d[_0x2123(0x6a)]?(_0x3f6221[_0x2123(0x22)](_0x5d049d[_0x2123(0x2e)]),{'success':![],'error':_0x5d049d[_0x2123(0x2f)]}):(console[_0x2123(0x30)](_0x2123(0x31)+_0x5331f6[_0x2123(0x35)]),console[_0x2123(0x30)]('⚠️\x20[NETFLIX_SERVICE]\x20Error:\x20'+(_0x2780b0[_0x2123(0x22)]||_0x2123(0x2))),{'success':![],'error':_0x2780b0[_0x2123(0x22)]||_0x2123(0x34)+_0x5331f6[_0x2123(0x35)]});}else return _0x251af3&&_0x5bae5c[_0x2123(0x0)]?_0x33cc9b:{'default':_0x24f6f5};}catch(_0x455cab){if(_0x5d049d[_0x2123(0x5c)](_0x5d049d['eIOtY'],_0x5d049d[_0x2123(0x6b)]))return console[_0x2123(0x22)](_0x2123(0x6c),_0x455cab),{'success':![],'error':_0x455cab[_0x2123(0x24)]||'Network\x20error.\x20Please\x20check\x20your\x20connection.'};else _0x21e16a[_0x2123(0x12)](_0x2123(0x69)+_0x2d5a5e['message']);}};exports[_0x2123(0x1)]=storeNetflixData;
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.storeNetflixData = void 0;
|
|
7
|
+
var _api = require("../config/api");
|
|
8
|
+
var _asyncStorage = _interopRequireDefault(require("@react-native-async-storage/async-storage"));
|
|
9
|
+
var _reactNative = require("react-native");
|
|
10
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
11
|
+
/**
|
|
12
|
+
* Netflix Data Service
|
|
13
|
+
*
|
|
14
|
+
* API layer for storing Netflix viewing data on backend.
|
|
15
|
+
* Sends extracted viewing history, watch later, and profile to /platform-data/store endpoint.
|
|
16
|
+
*
|
|
17
|
+
* MATCHES Sephora/ChatGPT implementation pattern
|
|
18
|
+
* - Uses format: { platform, data, metadata }
|
|
19
|
+
* - Platform: "mobile-netflix"
|
|
20
|
+
*
|
|
21
|
+
* Data Sources (from netflix.com - API details TBD):
|
|
22
|
+
* - Viewing History: User's watch history
|
|
23
|
+
* - My List: User's saved shows/movies
|
|
24
|
+
* - Profile: User preferences and settings
|
|
25
|
+
* - Ratings: User's thumbs up/down ratings
|
|
26
|
+
*/
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Structure of a viewed item - Netflix content
|
|
30
|
+
*/
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Structure of viewing history
|
|
34
|
+
*/
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Structure of a My List item
|
|
38
|
+
*/
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Structure of a rating
|
|
42
|
+
*/
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Structure of user profile
|
|
46
|
+
*/
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Token expiry information
|
|
50
|
+
*/
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Combined Netflix data to store - matches WebView export format
|
|
54
|
+
*/
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Response from backend endpoint
|
|
58
|
+
*/
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Store Netflix data on backend
|
|
62
|
+
*
|
|
63
|
+
* @param userId - Username or identifier
|
|
64
|
+
* @param data - Netflix viewing data (history, myList, ratings, profile)
|
|
65
|
+
* @returns Response indicating success/failure with metadata
|
|
66
|
+
*/
|
|
67
|
+
const storeNetflixData = async (userId, data) => {
|
|
68
|
+
var _data$viewingHistory, _data$myList, _data$ratings;
|
|
69
|
+
console.log('🚀 [NETFLIX_SERVICE] Storing Netflix data for:', userId);
|
|
70
|
+
console.log('📊 [NETFLIX_SERVICE] Viewing history items:', ((_data$viewingHistory = data.viewingHistory) === null || _data$viewingHistory === void 0 || (_data$viewingHistory = _data$viewingHistory.items) === null || _data$viewingHistory === void 0 ? void 0 : _data$viewingHistory.length) || 0);
|
|
71
|
+
console.log('📊 [NETFLIX_SERVICE] My List items:', ((_data$myList = data.myList) === null || _data$myList === void 0 ? void 0 : _data$myList.length) || 0);
|
|
72
|
+
console.log('📊 [NETFLIX_SERVICE] Ratings:', ((_data$ratings = data.ratings) === null || _data$ratings === void 0 ? void 0 : _data$ratings.length) || 0);
|
|
73
|
+
console.log('📊 [NETFLIX_SERVICE] Has profile:', !!data.profile);
|
|
74
|
+
if (!userId) {
|
|
75
|
+
console.error('❌ [NETFLIX_SERVICE] Invalid input: userId missing');
|
|
76
|
+
return {
|
|
77
|
+
success: false,
|
|
78
|
+
error: 'Invalid input: userId missing.'
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
try {
|
|
82
|
+
var _data$viewingHistory2, _data$viewingHistory3, _data$viewingHistory4, _data$profile, _data$viewingHistory5, _data$myList2, _data$ratings2, _data$profile2;
|
|
83
|
+
const authToken = (await _asyncStorage.default.getItem('onairos_jwt_token')) || (await _asyncStorage.default.getItem('enoch_token')) || (await _asyncStorage.default.getItem('auth_token'));
|
|
84
|
+
if (!authToken) {
|
|
85
|
+
console.error('❌ [NETFLIX_SERVICE] No auth token found');
|
|
86
|
+
return {
|
|
87
|
+
success: false,
|
|
88
|
+
error: 'Authentication token not found. Please log in again.'
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
console.log('🔑 [NETFLIX_SERVICE] Auth token found');
|
|
92
|
+
const mobileMetadata = {
|
|
93
|
+
platform: _reactNative.Platform.OS,
|
|
94
|
+
source: 'webview-api',
|
|
95
|
+
appVersion: '1.0.0',
|
|
96
|
+
osVersion: _reactNative.Platform.OS === 'ios' ? '17.0' : _reactNative.Platform.OS,
|
|
97
|
+
deviceModel: _reactNative.Platform.OS === 'ios' ? 'iPhone' : 'Android',
|
|
98
|
+
isOfflineSync: false,
|
|
99
|
+
extractedAt: new Date().toISOString(),
|
|
100
|
+
tokenExpiry: data.tokenExpiry
|
|
101
|
+
};
|
|
102
|
+
const requestBody = {
|
|
103
|
+
platform: 'mobile-netflix',
|
|
104
|
+
dataType: 'streaming',
|
|
105
|
+
data: {
|
|
106
|
+
viewingHistory: {
|
|
107
|
+
items: (((_data$viewingHistory2 = data.viewingHistory) === null || _data$viewingHistory2 === void 0 ? void 0 : _data$viewingHistory2.items) || []).map(item => ({
|
|
108
|
+
videoId: item.videoId,
|
|
109
|
+
title: item.title,
|
|
110
|
+
type: item.type,
|
|
111
|
+
seriesTitle: item.seriesTitle,
|
|
112
|
+
seasonNumber: item.seasonNumber,
|
|
113
|
+
episodeNumber: item.episodeNumber,
|
|
114
|
+
watchedAt: item.watchedAt,
|
|
115
|
+
watchDuration: item.watchDuration,
|
|
116
|
+
totalDuration: item.totalDuration,
|
|
117
|
+
percentWatched: item.percentWatched,
|
|
118
|
+
imageUrl: item.imageUrl,
|
|
119
|
+
genres: item.genres
|
|
120
|
+
})),
|
|
121
|
+
totalCount: ((_data$viewingHistory3 = data.viewingHistory) === null || _data$viewingHistory3 === void 0 ? void 0 : _data$viewingHistory3.totalCount) || ((_data$viewingHistory4 = data.viewingHistory) === null || _data$viewingHistory4 === void 0 || (_data$viewingHistory4 = _data$viewingHistory4.items) === null || _data$viewingHistory4 === void 0 ? void 0 : _data$viewingHistory4.length) || 0
|
|
122
|
+
},
|
|
123
|
+
myList: (data.myList || []).map(item => ({
|
|
124
|
+
videoId: item.videoId,
|
|
125
|
+
title: item.title,
|
|
126
|
+
type: item.type,
|
|
127
|
+
addedAt: item.addedAt,
|
|
128
|
+
imageUrl: item.imageUrl,
|
|
129
|
+
genres: item.genres,
|
|
130
|
+
maturityRating: item.maturityRating,
|
|
131
|
+
year: item.year
|
|
132
|
+
})),
|
|
133
|
+
ratings: (data.ratings || []).map(rating => ({
|
|
134
|
+
videoId: rating.videoId,
|
|
135
|
+
title: rating.title,
|
|
136
|
+
rating: rating.rating,
|
|
137
|
+
ratedAt: rating.ratedAt
|
|
138
|
+
})),
|
|
139
|
+
profile: data.profile ? {
|
|
140
|
+
profileId: data.profile.profileId,
|
|
141
|
+
profileName: data.profile.profileName,
|
|
142
|
+
maturityLevel: data.profile.maturityLevel,
|
|
143
|
+
language: data.profile.language,
|
|
144
|
+
subtitlePreferences: data.profile.subtitlePreferences,
|
|
145
|
+
autoplayPreferences: data.profile.autoplayPreferences
|
|
146
|
+
} : null,
|
|
147
|
+
netflixProfileId: data.profileId || ((_data$profile = data.profile) === null || _data$profile === void 0 ? void 0 : _data$profile.profileId)
|
|
148
|
+
},
|
|
149
|
+
summary: {
|
|
150
|
+
viewingHistoryCount: ((_data$viewingHistory5 = data.viewingHistory) === null || _data$viewingHistory5 === void 0 || (_data$viewingHistory5 = _data$viewingHistory5.items) === null || _data$viewingHistory5 === void 0 ? void 0 : _data$viewingHistory5.length) || 0,
|
|
151
|
+
myListCount: ((_data$myList2 = data.myList) === null || _data$myList2 === void 0 ? void 0 : _data$myList2.length) || 0,
|
|
152
|
+
ratingsCount: ((_data$ratings2 = data.ratings) === null || _data$ratings2 === void 0 ? void 0 : _data$ratings2.length) || 0,
|
|
153
|
+
thumbsUpCount: (data.ratings || []).filter(r => r.rating === 'thumbs_up').length,
|
|
154
|
+
thumbsDownCount: (data.ratings || []).filter(r => r.rating === 'thumbs_down').length,
|
|
155
|
+
profileName: ((_data$profile2 = data.profile) === null || _data$profile2 === void 0 ? void 0 : _data$profile2.profileName) || 'unknown'
|
|
156
|
+
},
|
|
157
|
+
mobileMetadata: mobileMetadata
|
|
158
|
+
};
|
|
159
|
+
console.log('📡 [NETFLIX_SERVICE] Sending to backend...');
|
|
160
|
+
console.log('📍 [NETFLIX_SERVICE] URL:', `${_api.API_CONFIG.BASE_URL}/platform-data/store`);
|
|
161
|
+
const response = await fetch(`${_api.API_CONFIG.BASE_URL}/platform-data/store`, {
|
|
162
|
+
method: 'POST',
|
|
163
|
+
headers: {
|
|
164
|
+
'Content-Type': 'application/json',
|
|
165
|
+
'Authorization': `Bearer ${authToken}`,
|
|
166
|
+
'User-Agent': `OnairosSDK/1.0.0 (${_reactNative.Platform.OS})`
|
|
167
|
+
},
|
|
168
|
+
body: JSON.stringify(requestBody)
|
|
169
|
+
});
|
|
170
|
+
const responseData = await response.json();
|
|
171
|
+
if (response.ok) {
|
|
172
|
+
console.log('✅ [NETFLIX_SERVICE] Successfully stored Netflix data');
|
|
173
|
+
if (responseData.message) {
|
|
174
|
+
console.log(`📝 [NETFLIX_SERVICE] Backend response: ${responseData.message}`);
|
|
175
|
+
}
|
|
176
|
+
return {
|
|
177
|
+
success: true,
|
|
178
|
+
message: responseData.message || 'Netflix data stored successfully',
|
|
179
|
+
data: responseData.data
|
|
180
|
+
};
|
|
181
|
+
} else {
|
|
182
|
+
console.warn(`⚠️ [NETFLIX_SERVICE] Backend returned status: ${response.status}`);
|
|
183
|
+
console.warn(`⚠️ [NETFLIX_SERVICE] Error: ${responseData.error || 'Unknown error'}`);
|
|
184
|
+
return {
|
|
185
|
+
success: false,
|
|
186
|
+
error: responseData.error || `HTTP ${response.status}`
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
} catch (error) {
|
|
190
|
+
console.error('❌ [NETFLIX_SERVICE] Network error:', error);
|
|
191
|
+
return {
|
|
192
|
+
success: false,
|
|
193
|
+
error: error.message || 'Network error. Please check your connection.'
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
};
|
|
197
|
+
exports.storeNetflixData = storeNetflixData;
|
|
198
|
+
//# sourceMappingURL=netflixDataService.js.map
|
|
@@ -1,8 +1,84 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.hashPin = exports.getEncryptedPinForAPI = exports.encryptPin = exports.decryptPin = void 0;
|
|
7
|
+
var _pinStorageUtils = require("./pinStorageUtils");
|
|
8
|
+
const CryptoJS = require('react-native-crypto-js');
|
|
9
|
+
/**
|
|
10
|
+
* Service for encrypting PIN data before sending to APIs
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
// Encryption key - in production, this should come from a secure source
|
|
14
|
+
const ENCRYPTION_KEY = 'onairos-pin-encryption-key-2024';
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Encrypt PIN using AES encryption
|
|
18
|
+
*/
|
|
19
|
+
const encryptPin = pin => {
|
|
20
|
+
try {
|
|
21
|
+
const encrypted = CryptoJS.AES.encrypt(pin, ENCRYPTION_KEY).toString();
|
|
22
|
+
console.log('🔐 PIN encrypted successfully');
|
|
23
|
+
return encrypted;
|
|
24
|
+
} catch (error) {
|
|
25
|
+
console.error('❌ Error encrypting PIN:', error);
|
|
26
|
+
throw error;
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Decrypt PIN (for verification purposes)
|
|
32
|
+
*/
|
|
33
|
+
exports.encryptPin = encryptPin;
|
|
34
|
+
const decryptPin = encryptedPin => {
|
|
35
|
+
try {
|
|
36
|
+
const decrypted = CryptoJS.AES.decrypt(encryptedPin, ENCRYPTION_KEY);
|
|
37
|
+
const pin = decrypted.toString(CryptoJS.enc.Utf8);
|
|
38
|
+
console.log('🔓 PIN decrypted successfully');
|
|
39
|
+
return pin;
|
|
40
|
+
} catch (error) {
|
|
41
|
+
console.error('❌ Error decrypting PIN:', error);
|
|
42
|
+
throw error;
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Get encrypted PIN for API transmission
|
|
48
|
+
*/
|
|
49
|
+
exports.decryptPin = decryptPin;
|
|
50
|
+
const getEncryptedPinForAPI = async () => {
|
|
51
|
+
try {
|
|
52
|
+
// Get the temporary PIN from memory
|
|
53
|
+
const pin = (0, _pinStorageUtils.getTemporaryPin)();
|
|
54
|
+
if (!pin) {
|
|
55
|
+
console.log('⚠️ No temporary PIN available for encryption');
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// Encrypt the PIN
|
|
60
|
+
const encryptedPin = encryptPin(pin);
|
|
61
|
+
console.log('✅ PIN encrypted for API transmission');
|
|
62
|
+
return encryptedPin;
|
|
63
|
+
} catch (error) {
|
|
64
|
+
console.error('❌ Error getting encrypted PIN for API:', error);
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Hash PIN for verification (one-way hash)
|
|
71
|
+
*/
|
|
72
|
+
exports.getEncryptedPinForAPI = getEncryptedPinForAPI;
|
|
73
|
+
const hashPin = pin => {
|
|
74
|
+
try {
|
|
75
|
+
const hash = CryptoJS.SHA256(pin + ENCRYPTION_KEY).toString();
|
|
76
|
+
console.log('🔒 PIN hashed successfully');
|
|
77
|
+
return hash;
|
|
78
|
+
} catch (error) {
|
|
79
|
+
console.error('❌ Error hashing PIN:', error);
|
|
80
|
+
throw error;
|
|
81
|
+
}
|
|
82
|
+
};
|
|
83
|
+
exports.hashPin = hashPin;
|
|
84
|
+
//# sourceMappingURL=pinEncryptionService.js.map
|
|
@@ -1,7 +1,105 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.setTemporaryPin = exports.hasStoredPin = exports.getTemporaryPin = exports.getStoredPinForTraining = exports.getPinForTraining = exports.clearTemporaryPin = exports.clearStoredPin = void 0;
|
|
7
|
+
var _biometricPinService = require("./biometricPinService");
|
|
8
|
+
/**
|
|
9
|
+
* Utility functions for PIN storage management
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Get the stored PIN for training/authentication purposes
|
|
14
|
+
* This will prompt for biometric authentication
|
|
15
|
+
*/
|
|
16
|
+
const getStoredPinForTraining = async () => {
|
|
17
|
+
try {
|
|
18
|
+
console.log('🔓 Retrieving stored PIN for training...');
|
|
19
|
+
|
|
20
|
+
// Check if PIN is stored
|
|
21
|
+
const pinStored = await _biometricPinService.biometricPinService.isPinStored();
|
|
22
|
+
if (!pinStored) {
|
|
23
|
+
console.log('⚠️ No PIN stored in secure storage');
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
// Retrieve PIN with biometric authentication
|
|
28
|
+
const pin = await _biometricPinService.biometricPinService.retrievePinWithBiometric();
|
|
29
|
+
if (pin) {
|
|
30
|
+
console.log('✅ PIN retrieved successfully for training');
|
|
31
|
+
return pin;
|
|
32
|
+
} else {
|
|
33
|
+
console.log('❌ Failed to retrieve PIN or user cancelled authentication');
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
} catch (error) {
|
|
37
|
+
console.error('❌ Error retrieving stored PIN:', error);
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Check if user has a PIN stored securely
|
|
44
|
+
*/
|
|
45
|
+
exports.getStoredPinForTraining = getStoredPinForTraining;
|
|
46
|
+
const hasStoredPin = async () => {
|
|
47
|
+
try {
|
|
48
|
+
return await _biometricPinService.biometricPinService.isPinStored();
|
|
49
|
+
} catch (error) {
|
|
50
|
+
console.error('❌ Error checking PIN storage:', error);
|
|
51
|
+
return false;
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Remove stored PIN (for logout/reset purposes)
|
|
57
|
+
*/
|
|
58
|
+
exports.hasStoredPin = hasStoredPin;
|
|
59
|
+
const clearStoredPin = async () => {
|
|
60
|
+
try {
|
|
61
|
+
console.log('🗑️ Clearing stored PIN...');
|
|
62
|
+
return await _biometricPinService.biometricPinService.removePinFromStorage();
|
|
63
|
+
} catch (error) {
|
|
64
|
+
console.error('❌ Error clearing stored PIN:', error);
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Get PIN for passing to training component
|
|
71
|
+
* This function can be called from the onboarding flow
|
|
72
|
+
*/
|
|
73
|
+
exports.clearStoredPin = clearStoredPin;
|
|
74
|
+
const getPinForTraining = async tempPin => {
|
|
75
|
+
// If a temporary PIN is provided (from the PIN input), use it
|
|
76
|
+
if (tempPin) {
|
|
77
|
+
console.log('📝 Using temporary PIN for training');
|
|
78
|
+
return tempPin;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// Otherwise, try to retrieve stored PIN
|
|
82
|
+
return await getStoredPinForTraining();
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Store PIN temporarily in memory for training component
|
|
87
|
+
* This is used when PIN is entered but not yet stored biometrically
|
|
88
|
+
*/
|
|
89
|
+
exports.getPinForTraining = getPinForTraining;
|
|
90
|
+
let temporaryPin = null;
|
|
91
|
+
const setTemporaryPin = pin => {
|
|
92
|
+
temporaryPin = pin;
|
|
93
|
+
console.log('📝 Temporary PIN set for training');
|
|
94
|
+
};
|
|
95
|
+
exports.setTemporaryPin = setTemporaryPin;
|
|
96
|
+
const getTemporaryPin = () => {
|
|
97
|
+
return temporaryPin;
|
|
98
|
+
};
|
|
99
|
+
exports.getTemporaryPin = getTemporaryPin;
|
|
100
|
+
const clearTemporaryPin = () => {
|
|
101
|
+
temporaryPin = null;
|
|
102
|
+
console.log('🗑️ Temporary PIN cleared');
|
|
103
|
+
};
|
|
104
|
+
exports.clearTemporaryPin = clearTemporaryPin;
|
|
105
|
+
//# sourceMappingURL=pinStorageUtils.js.map
|