@onairos/react-native 3.1.15 → 3.1.17
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/README.md +404 -0
- package/lib/commonjs/assets/images/Checkbox.svg +3 -3
- package/lib/commonjs/assets/images/EnochE.svg +19 -19
- package/lib/commonjs/assets/images/Personalityprofile.svg +3 -3
- package/lib/commonjs/assets/images/Personalitytraits.svg +3 -3
- package/lib/commonjs/assets/images/Userpreferences.svg +3 -3
- package/lib/commonjs/assets/images/arrow.svg +20 -20
- package/lib/commonjs/assets/images/basicproficon.svg +43 -43
- package/lib/commonjs/assets/images/basicprofile.svg +3 -3
- package/lib/commonjs/assets/images/checkmark.svg +4 -4
- package/lib/commonjs/assets/images/contentanalysis.svg +3 -3
- package/lib/commonjs/assets/images/contenticon.svg +23 -23
- package/lib/commonjs/assets/images/personalityicon.svg +18 -18
- package/lib/commonjs/assets/images/x-close.svg +3 -3
- package/lib/commonjs/components/OnairosSignInButton.js +32 -74
- package/lib/commonjs/components/OnairosSignInButton.js.map +1 -1
- package/lib/commonjs/components/UniversalOnboarding.js +4 -4
- package/lib/commonjs/config/api.js +2 -2
- package/lib/commonjs/hooks/useConnections.js +6 -6
- package/lib/commonjs/hooks/useUserConnections.js +10 -10
- package/lib/commonjs/index.js +5 -12
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/services/apiClient.js +35 -35
- package/lib/commonjs/services/apiKeyService.js +99 -99
- package/lib/commonjs/services/authService.js +82 -82
- package/lib/commonjs/services/biometricPinService.js +10 -10
- package/lib/commonjs/services/connectedAccountsService.js +32 -32
- package/lib/commonjs/services/googleAuthService.js +15 -15
- package/lib/commonjs/services/imageCompressionService.js +15 -15
- package/lib/commonjs/services/jwtStorageService.js +59 -59
- package/lib/commonjs/services/mobileTrainingService.js +14 -14
- package/lib/commonjs/services/pinEncryptionService.js +10 -10
- package/lib/commonjs/services/pinStorageUtils.js +15 -15
- package/lib/commonjs/services/platformAuthService.js +47 -47
- package/lib/commonjs/services/storageService.js +31 -31
- package/lib/commonjs/services/trainingApiHelpers.js +33 -33
- package/lib/commonjs/services/userConnectionsService.js +24 -24
- package/lib/commonjs/utils/Portal.js +4 -4
- package/lib/commonjs/utils/api.js +24 -24
- package/lib/commonjs/utils/auth.js +18 -18
- package/lib/commonjs/utils/crypto.js +13 -13
- package/lib/commonjs/utils/encryption.js +12 -12
- package/lib/commonjs/utils/eventUtils.js +52 -52
- package/lib/commonjs/utils/programmaticFlow.js +16 -16
- package/lib/commonjs/utils/retryHelper.js +27 -27
- package/lib/module/assets/images/Checkbox.svg +3 -3
- package/lib/module/assets/images/EnochE.svg +19 -19
- package/lib/module/assets/images/Personalityprofile.svg +3 -3
- package/lib/module/assets/images/Personalitytraits.svg +3 -3
- package/lib/module/assets/images/Userpreferences.svg +3 -3
- package/lib/module/assets/images/arrow.svg +20 -20
- package/lib/module/assets/images/basicproficon.svg +43 -43
- package/lib/module/assets/images/basicprofile.svg +3 -3
- package/lib/module/assets/images/checkmark.svg +4 -4
- package/lib/module/assets/images/contentanalysis.svg +3 -3
- package/lib/module/assets/images/contenticon.svg +23 -23
- package/lib/module/assets/images/personalityicon.svg +18 -18
- package/lib/module/assets/images/x-close.svg +3 -3
- package/lib/module/components/OnairosSignInButton.js +32 -74
- package/lib/module/components/OnairosSignInButton.js.map +1 -1
- package/lib/module/components/UniversalOnboarding.js +4 -4
- package/lib/module/config/api.js +2 -2
- package/lib/module/hooks/useConnections.js +6 -6
- package/lib/module/hooks/useUserConnections.js +10 -10
- package/lib/module/index.js +5 -6
- package/lib/module/index.js.map +1 -1
- package/lib/module/services/apiClient.js +35 -35
- package/lib/module/services/apiKeyService.js +99 -99
- package/lib/module/services/authService.js +82 -82
- package/lib/module/services/biometricPinService.js +10 -10
- package/lib/module/services/connectedAccountsService.js +32 -32
- package/lib/module/services/googleAuthService.js +15 -15
- package/lib/module/services/imageCompressionService.js +15 -15
- package/lib/module/services/jwtStorageService.js +59 -59
- package/lib/module/services/mobileTrainingService.js +14 -14
- package/lib/module/services/pinEncryptionService.js +10 -10
- package/lib/module/services/pinStorageUtils.js +15 -15
- package/lib/module/services/platformAuthService.js +47 -47
- package/lib/module/services/storageService.js +31 -31
- package/lib/module/services/trainingApiHelpers.js +33 -33
- package/lib/module/services/userConnectionsService.js +24 -24
- package/lib/module/utils/Portal.js +4 -4
- package/lib/module/utils/api.js +24 -24
- package/lib/module/utils/auth.js +18 -18
- package/lib/module/utils/crypto.js +13 -13
- package/lib/module/utils/encryption.js +12 -12
- package/lib/module/utils/eventUtils.js +52 -52
- package/lib/module/utils/programmaticFlow.js +16 -16
- package/lib/module/utils/retryHelper.js +27 -27
- package/lib/typescript/components/OnairosSignInButton.d.ts.map +1 -1
- package/lib/typescript/index.d.ts +0 -1
- package/lib/typescript/index.d.ts.map +1 -1
- package/package.json +163 -163
- package/src/api/index.ts +151 -151
- package/src/assets/images/Checkbox.svg +3 -3
- package/src/assets/images/EnochE.svg +19 -19
- package/src/assets/images/Personalityprofile.svg +3 -3
- package/src/assets/images/Personalitytraits.svg +3 -3
- package/src/assets/images/Userpreferences.svg +3 -3
- package/src/assets/images/arrow.svg +20 -20
- package/src/assets/images/basicproficon.svg +43 -43
- package/src/assets/images/basicprofile.svg +3 -3
- package/src/assets/images/checkmark.svg +4 -4
- package/src/assets/images/contentanalysis.svg +3 -3
- package/src/assets/images/contenticon.svg +23 -23
- package/src/assets/images/personalityicon.svg +18 -18
- package/src/assets/images/x-close.svg +3 -3
- package/src/components/BodyText.tsx +33 -33
- package/src/components/BrandMark.tsx +62 -62
- package/src/components/CodeInput.tsx +32 -32
- package/src/components/DataRequestScreen.tsx +355 -355
- package/src/components/EmailInput.tsx +31 -31
- package/src/components/EmailVerificationModal.tsx +363 -363
- package/src/components/ExistingUserDataConfirmation.tsx +506 -506
- package/src/components/GoogleButton.tsx +55 -55
- package/src/components/HeadingGroup.tsx +49 -49
- package/src/components/ModalHeader.tsx +125 -125
- package/src/components/ModalSheet.tsx +57 -57
- package/src/components/Onairos.tsx +422 -422
- package/src/components/OnairosButton.tsx +339 -339
- package/src/components/OnairosSignInButton.tsx +130 -166
- package/src/components/Overlay.tsx +506 -506
- package/src/components/PersonaImage.tsx +79 -79
- package/src/components/PersonaLoadingScreen.tsx +201 -201
- package/src/components/PersonalizationConsentScreen.tsx +410 -410
- package/src/components/PinCreationScreen.tsx +492 -492
- package/src/components/PinInput.tsx +555 -555
- package/src/components/PlatformConnectorsStep.tsx +891 -891
- package/src/components/PlatformList.tsx +144 -144
- package/src/components/PlatformToggle.tsx +226 -226
- package/src/components/PrimaryButton.tsx +213 -213
- package/src/components/SignInMatchAnimation.tsx +225 -225
- package/src/components/SignInStep.tsx +217 -217
- package/src/components/TrainingModal.tsx +1047 -1047
- package/src/components/UniversalOnboarding.tsx +2887 -2887
- package/src/components/VerificationStep.tsx +198 -198
- package/src/components/WelcomeScreen.tsx +473 -473
- package/src/components/icons/Basicproficon.tsx +30 -30
- package/src/components/icons/Basicprofile.tsx +17 -17
- package/src/components/icons/Checkbox.tsx +17 -17
- package/src/components/icons/Checkmark.tsx +24 -24
- package/src/components/icons/Contentanalysis.tsx +17 -17
- package/src/components/icons/Contenticon.tsx +30 -30
- package/src/components/icons/EnochE.tsx +39 -39
- package/src/components/icons/Personalityicon.tsx +22 -22
- package/src/components/icons/Personalityprofile.tsx +17 -17
- package/src/components/icons/Personalitytraits.tsx +17 -17
- package/src/components/icons/Userpreferences.tsx +17 -17
- package/src/components/icons/index.ts +12 -12
- package/src/components/onboarding/OAuthWebView.tsx +232 -232
- package/src/config/api.ts +25 -25
- package/src/context/AuthContext.tsx +393 -393
- package/src/hooks/useConnectedAccounts.ts +138 -138
- package/src/hooks/useConnections.ts +161 -161
- package/src/hooks/useCredentials.ts +174 -174
- package/src/hooks/useUserConnections.ts +165 -165
- package/src/index.js +14 -14
- package/src/index.ts +94 -95
- package/src/services/apiClient.ts +336 -336
- package/src/services/apiKeyService.ts +919 -919
- package/src/services/authService.ts +1008 -1008
- package/src/services/biometricPinService.ts +192 -192
- package/src/services/connectedAccountsService.ts +289 -289
- package/src/services/googleAuthService.ts +279 -279
- package/src/services/imageCompressionService.ts +302 -302
- package/src/services/jwtStorageService.ts +256 -256
- package/src/services/mobileTrainingService.ts +203 -203
- package/src/services/pinEncryptionService.ts +75 -75
- package/src/services/pinStorageUtils.ts +96 -96
- package/src/services/platformAuthService.ts +1346 -1346
- package/src/services/storageService.ts +451 -451
- package/src/services/trainingApiHelpers.ts +66 -66
- package/src/services/userConnectionsService.ts +556 -556
- package/src/services/youtubeMigrationService.ts +453 -453
- package/src/theme/index.ts +239 -239
- package/src/types/ambient.d.ts +28 -28
- package/src/types/index.ts +265 -265
- package/src/types/node-fix.d.ts +18 -18
- package/src/types/node-override.d.ts +23 -23
- package/src/types/opacity.d.ts +15 -15
- package/src/types/types.d.ts +17 -17
- package/src/utils/Portal.tsx +82 -82
- package/src/utils/api.js +111 -111
- package/src/utils/auth.js +103 -103
- package/src/utils/crypto.js +59 -59
- package/src/utils/encryption.ts +68 -68
- package/src/utils/eventUtils.ts +302 -302
- package/src/utils/haptics.ts +58 -58
- package/src/utils/imagePreloader.ts +2 -2
- package/src/utils/programmaticFlow.ts +112 -112
- package/src/utils/retryHelper.ts +274 -274
|
@@ -1,290 +1,290 @@
|
|
|
1
|
-
import { getAuthToken } from './authService';
|
|
2
|
-
import { API_CONFIG, getApiHeaders, getAuthHeaders } from '../config/api';
|
|
3
|
-
|
|
4
|
-
const API_BASE_URL = API_CONFIG.BASE_URL;
|
|
5
|
-
|
|
6
|
-
// Interface for connected account from API
|
|
7
|
-
export interface ConnectedAccount {
|
|
8
|
-
platform: string;
|
|
9
|
-
username: string;
|
|
10
|
-
url: string;
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
// Interface for API response
|
|
14
|
-
export interface ConnectedAccountsResponse {
|
|
15
|
-
success: boolean;
|
|
16
|
-
connectedAccounts: ConnectedAccount[];
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
/**
|
|
20
|
-
* NEW UNIFIED LOOKUP - Get connected accounts using the simplified lookup endpoint
|
|
21
|
-
* This is the preferred method that makes only ONE request to the backend
|
|
22
|
-
* @param userIdentifier - Can be email, username, userId, or any user identifier
|
|
23
|
-
* @returns Promise<ConnectedAccount[]>
|
|
24
|
-
*/
|
|
25
|
-
export const getConnectedAccountsLookup = async (userIdentifier: string): Promise<ConnectedAccount[]> => {
|
|
26
|
-
try {
|
|
27
|
-
console.log('🔍 [NEW API] Fetching connected accounts via unified lookup for:', userIdentifier);
|
|
28
|
-
|
|
29
|
-
const token = await getAuthToken();
|
|
30
|
-
|
|
31
|
-
// Use the new simplified endpoint format
|
|
32
|
-
const response = await fetch(`${API_BASE_URL}/connectedAccounts/lookup/${encodeURIComponent(userIdentifier)}`, {
|
|
33
|
-
method: 'GET',
|
|
34
|
-
headers: token ? getAuthHeaders(token) : getApiHeaders()
|
|
35
|
-
});
|
|
36
|
-
|
|
37
|
-
if (response.ok) {
|
|
38
|
-
const data: ConnectedAccountsResponse = await response.json();
|
|
39
|
-
console.log('✅ [NEW API] Connected accounts fetched successfully:', data);
|
|
40
|
-
|
|
41
|
-
if (data.success && data.connectedAccounts && data.connectedAccounts.length > 0) {
|
|
42
|
-
console.log(`✅ [NEW API] Found ${data.connectedAccounts.length} connected accounts`);
|
|
43
|
-
return data.connectedAccounts;
|
|
44
|
-
} else {
|
|
45
|
-
console.log('ℹ️ [NEW API] No connected accounts found for user');
|
|
46
|
-
return [];
|
|
47
|
-
}
|
|
48
|
-
} else {
|
|
49
|
-
console.log(`⚠️ [NEW API] Response not OK: ${response.status} ${response.statusText}`);
|
|
50
|
-
return [];
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
} catch (error) {
|
|
54
|
-
console.log('❌ [NEW API] Error fetching connected accounts via lookup:', error);
|
|
55
|
-
return [];
|
|
56
|
-
}
|
|
57
|
-
};
|
|
58
|
-
|
|
59
|
-
/**
|
|
60
|
-
* SMART CONNECTED ACCOUNTS FETCHER - Uses new API with old API fallback
|
|
61
|
-
* This function tries the new unified lookup first, then falls back to old methods if needed
|
|
62
|
-
* @param userEmail - User's email (primary identifier)
|
|
63
|
-
* @param userId - User's ID (fallback)
|
|
64
|
-
* @param username - User's username (fallback)
|
|
65
|
-
* @returns Promise<ConnectedAccount[]>
|
|
66
|
-
*/
|
|
67
|
-
export const getConnectedAccountsSmart = async (
|
|
68
|
-
userEmail?: string,
|
|
69
|
-
userId?: string,
|
|
70
|
-
username?: string
|
|
71
|
-
): Promise<ConnectedAccount[]> => {
|
|
72
|
-
console.log('🧠 [SMART API] Starting smart connected accounts fetch...');
|
|
73
|
-
console.log('🧠 [SMART API] Available identifiers:', { userEmail, userId, username });
|
|
74
|
-
|
|
75
|
-
// Try the new unified lookup API first (preferred method)
|
|
76
|
-
if (userEmail) {
|
|
77
|
-
console.log('🧠 [SMART API] Trying new unified lookup with email:', userEmail);
|
|
78
|
-
const accounts = await getConnectedAccountsLookup(userEmail);
|
|
79
|
-
if (accounts.length > 0) {
|
|
80
|
-
console.log('✅ [SMART API] Success with new unified lookup via email');
|
|
81
|
-
return accounts;
|
|
82
|
-
}
|
|
83
|
-
console.log('🔄 [SMART API] New API returned no results, trying fallbacks...');
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
// If new API didn't work or no email, try fallbacks
|
|
87
|
-
console.log('🔄 [SMART API] Falling back to old API methods...');
|
|
88
|
-
|
|
89
|
-
// Try old API methods as fallback
|
|
90
|
-
let accounts: ConnectedAccount[] = [];
|
|
91
|
-
|
|
92
|
-
// Prioritize email for profile views
|
|
93
|
-
if (userEmail && accounts.length === 0) {
|
|
94
|
-
console.log('🔄 [SMART API] Trying old API with email:', userEmail);
|
|
95
|
-
accounts = await getConnectedAccountsByEmail(userEmail);
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
if (accounts.length === 0 && userId) {
|
|
99
|
-
console.log('🔄 [SMART API] Trying old API with userId:', userId);
|
|
100
|
-
accounts = await getConnectedAccountsByUserId(userId);
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
if (accounts.length === 0 && username) {
|
|
104
|
-
console.log('🔄 [SMART API] Trying old API with username:', username);
|
|
105
|
-
accounts = await getConnectedAccountsByUsername(username);
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
if (accounts.length > 0) {
|
|
109
|
-
console.log(`✅ [SMART API] Success with old API fallback: ${accounts.length} accounts`);
|
|
110
|
-
} else {
|
|
111
|
-
console.log('⚠️ [SMART API] No connected accounts found with any method');
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
return accounts;
|
|
115
|
-
};
|
|
116
|
-
|
|
117
|
-
// =============================================================================
|
|
118
|
-
// LEGACY API FUNCTIONS - Keep for backward compatibility and fallback
|
|
119
|
-
// These will be used as fallbacks if the new unified lookup fails
|
|
120
|
-
// =============================================================================
|
|
121
|
-
|
|
122
|
-
/**
|
|
123
|
-
* Get connected accounts by username
|
|
124
|
-
* @param username - Username to fetch connected accounts for
|
|
125
|
-
* @returns Promise<ConnectedAccount[]>
|
|
126
|
-
*/
|
|
127
|
-
export const getConnectedAccountsByUsername = async (username: string): Promise<ConnectedAccount[]> => {
|
|
128
|
-
try {
|
|
129
|
-
console.log('🔍 [LEGACY] Fetching connected accounts for username:', username);
|
|
130
|
-
|
|
131
|
-
const token = await getAuthToken();
|
|
132
|
-
|
|
133
|
-
const response = await fetch(`${API_BASE_URL}/connectedAccounts?username=${encodeURIComponent(username)}`, {
|
|
134
|
-
method: 'GET',
|
|
135
|
-
headers: token ? getAuthHeaders(token) : getApiHeaders()
|
|
136
|
-
});
|
|
137
|
-
|
|
138
|
-
if (response.ok) {
|
|
139
|
-
const data: ConnectedAccountsResponse = await response.json();
|
|
140
|
-
console.log('✅ [LEGACY] Connected accounts fetched:', data);
|
|
141
|
-
|
|
142
|
-
if (data.success && data.connectedAccounts && data.connectedAccounts.length > 0) {
|
|
143
|
-
return data.connectedAccounts;
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
console.log('⚠️ [LEGACY] API response not successful or empty');
|
|
148
|
-
return [];
|
|
149
|
-
|
|
150
|
-
} catch (error) {
|
|
151
|
-
console.log('❌ [LEGACY] Error fetching connected accounts by username:', error);
|
|
152
|
-
return [];
|
|
153
|
-
}
|
|
154
|
-
};
|
|
155
|
-
|
|
156
|
-
/**
|
|
157
|
-
* Get connected accounts by email
|
|
158
|
-
* @param email - Email to fetch connected accounts for
|
|
159
|
-
* @returns Promise<ConnectedAccount[]>
|
|
160
|
-
*/
|
|
161
|
-
export const getConnectedAccountsByEmail = async (email: string): Promise<ConnectedAccount[]> => {
|
|
162
|
-
try {
|
|
163
|
-
console.log('🔍 [LEGACY] Fetching connected accounts for email:', email);
|
|
164
|
-
|
|
165
|
-
const token = await getAuthToken();
|
|
166
|
-
|
|
167
|
-
const response = await fetch(`${API_BASE_URL}/connectedAccounts?email=${encodeURIComponent(email)}`, {
|
|
168
|
-
method: 'GET',
|
|
169
|
-
headers: token ? getAuthHeaders(token) : getApiHeaders()
|
|
170
|
-
});
|
|
171
|
-
|
|
172
|
-
if (response.ok) {
|
|
173
|
-
const data: ConnectedAccountsResponse = await response.json();
|
|
174
|
-
console.log('✅ [LEGACY] Connected accounts fetched:', data);
|
|
175
|
-
|
|
176
|
-
if (data.success && data.connectedAccounts && data.connectedAccounts.length > 0) {
|
|
177
|
-
return data.connectedAccounts;
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
console.log('⚠️ [LEGACY] API response not successful or empty');
|
|
182
|
-
return [];
|
|
183
|
-
|
|
184
|
-
} catch (error) {
|
|
185
|
-
console.log('❌ [LEGACY] Error fetching connected accounts by email:', error);
|
|
186
|
-
return [];
|
|
187
|
-
}
|
|
188
|
-
};
|
|
189
|
-
|
|
190
|
-
/**
|
|
191
|
-
* Get connected accounts by user ID
|
|
192
|
-
* @param userId - User ID to fetch connected accounts for
|
|
193
|
-
* @returns Promise<ConnectedAccount[]>
|
|
194
|
-
*/
|
|
195
|
-
export const getConnectedAccountsByUserId = async (userId: string): Promise<ConnectedAccount[]> => {
|
|
196
|
-
try {
|
|
197
|
-
console.log('🔍 [LEGACY] Fetching connected accounts for userId:', userId);
|
|
198
|
-
|
|
199
|
-
const token = await getAuthToken();
|
|
200
|
-
|
|
201
|
-
const response = await fetch(`${API_BASE_URL}/connectedAccounts?userId=${encodeURIComponent(userId)}`, {
|
|
202
|
-
method: 'GET',
|
|
203
|
-
headers: token ? getAuthHeaders(token) : getApiHeaders()
|
|
204
|
-
});
|
|
205
|
-
|
|
206
|
-
if (response.ok) {
|
|
207
|
-
const data: ConnectedAccountsResponse = await response.json();
|
|
208
|
-
console.log('✅ [LEGACY] Connected accounts fetched:', data);
|
|
209
|
-
|
|
210
|
-
if (data.success && data.connectedAccounts && data.connectedAccounts.length > 0) {
|
|
211
|
-
return data.connectedAccounts;
|
|
212
|
-
}
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
console.log('⚠️ [LEGACY] API response not successful or empty');
|
|
216
|
-
return [];
|
|
217
|
-
|
|
218
|
-
} catch (error) {
|
|
219
|
-
console.log('❌ [LEGACY] Error fetching connected accounts by userId:', error);
|
|
220
|
-
return [];
|
|
221
|
-
}
|
|
222
|
-
};
|
|
223
|
-
|
|
224
|
-
/**
|
|
225
|
-
* Get platform icon based on platform name
|
|
226
|
-
* @param platform - Platform name (case insensitive)
|
|
227
|
-
* @returns Image source for the platform icon
|
|
228
|
-
*/
|
|
229
|
-
export const getPlatformIcon = (platform: string) => {
|
|
230
|
-
const platformLower = platform.toLowerCase();
|
|
231
|
-
|
|
232
|
-
switch (platformLower) {
|
|
233
|
-
case 'youtube':
|
|
234
|
-
return require('../assets/icons/YouTubeicon3.png');
|
|
235
|
-
case 'reddit':
|
|
236
|
-
return require('../assets/icons/Redditicon.png');
|
|
237
|
-
case 'linkedin':
|
|
238
|
-
return require('../assets/icons/Linkedinicon.png');
|
|
239
|
-
case 'instagram':
|
|
240
|
-
return require('../assets/icons/instagram.png');
|
|
241
|
-
case 'facebook':
|
|
242
|
-
return require('../assets/icons/Facebookicon.png');
|
|
243
|
-
case 'pinterest':
|
|
244
|
-
return require('../assets/icons/pinterest.png');
|
|
245
|
-
case 'gmail':
|
|
246
|
-
case 'email':
|
|
247
|
-
return require('../assets/icons/Gmail.png');
|
|
248
|
-
case 'twitter':
|
|
249
|
-
case 'x':
|
|
250
|
-
return require('../assets/icons/twitter.jpg');
|
|
251
|
-
case 'farcaster':
|
|
252
|
-
return require('../assets/icons/farcaster.png');
|
|
253
|
-
default:
|
|
254
|
-
return require('../assets/icons/swerv_logo.png'); // Default icon
|
|
255
|
-
}
|
|
256
|
-
};
|
|
257
|
-
|
|
258
|
-
/**
|
|
259
|
-
* Get platform color based on platform name
|
|
260
|
-
* @param platform - Platform name (case insensitive)
|
|
261
|
-
* @returns Hex color code for the platform
|
|
262
|
-
*/
|
|
263
|
-
export const getPlatformColor = (platform: string): string => {
|
|
264
|
-
const platformLower = platform.toLowerCase();
|
|
265
|
-
|
|
266
|
-
switch (platformLower) {
|
|
267
|
-
case 'youtube':
|
|
268
|
-
return '#FF0000';
|
|
269
|
-
case 'reddit':
|
|
270
|
-
return '#FF4500';
|
|
271
|
-
case 'linkedin':
|
|
272
|
-
return '#0077B5';
|
|
273
|
-
case 'instagram':
|
|
274
|
-
return '#E1306C';
|
|
275
|
-
case 'facebook':
|
|
276
|
-
return '#1877F2';
|
|
277
|
-
case 'pinterest':
|
|
278
|
-
return '#E60023';
|
|
279
|
-
case 'gmail':
|
|
280
|
-
case 'email':
|
|
281
|
-
return '#EA4335';
|
|
282
|
-
case 'twitter':
|
|
283
|
-
case 'x':
|
|
284
|
-
return '#1DA1F2';
|
|
285
|
-
case 'farcaster':
|
|
286
|
-
return '#8A63D2';
|
|
287
|
-
default:
|
|
288
|
-
return '#666666'; // Default gray
|
|
289
|
-
}
|
|
1
|
+
import { getAuthToken } from './authService';
|
|
2
|
+
import { API_CONFIG, getApiHeaders, getAuthHeaders } from '../config/api';
|
|
3
|
+
|
|
4
|
+
const API_BASE_URL = API_CONFIG.BASE_URL;
|
|
5
|
+
|
|
6
|
+
// Interface for connected account from API
|
|
7
|
+
export interface ConnectedAccount {
|
|
8
|
+
platform: string;
|
|
9
|
+
username: string;
|
|
10
|
+
url: string;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
// Interface for API response
|
|
14
|
+
export interface ConnectedAccountsResponse {
|
|
15
|
+
success: boolean;
|
|
16
|
+
connectedAccounts: ConnectedAccount[];
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* NEW UNIFIED LOOKUP - Get connected accounts using the simplified lookup endpoint
|
|
21
|
+
* This is the preferred method that makes only ONE request to the backend
|
|
22
|
+
* @param userIdentifier - Can be email, username, userId, or any user identifier
|
|
23
|
+
* @returns Promise<ConnectedAccount[]>
|
|
24
|
+
*/
|
|
25
|
+
export const getConnectedAccountsLookup = async (userIdentifier: string): Promise<ConnectedAccount[]> => {
|
|
26
|
+
try {
|
|
27
|
+
console.log('🔍 [NEW API] Fetching connected accounts via unified lookup for:', userIdentifier);
|
|
28
|
+
|
|
29
|
+
const token = await getAuthToken();
|
|
30
|
+
|
|
31
|
+
// Use the new simplified endpoint format
|
|
32
|
+
const response = await fetch(`${API_BASE_URL}/connectedAccounts/lookup/${encodeURIComponent(userIdentifier)}`, {
|
|
33
|
+
method: 'GET',
|
|
34
|
+
headers: token ? getAuthHeaders(token) : getApiHeaders()
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
if (response.ok) {
|
|
38
|
+
const data: ConnectedAccountsResponse = await response.json();
|
|
39
|
+
console.log('✅ [NEW API] Connected accounts fetched successfully:', data);
|
|
40
|
+
|
|
41
|
+
if (data.success && data.connectedAccounts && data.connectedAccounts.length > 0) {
|
|
42
|
+
console.log(`✅ [NEW API] Found ${data.connectedAccounts.length} connected accounts`);
|
|
43
|
+
return data.connectedAccounts;
|
|
44
|
+
} else {
|
|
45
|
+
console.log('ℹ️ [NEW API] No connected accounts found for user');
|
|
46
|
+
return [];
|
|
47
|
+
}
|
|
48
|
+
} else {
|
|
49
|
+
console.log(`⚠️ [NEW API] Response not OK: ${response.status} ${response.statusText}`);
|
|
50
|
+
return [];
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
} catch (error) {
|
|
54
|
+
console.log('❌ [NEW API] Error fetching connected accounts via lookup:', error);
|
|
55
|
+
return [];
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* SMART CONNECTED ACCOUNTS FETCHER - Uses new API with old API fallback
|
|
61
|
+
* This function tries the new unified lookup first, then falls back to old methods if needed
|
|
62
|
+
* @param userEmail - User's email (primary identifier)
|
|
63
|
+
* @param userId - User's ID (fallback)
|
|
64
|
+
* @param username - User's username (fallback)
|
|
65
|
+
* @returns Promise<ConnectedAccount[]>
|
|
66
|
+
*/
|
|
67
|
+
export const getConnectedAccountsSmart = async (
|
|
68
|
+
userEmail?: string,
|
|
69
|
+
userId?: string,
|
|
70
|
+
username?: string
|
|
71
|
+
): Promise<ConnectedAccount[]> => {
|
|
72
|
+
console.log('🧠 [SMART API] Starting smart connected accounts fetch...');
|
|
73
|
+
console.log('🧠 [SMART API] Available identifiers:', { userEmail, userId, username });
|
|
74
|
+
|
|
75
|
+
// Try the new unified lookup API first (preferred method)
|
|
76
|
+
if (userEmail) {
|
|
77
|
+
console.log('🧠 [SMART API] Trying new unified lookup with email:', userEmail);
|
|
78
|
+
const accounts = await getConnectedAccountsLookup(userEmail);
|
|
79
|
+
if (accounts.length > 0) {
|
|
80
|
+
console.log('✅ [SMART API] Success with new unified lookup via email');
|
|
81
|
+
return accounts;
|
|
82
|
+
}
|
|
83
|
+
console.log('🔄 [SMART API] New API returned no results, trying fallbacks...');
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// If new API didn't work or no email, try fallbacks
|
|
87
|
+
console.log('🔄 [SMART API] Falling back to old API methods...');
|
|
88
|
+
|
|
89
|
+
// Try old API methods as fallback
|
|
90
|
+
let accounts: ConnectedAccount[] = [];
|
|
91
|
+
|
|
92
|
+
// Prioritize email for profile views
|
|
93
|
+
if (userEmail && accounts.length === 0) {
|
|
94
|
+
console.log('🔄 [SMART API] Trying old API with email:', userEmail);
|
|
95
|
+
accounts = await getConnectedAccountsByEmail(userEmail);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
if (accounts.length === 0 && userId) {
|
|
99
|
+
console.log('🔄 [SMART API] Trying old API with userId:', userId);
|
|
100
|
+
accounts = await getConnectedAccountsByUserId(userId);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
if (accounts.length === 0 && username) {
|
|
104
|
+
console.log('🔄 [SMART API] Trying old API with username:', username);
|
|
105
|
+
accounts = await getConnectedAccountsByUsername(username);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
if (accounts.length > 0) {
|
|
109
|
+
console.log(`✅ [SMART API] Success with old API fallback: ${accounts.length} accounts`);
|
|
110
|
+
} else {
|
|
111
|
+
console.log('⚠️ [SMART API] No connected accounts found with any method');
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
return accounts;
|
|
115
|
+
};
|
|
116
|
+
|
|
117
|
+
// =============================================================================
|
|
118
|
+
// LEGACY API FUNCTIONS - Keep for backward compatibility and fallback
|
|
119
|
+
// These will be used as fallbacks if the new unified lookup fails
|
|
120
|
+
// =============================================================================
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* Get connected accounts by username
|
|
124
|
+
* @param username - Username to fetch connected accounts for
|
|
125
|
+
* @returns Promise<ConnectedAccount[]>
|
|
126
|
+
*/
|
|
127
|
+
export const getConnectedAccountsByUsername = async (username: string): Promise<ConnectedAccount[]> => {
|
|
128
|
+
try {
|
|
129
|
+
console.log('🔍 [LEGACY] Fetching connected accounts for username:', username);
|
|
130
|
+
|
|
131
|
+
const token = await getAuthToken();
|
|
132
|
+
|
|
133
|
+
const response = await fetch(`${API_BASE_URL}/connectedAccounts?username=${encodeURIComponent(username)}`, {
|
|
134
|
+
method: 'GET',
|
|
135
|
+
headers: token ? getAuthHeaders(token) : getApiHeaders()
|
|
136
|
+
});
|
|
137
|
+
|
|
138
|
+
if (response.ok) {
|
|
139
|
+
const data: ConnectedAccountsResponse = await response.json();
|
|
140
|
+
console.log('✅ [LEGACY] Connected accounts fetched:', data);
|
|
141
|
+
|
|
142
|
+
if (data.success && data.connectedAccounts && data.connectedAccounts.length > 0) {
|
|
143
|
+
return data.connectedAccounts;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
console.log('⚠️ [LEGACY] API response not successful or empty');
|
|
148
|
+
return [];
|
|
149
|
+
|
|
150
|
+
} catch (error) {
|
|
151
|
+
console.log('❌ [LEGACY] Error fetching connected accounts by username:', error);
|
|
152
|
+
return [];
|
|
153
|
+
}
|
|
154
|
+
};
|
|
155
|
+
|
|
156
|
+
/**
|
|
157
|
+
* Get connected accounts by email
|
|
158
|
+
* @param email - Email to fetch connected accounts for
|
|
159
|
+
* @returns Promise<ConnectedAccount[]>
|
|
160
|
+
*/
|
|
161
|
+
export const getConnectedAccountsByEmail = async (email: string): Promise<ConnectedAccount[]> => {
|
|
162
|
+
try {
|
|
163
|
+
console.log('🔍 [LEGACY] Fetching connected accounts for email:', email);
|
|
164
|
+
|
|
165
|
+
const token = await getAuthToken();
|
|
166
|
+
|
|
167
|
+
const response = await fetch(`${API_BASE_URL}/connectedAccounts?email=${encodeURIComponent(email)}`, {
|
|
168
|
+
method: 'GET',
|
|
169
|
+
headers: token ? getAuthHeaders(token) : getApiHeaders()
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
if (response.ok) {
|
|
173
|
+
const data: ConnectedAccountsResponse = await response.json();
|
|
174
|
+
console.log('✅ [LEGACY] Connected accounts fetched:', data);
|
|
175
|
+
|
|
176
|
+
if (data.success && data.connectedAccounts && data.connectedAccounts.length > 0) {
|
|
177
|
+
return data.connectedAccounts;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
console.log('⚠️ [LEGACY] API response not successful or empty');
|
|
182
|
+
return [];
|
|
183
|
+
|
|
184
|
+
} catch (error) {
|
|
185
|
+
console.log('❌ [LEGACY] Error fetching connected accounts by email:', error);
|
|
186
|
+
return [];
|
|
187
|
+
}
|
|
188
|
+
};
|
|
189
|
+
|
|
190
|
+
/**
|
|
191
|
+
* Get connected accounts by user ID
|
|
192
|
+
* @param userId - User ID to fetch connected accounts for
|
|
193
|
+
* @returns Promise<ConnectedAccount[]>
|
|
194
|
+
*/
|
|
195
|
+
export const getConnectedAccountsByUserId = async (userId: string): Promise<ConnectedAccount[]> => {
|
|
196
|
+
try {
|
|
197
|
+
console.log('🔍 [LEGACY] Fetching connected accounts for userId:', userId);
|
|
198
|
+
|
|
199
|
+
const token = await getAuthToken();
|
|
200
|
+
|
|
201
|
+
const response = await fetch(`${API_BASE_URL}/connectedAccounts?userId=${encodeURIComponent(userId)}`, {
|
|
202
|
+
method: 'GET',
|
|
203
|
+
headers: token ? getAuthHeaders(token) : getApiHeaders()
|
|
204
|
+
});
|
|
205
|
+
|
|
206
|
+
if (response.ok) {
|
|
207
|
+
const data: ConnectedAccountsResponse = await response.json();
|
|
208
|
+
console.log('✅ [LEGACY] Connected accounts fetched:', data);
|
|
209
|
+
|
|
210
|
+
if (data.success && data.connectedAccounts && data.connectedAccounts.length > 0) {
|
|
211
|
+
return data.connectedAccounts;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
console.log('⚠️ [LEGACY] API response not successful or empty');
|
|
216
|
+
return [];
|
|
217
|
+
|
|
218
|
+
} catch (error) {
|
|
219
|
+
console.log('❌ [LEGACY] Error fetching connected accounts by userId:', error);
|
|
220
|
+
return [];
|
|
221
|
+
}
|
|
222
|
+
};
|
|
223
|
+
|
|
224
|
+
/**
|
|
225
|
+
* Get platform icon based on platform name
|
|
226
|
+
* @param platform - Platform name (case insensitive)
|
|
227
|
+
* @returns Image source for the platform icon
|
|
228
|
+
*/
|
|
229
|
+
export const getPlatformIcon = (platform: string) => {
|
|
230
|
+
const platformLower = platform.toLowerCase();
|
|
231
|
+
|
|
232
|
+
switch (platformLower) {
|
|
233
|
+
case 'youtube':
|
|
234
|
+
return require('../assets/icons/YouTubeicon3.png');
|
|
235
|
+
case 'reddit':
|
|
236
|
+
return require('../assets/icons/Redditicon.png');
|
|
237
|
+
case 'linkedin':
|
|
238
|
+
return require('../assets/icons/Linkedinicon.png');
|
|
239
|
+
case 'instagram':
|
|
240
|
+
return require('../assets/icons/instagram.png');
|
|
241
|
+
case 'facebook':
|
|
242
|
+
return require('../assets/icons/Facebookicon.png');
|
|
243
|
+
case 'pinterest':
|
|
244
|
+
return require('../assets/icons/pinterest.png');
|
|
245
|
+
case 'gmail':
|
|
246
|
+
case 'email':
|
|
247
|
+
return require('../assets/icons/Gmail.png');
|
|
248
|
+
case 'twitter':
|
|
249
|
+
case 'x':
|
|
250
|
+
return require('../assets/icons/twitter.jpg');
|
|
251
|
+
case 'farcaster':
|
|
252
|
+
return require('../assets/icons/farcaster.png');
|
|
253
|
+
default:
|
|
254
|
+
return require('../assets/icons/swerv_logo.png'); // Default icon
|
|
255
|
+
}
|
|
256
|
+
};
|
|
257
|
+
|
|
258
|
+
/**
|
|
259
|
+
* Get platform color based on platform name
|
|
260
|
+
* @param platform - Platform name (case insensitive)
|
|
261
|
+
* @returns Hex color code for the platform
|
|
262
|
+
*/
|
|
263
|
+
export const getPlatformColor = (platform: string): string => {
|
|
264
|
+
const platformLower = platform.toLowerCase();
|
|
265
|
+
|
|
266
|
+
switch (platformLower) {
|
|
267
|
+
case 'youtube':
|
|
268
|
+
return '#FF0000';
|
|
269
|
+
case 'reddit':
|
|
270
|
+
return '#FF4500';
|
|
271
|
+
case 'linkedin':
|
|
272
|
+
return '#0077B5';
|
|
273
|
+
case 'instagram':
|
|
274
|
+
return '#E1306C';
|
|
275
|
+
case 'facebook':
|
|
276
|
+
return '#1877F2';
|
|
277
|
+
case 'pinterest':
|
|
278
|
+
return '#E60023';
|
|
279
|
+
case 'gmail':
|
|
280
|
+
case 'email':
|
|
281
|
+
return '#EA4335';
|
|
282
|
+
case 'twitter':
|
|
283
|
+
case 'x':
|
|
284
|
+
return '#1DA1F2';
|
|
285
|
+
case 'farcaster':
|
|
286
|
+
return '#8A63D2';
|
|
287
|
+
default:
|
|
288
|
+
return '#666666'; // Default gray
|
|
289
|
+
}
|
|
290
290
|
};
|