@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,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
|
-
Object[_0x2cc3(0x0)](exports,_0x2cc3(0x1),{'value':!![]}),exports[_0x2cc3(0x2)]=void 0x0;function _0x25a7(){const _0x2dd920=['defineProperty','__esModule','storeNetflixData','Invalid\x20input:\x20userId\x20missing.','✅\x20[NETFLIX_SERVICE]\x20Successfully\x20stored\x20Netflix\x20data','Netflix\x20data\x20stored\x20successfully','📊\x20[NETFLIX_SERVICE]\x20Viewing\x20history\x20items:','📊\x20[NETFLIX_SERVICE]\x20My\x20List\x20items:','📊\x20[NETFLIX_SERVICE]\x20Has\x20profile:','❌\x20[NETFLIX_SERVICE]\x20Invalid\x20input:\x20userId\x20missing','onairos_jwt_token','enoch_token','❌\x20[NETFLIX_SERVICE]\x20No\x20auth\x20token\x20found','Authentication\x20token\x20not\x20found.\x20Please\x20log\x20in\x20again.','webview-api','ios','17.0','Android','mobile-netflix','📡\x20[NETFLIX_SERVICE]\x20Sending\x20to\x20backend...','OcAaf','❌\x20[NETFLIX_SERVICE]\x20Network\x20error:','qSgnk','log','BtOGg','viewingHistory','items','kZETi','ZjESN','myList','length','AYvZZ','ratings','profile','error','TfDUp','eRcfG','getItem','default','auth_token','FCXdC','🔑\x20[NETFLIX_SERVICE]\x20Auth\x20token\x20found','BGoZF','AYfRf','Platform','hvnwn','iPhone','oXVxz','toISOString','orgca','streaming','map','videoId','title','type','seriesTitle','seasonNumber','episodeNumber','watchDuration','totalDuration','percentWatched','imageUrl','genres','sGrYo','totalCount','Vxtvf','bxiNF','addedAt','maturityRating','rating','ratedAt','profileId','profileName','maturityLevel','language','subtitlePreferences','kMcML','FhRCx','xhKsO','filter','thumbs_down','unknown','ptEyT','BASE_URL','/platform-data/store','SmFFr','API_CONFIG','Bearer\x20','OnairosSDK/1.0.0\x20(','stringify','json','eXnGH','sigli','DewvC','EIFpg','message','📝\x20[NETFLIX_SERVICE]\x20Backend\x20response:\x20','data','warn','⚠️\x20[NETFLIX_SERVICE]\x20Backend\x20returned\x20status:\x20','⚠️\x20[NETFLIX_SERVICE]\x20Error:\x20','HTTP\x20','status','KJgWc','AaCrF','AOGTf','wcnNi'];_0x25a7=function(){return _0x2dd920;};return _0x25a7();}function _0x2cc3(_0x25a72b,_0x2cc373){_0x25a72b=_0x25a72b-0x0;const _0x24ce23=_0x25a7();let _0x33a7bd=_0x24ce23[_0x25a72b];return _0x33a7bd;}var _api=__ONAIROS_REQ_FUNC__(0x0),_asyncStorage=_interopRequireDefault(__ONAIROS_REQ_FUNC__(0x1)),_reactNative=__ONAIROS_REQ_FUNC__(0x2);function _interopRequireDefault(_0x28484c){return _0x28484c&&_0x28484c[_0x2cc3(0x1)]?_0x28484c:{'default':_0x28484c};}const storeNetflixData=async(_0x98a40f,_0x3a99a5)=>{const _0x57dea3={'eRcfG':_0x2cc3(0x3),'EIFpg':_0x2cc3(0x4),'TdUjU':_0x2cc3(0x5),'qSgnk':'🚀\x20[NETFLIX_SERVICE]\x20Storing\x20Netflix\x20data\x20for:','wXgIm':_0x2cc3(0x6),'BtOGg':function(_0x519d91,_0x10bf8e){return _0x519d91===_0x10bf8e;},'kZETi':function(_0xc56e08,_0xcf7c0c){return _0xc56e08===_0xcf7c0c;},'YVYdo':_0x2cc3(0x7),'ZjESN':function(_0x174bdf,_0x1b1195){return _0x174bdf===_0x1b1195;},'AYvZZ':'📊\x20[NETFLIX_SERVICE]\x20Ratings:','CLxfW':function(_0x250d80,_0x4c0761){return _0x250d80===_0x4c0761;},'UenjS':_0x2cc3(0x8),'TfDUp':_0x2cc3(0x9),'UDJaq':_0x2cc3(0xa),'NqNIZ':_0x2cc3(0xb),'FCXdC':_0x2cc3(0xc),'jnCqS':_0x2cc3(0xd),'BGoZF':_0x2cc3(0xe),'McyFC':'1.0.0','AYfRf':function(_0x563a86,_0x5a0213){return _0x563a86===_0x5a0213;},'hvnwn':_0x2cc3(0xf),'UXUdm':_0x2cc3(0x10),'oXVxz':_0x2cc3(0x11),'orgca':_0x2cc3(0x12),'eKNwJ':function(_0x97fe30,_0x2541c9){return _0x97fe30===_0x2541c9;},'sGrYo':function(_0x414e22,_0x3e8fb8){return _0x414e22===_0x3e8fb8;},'jtyFw':function(_0x569953,_0x477509){return _0x569953===_0x477509;},'Vxtvf':function(_0x363681,_0x362950){return _0x363681===_0x362950;},'bxiNF':function(_0xe57ab2,_0x32c89e){return _0xe57ab2===_0x32c89e;},'kMcML':function(_0x3abd2e,_0x5f4dc9){return _0x3abd2e===_0x5f4dc9;},'KyETD':function(_0x12840e,_0x345664){return _0x12840e===_0x345664;},'FhRCx':function(_0x4f5965,_0x1eeab0){return _0x4f5965===_0x1eeab0;},'xhKsO':function(_0x27bee9,_0x3798af){return _0x27bee9===_0x3798af;},'ptEyT':_0x2cc3(0x13),'shQcw':'📍\x20[NETFLIX_SERVICE]\x20URL:','SmFFr':function(_0x370e59,_0x2ac57e,_0x21f39b){return _0x370e59(_0x2ac57e,_0x21f39b);},'eXnGH':function(_0x497142,_0xa2cbfa){return _0x497142!==_0xa2cbfa;},'wvHlb':'Unknown\x20error','KJgWc':function(_0x55293c,_0x5a2d86){return _0x55293c!==_0x5a2d86;},'AaCrF':_0x2cc3(0x14),'AOGTf':_0x2cc3(0x15),'wcnNi':'Network\x20error.\x20Please\x20check\x20your\x20connection.'};var _0x597987,_0x366a60,_0x209455;console['log'](_0x57dea3[_0x2cc3(0x16)],_0x98a40f),console[_0x2cc3(0x17)](_0x57dea3['wXgIm'],(_0x57dea3[_0x2cc3(0x18)](_0x597987=_0x3a99a5[_0x2cc3(0x19)],null)||_0x57dea3['kZETi'](_0x597987,void 0x0)||(_0x597987=_0x597987[_0x2cc3(0x1a)])===null||_0x57dea3[_0x2cc3(0x1b)](_0x597987,void 0x0)?void 0x0:_0x597987['length'])||0x0),console[_0x2cc3(0x17)](_0x57dea3['YVYdo'],(_0x57dea3[_0x2cc3(0x1c)](_0x366a60=_0x3a99a5[_0x2cc3(0x1d)],null)||_0x366a60===void 0x0?void 0x0:_0x366a60[_0x2cc3(0x1e)])||0x0),console[_0x2cc3(0x17)](_0x57dea3[_0x2cc3(0x1f)],(_0x57dea3['CLxfW'](_0x209455=_0x3a99a5[_0x2cc3(0x20)],null)||_0x57dea3[_0x2cc3(0x18)](_0x209455,void 0x0)?void 0x0:_0x209455['length'])||0x0),console[_0x2cc3(0x17)](_0x57dea3['UenjS'],!!_0x3a99a5[_0x2cc3(0x21)]);if(!_0x98a40f)return console[_0x2cc3(0x22)](_0x57dea3[_0x2cc3(0x23)]),{'success':![],'error':_0x57dea3[_0x2cc3(0x24)]};try{var _0x4b4bed,_0x3881ed,_0x46d2e2,_0x24da9c,_0x50abde,_0x3bdcd9,_0x539dc6,_0x25c1c5;const _0x3a3ff6=await _asyncStorage['default'][_0x2cc3(0x25)](_0x57dea3['UDJaq'])||await _asyncStorage['default'][_0x2cc3(0x25)](_0x57dea3['NqNIZ'])||await _asyncStorage[_0x2cc3(0x26)][_0x2cc3(0x25)](_0x2cc3(0x27));if(!_0x3a3ff6)return console[_0x2cc3(0x22)](_0x57dea3[_0x2cc3(0x28)]),{'success':![],'error':_0x57dea3['jnCqS']};console[_0x2cc3(0x17)](_0x2cc3(0x29));const _0x4b800c={'platform':_reactNative['Platform']['OS'],'source':_0x57dea3[_0x2cc3(0x2a)],'appVersion':_0x57dea3['McyFC'],'osVersion':_0x57dea3[_0x2cc3(0x2b)](_reactNative[_0x2cc3(0x2c)]['OS'],_0x57dea3[_0x2cc3(0x2d)])?_0x57dea3['UXUdm']:_reactNative[_0x2cc3(0x2c)]['OS'],'deviceModel':_0x57dea3['BtOGg'](_reactNative[_0x2cc3(0x2c)]['OS'],_0x57dea3[_0x2cc3(0x2d)])?_0x2cc3(0x2e):_0x57dea3[_0x2cc3(0x2f)],'isOfflineSync':![],'extractedAt':new Date()[_0x2cc3(0x30)](),'tokenExpiry':_0x3a99a5['tokenExpiry']},_0x2a1893={'platform':_0x57dea3[_0x2cc3(0x31)],'dataType':_0x2cc3(0x32),'data':{'viewingHistory':{'items':((_0x57dea3['eKNwJ'](_0x4b4bed=_0x3a99a5[_0x2cc3(0x19)],null)||_0x4b4bed===void 0x0?void 0x0:_0x4b4bed['items'])||[])[_0x2cc3(0x33)](_0x3f3a20=>({'videoId':_0x3f3a20[_0x2cc3(0x34)],'title':_0x3f3a20[_0x2cc3(0x35)],'type':_0x3f3a20[_0x2cc3(0x36)],'seriesTitle':_0x3f3a20[_0x2cc3(0x37)],'seasonNumber':_0x3f3a20[_0x2cc3(0x38)],'episodeNumber':_0x3f3a20[_0x2cc3(0x39)],'watchedAt':_0x3f3a20['watchedAt'],'watchDuration':_0x3f3a20[_0x2cc3(0x3a)],'totalDuration':_0x3f3a20[_0x2cc3(0x3b)],'percentWatched':_0x3f3a20[_0x2cc3(0x3c)],'imageUrl':_0x3f3a20[_0x2cc3(0x3d)],'genres':_0x3f3a20[_0x2cc3(0x3e)]})),'totalCount':(_0x57dea3[_0x2cc3(0x3f)](_0x3881ed=_0x3a99a5[_0x2cc3(0x19)],null)||_0x57dea3['jtyFw'](_0x3881ed,void 0x0)?void 0x0:_0x3881ed[_0x2cc3(0x40)])||(_0x57dea3[_0x2cc3(0x41)](_0x46d2e2=_0x3a99a5[_0x2cc3(0x19)],null)||_0x57dea3[_0x2cc3(0x1b)](_0x46d2e2,void 0x0)||_0x57dea3[_0x2cc3(0x1b)](_0x46d2e2=_0x46d2e2[_0x2cc3(0x1a)],null)||_0x57dea3[_0x2cc3(0x42)](_0x46d2e2,void 0x0)?void 0x0:_0x46d2e2[_0x2cc3(0x1e)])||0x0},'myList':(_0x3a99a5[_0x2cc3(0x1d)]||[])[_0x2cc3(0x33)](_0x290ef8=>({'videoId':_0x290ef8[_0x2cc3(0x34)],'title':_0x290ef8['title'],'type':_0x290ef8[_0x2cc3(0x36)],'addedAt':_0x290ef8[_0x2cc3(0x43)],'imageUrl':_0x290ef8[_0x2cc3(0x3d)],'genres':_0x290ef8[_0x2cc3(0x3e)],'maturityRating':_0x290ef8[_0x2cc3(0x44)],'year':_0x290ef8['year']})),'ratings':(_0x3a99a5[_0x2cc3(0x20)]||[])[_0x2cc3(0x33)](_0x13e03c=>({'videoId':_0x13e03c[_0x2cc3(0x34)],'title':_0x13e03c['title'],'rating':_0x13e03c[_0x2cc3(0x45)],'ratedAt':_0x13e03c[_0x2cc3(0x46)]})),'profile':_0x3a99a5[_0x2cc3(0x21)]?{'profileId':_0x3a99a5[_0x2cc3(0x21)][_0x2cc3(0x47)],'profileName':_0x3a99a5['profile'][_0x2cc3(0x48)],'maturityLevel':_0x3a99a5[_0x2cc3(0x21)][_0x2cc3(0x49)],'language':_0x3a99a5[_0x2cc3(0x21)][_0x2cc3(0x4a)],'subtitlePreferences':_0x3a99a5[_0x2cc3(0x21)][_0x2cc3(0x4b)],'autoplayPreferences':_0x3a99a5[_0x2cc3(0x21)]['autoplayPreferences']}:null,'netflixProfileId':_0x3a99a5['profileId']||((_0x24da9c=_0x3a99a5[_0x2cc3(0x21)])===null||_0x57dea3[_0x2cc3(0x4c)](_0x24da9c,void 0x0)?void 0x0:_0x24da9c[_0x2cc3(0x47)])},'summary':{'viewingHistoryCount':(_0x57dea3[_0x2cc3(0x41)](_0x50abde=_0x3a99a5['viewingHistory'],null)||_0x57dea3['KyETD'](_0x50abde,void 0x0)||(_0x50abde=_0x50abde[_0x2cc3(0x1a)])===null||_0x57dea3[_0x2cc3(0x4d)](_0x50abde,void 0x0)?void 0x0:_0x50abde[_0x2cc3(0x1e)])||0x0,'myListCount':((_0x3bdcd9=_0x3a99a5['myList'])===null||_0x57dea3[_0x2cc3(0x4e)](_0x3bdcd9,void 0x0)?void 0x0:_0x3bdcd9[_0x2cc3(0x1e)])||0x0,'ratingsCount':(_0x57dea3[_0x2cc3(0x18)](_0x539dc6=_0x3a99a5[_0x2cc3(0x20)],null)||_0x57dea3[_0x2cc3(0x4e)](_0x539dc6,void 0x0)?void 0x0:_0x539dc6[_0x2cc3(0x1e)])||0x0,'thumbsUpCount':(_0x3a99a5[_0x2cc3(0x20)]||[])[_0x2cc3(0x4f)](_0x9460f7=>_0x9460f7[_0x2cc3(0x45)]==='thumbs_up')['length'],'thumbsDownCount':(_0x3a99a5['ratings']||[])[_0x2cc3(0x4f)](_0xca9fe=>_0xca9fe['rating']===_0x2cc3(0x50))[_0x2cc3(0x1e)],'profileName':(_0x57dea3['kZETi'](_0x25c1c5=_0x3a99a5[_0x2cc3(0x21)],null)||_0x57dea3[_0x2cc3(0x2b)](_0x25c1c5,void 0x0)?void 0x0:_0x25c1c5[_0x2cc3(0x48)])||_0x2cc3(0x51)},'mobileMetadata':_0x4b800c};console[_0x2cc3(0x17)](_0x57dea3[_0x2cc3(0x52)]),console['log'](_0x57dea3['shQcw'],_api['API_CONFIG'][_0x2cc3(0x53)]+_0x2cc3(0x54));const _0x61b5a=await _0x57dea3[_0x2cc3(0x55)](fetch,_api[_0x2cc3(0x56)][_0x2cc3(0x53)]+_0x2cc3(0x54),{'method':'POST','headers':{'Content-Type':'application/json','Authorization':_0x2cc3(0x57)+_0x3a3ff6,'User-Agent':_0x2cc3(0x58)+_reactNative[_0x2cc3(0x2c)]['OS']+')'},'body':JSON[_0x2cc3(0x59)](_0x2a1893)}),_0x52908a=await _0x61b5a[_0x2cc3(0x5a)]();return _0x61b5a['ok']?_0x57dea3[_0x2cc3(0x5b)](_0x2cc3(0x5c),_0x2cc3(0x5d))?(console[_0x2cc3(0x17)](_0x57dea3[_0x2cc3(0x5e)]),_0x52908a[_0x2cc3(0x5f)]&&console[_0x2cc3(0x17)](_0x2cc3(0x60)+_0x52908a[_0x2cc3(0x5f)]),{'success':!![],'message':_0x52908a[_0x2cc3(0x5f)]||_0x2cc3(0x5),'data':_0x52908a[_0x2cc3(0x61)]}):(_0x32652e[_0x2cc3(0x22)]('❌\x20[NETFLIX_SERVICE]\x20Invalid\x20input:\x20userId\x20missing'),{'success':![],'error':_0x57dea3[_0x2cc3(0x24)]}):(console[_0x2cc3(0x62)](_0x2cc3(0x63)+_0x61b5a['status']),console[_0x2cc3(0x62)](_0x2cc3(0x64)+(_0x52908a[_0x2cc3(0x22)]||_0x57dea3['wvHlb'])),{'success':![],'error':_0x52908a[_0x2cc3(0x22)]||_0x2cc3(0x65)+_0x61b5a[_0x2cc3(0x66)]});}catch(_0x3f1145){return _0x57dea3[_0x2cc3(0x67)](_0x57dea3[_0x2cc3(0x68)],_0x57dea3[_0x2cc3(0x68)])?(_0x17419a['log'](_0x57dea3['EIFpg']),_0x3aabbb[_0x2cc3(0x5f)]&&_0x49c806[_0x2cc3(0x17)]('📝\x20[NETFLIX_SERVICE]\x20Backend\x20response:\x20'+_0x52e05e['message']),{'success':!![],'message':_0x3be3b7[_0x2cc3(0x5f)]||_0x57dea3['TdUjU'],'data':_0x3d7f0e[_0x2cc3(0x61)]}):(console[_0x2cc3(0x22)](_0x57dea3[_0x2cc3(0x69)],_0x3f1145),{'success':![],'error':_0x3f1145['message']||_0x57dea3[_0x2cc3(0x6a)]});}};exports[_0x2cc3(0x2)]=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
|