@onairos/react-native 3.1.16 → 3.1.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (207) hide show
  1. package/README.md +404 -0
  2. package/lib/commonjs/assets/images/Checkbox.svg +3 -3
  3. package/lib/commonjs/assets/images/EnochE.svg +19 -19
  4. package/lib/commonjs/assets/images/Personalityprofile.svg +3 -3
  5. package/lib/commonjs/assets/images/Personalitytraits.svg +3 -3
  6. package/lib/commonjs/assets/images/Userpreferences.svg +3 -3
  7. package/lib/commonjs/assets/images/arrow.svg +20 -20
  8. package/lib/commonjs/assets/images/basicproficon.svg +43 -43
  9. package/lib/commonjs/assets/images/basicprofile.svg +3 -3
  10. package/lib/commonjs/assets/images/checkmark.svg +4 -4
  11. package/lib/commonjs/assets/images/contentanalysis.svg +3 -3
  12. package/lib/commonjs/assets/images/contenticon.svg +23 -23
  13. package/lib/commonjs/assets/images/personalityicon.svg +18 -18
  14. package/lib/commonjs/assets/images/x-close.svg +3 -3
  15. package/lib/commonjs/components/ModalSheet.js +8 -2
  16. package/lib/commonjs/components/ModalSheet.js.map +1 -1
  17. package/lib/commonjs/components/OnairosButton.js +290 -0
  18. package/lib/commonjs/components/OnairosButton.js.map +1 -0
  19. package/lib/commonjs/components/OnairosSignInButton.js +32 -8
  20. package/lib/commonjs/components/OnairosSignInButton.js.map +1 -1
  21. package/lib/commonjs/components/UniversalOnboarding.js +4 -4
  22. package/lib/commonjs/components/WelcomeScreen.js +29 -13
  23. package/lib/commonjs/components/WelcomeScreen.js.map +1 -1
  24. package/lib/commonjs/config/api.js +2 -2
  25. package/lib/commonjs/hooks/useConnections.js +6 -6
  26. package/lib/commonjs/hooks/useUserConnections.js +10 -10
  27. package/lib/commonjs/index.js +13 -6
  28. package/lib/commonjs/index.js.map +1 -1
  29. package/lib/commonjs/services/apiClient.js +35 -35
  30. package/lib/commonjs/services/apiKeyService.js +99 -99
  31. package/lib/commonjs/services/authService.js +82 -82
  32. package/lib/commonjs/services/biometricPinService.js +10 -10
  33. package/lib/commonjs/services/connectedAccountsService.js +32 -32
  34. package/lib/commonjs/services/googleAuthService.js +15 -15
  35. package/lib/commonjs/services/imageCompressionService.js +15 -15
  36. package/lib/commonjs/services/jwtStorageService.js +59 -59
  37. package/lib/commonjs/services/mobileTrainingService.js +14 -14
  38. package/lib/commonjs/services/pinEncryptionService.js +10 -10
  39. package/lib/commonjs/services/pinStorageUtils.js +15 -15
  40. package/lib/commonjs/services/platformAuthService.js +47 -47
  41. package/lib/commonjs/services/storageService.js +31 -31
  42. package/lib/commonjs/services/trainingApiHelpers.js +33 -33
  43. package/lib/commonjs/services/userConnectionsService.js +24 -24
  44. package/lib/commonjs/utils/Portal.js +4 -4
  45. package/lib/commonjs/utils/api.js +24 -24
  46. package/lib/commonjs/utils/auth.js +18 -18
  47. package/lib/commonjs/utils/crypto.js +13 -13
  48. package/lib/commonjs/utils/encryption.js +12 -12
  49. package/lib/commonjs/utils/eventUtils.js +52 -52
  50. package/lib/commonjs/utils/programmaticFlow.js +16 -16
  51. package/lib/commonjs/utils/retryHelper.js +27 -27
  52. package/lib/module/assets/images/Checkbox.svg +3 -3
  53. package/lib/module/assets/images/EnochE.svg +19 -19
  54. package/lib/module/assets/images/Personalityprofile.svg +3 -3
  55. package/lib/module/assets/images/Personalitytraits.svg +3 -3
  56. package/lib/module/assets/images/Userpreferences.svg +3 -3
  57. package/lib/module/assets/images/arrow.svg +20 -20
  58. package/lib/module/assets/images/basicproficon.svg +43 -43
  59. package/lib/module/assets/images/basicprofile.svg +3 -3
  60. package/lib/module/assets/images/checkmark.svg +4 -4
  61. package/lib/module/assets/images/contentanalysis.svg +3 -3
  62. package/lib/module/assets/images/contenticon.svg +23 -23
  63. package/lib/module/assets/images/personalityicon.svg +18 -18
  64. package/lib/module/assets/images/x-close.svg +3 -3
  65. package/lib/module/components/ModalSheet.js +7 -2
  66. package/lib/module/components/ModalSheet.js.map +1 -1
  67. package/lib/module/components/OnairosButton.js +282 -0
  68. package/lib/module/components/OnairosButton.js.map +1 -0
  69. package/lib/module/components/OnairosSignInButton.js +32 -8
  70. package/lib/module/components/OnairosSignInButton.js.map +1 -1
  71. package/lib/module/components/UniversalOnboarding.js +4 -4
  72. package/lib/module/components/WelcomeScreen.js +25 -10
  73. package/lib/module/components/WelcomeScreen.js.map +1 -1
  74. package/lib/module/config/api.js +2 -2
  75. package/lib/module/hooks/useConnections.js +6 -6
  76. package/lib/module/hooks/useUserConnections.js +10 -10
  77. package/lib/module/index.js +11 -11
  78. package/lib/module/index.js.map +1 -1
  79. package/lib/module/services/apiClient.js +35 -35
  80. package/lib/module/services/apiKeyService.js +99 -99
  81. package/lib/module/services/authService.js +82 -82
  82. package/lib/module/services/biometricPinService.js +10 -10
  83. package/lib/module/services/connectedAccountsService.js +32 -32
  84. package/lib/module/services/googleAuthService.js +15 -15
  85. package/lib/module/services/imageCompressionService.js +15 -15
  86. package/lib/module/services/jwtStorageService.js +59 -59
  87. package/lib/module/services/mobileTrainingService.js +14 -14
  88. package/lib/module/services/pinEncryptionService.js +10 -10
  89. package/lib/module/services/pinStorageUtils.js +15 -15
  90. package/lib/module/services/platformAuthService.js +47 -47
  91. package/lib/module/services/storageService.js +31 -31
  92. package/lib/module/services/trainingApiHelpers.js +33 -33
  93. package/lib/module/services/userConnectionsService.js +24 -24
  94. package/lib/module/utils/Portal.js +4 -4
  95. package/lib/module/utils/api.js +24 -24
  96. package/lib/module/utils/auth.js +18 -18
  97. package/lib/module/utils/crypto.js +13 -13
  98. package/lib/module/utils/encryption.js +12 -12
  99. package/lib/module/utils/eventUtils.js +52 -52
  100. package/lib/module/utils/programmaticFlow.js +16 -16
  101. package/lib/module/utils/retryHelper.js +27 -27
  102. package/lib/typescript/components/ModalSheet.d.ts.map +1 -1
  103. package/lib/typescript/components/OnairosButton.d.ts +37 -0
  104. package/lib/typescript/components/OnairosButton.d.ts.map +1 -0
  105. package/lib/typescript/components/OnairosSignInButton.d.ts.map +1 -1
  106. package/lib/typescript/components/WelcomeScreen.d.ts.map +1 -1
  107. package/lib/typescript/index.d.ts +3 -1
  108. package/lib/typescript/index.d.ts.map +1 -1
  109. package/package.json +145 -163
  110. package/src/api/index.ts +151 -151
  111. package/src/assets/images/Checkbox.svg +3 -3
  112. package/src/assets/images/EnochE.svg +19 -19
  113. package/src/assets/images/Personalityprofile.svg +3 -3
  114. package/src/assets/images/Personalitytraits.svg +3 -3
  115. package/src/assets/images/Userpreferences.svg +3 -3
  116. package/src/assets/images/arrow.svg +20 -20
  117. package/src/assets/images/basicproficon.svg +43 -43
  118. package/src/assets/images/basicprofile.svg +3 -3
  119. package/src/assets/images/checkmark.svg +4 -4
  120. package/src/assets/images/contentanalysis.svg +3 -3
  121. package/src/assets/images/contenticon.svg +23 -23
  122. package/src/assets/images/personalityicon.svg +18 -18
  123. package/src/assets/images/x-close.svg +3 -3
  124. package/src/components/BodyText.tsx +33 -33
  125. package/src/components/BrandMark.tsx +62 -62
  126. package/src/components/CodeInput.tsx +32 -32
  127. package/src/components/DataRequestScreen.tsx +355 -355
  128. package/src/components/EmailInput.tsx +31 -31
  129. package/src/components/EmailVerificationModal.tsx +363 -363
  130. package/src/components/ExistingUserDataConfirmation.tsx +506 -506
  131. package/src/components/GoogleButton.tsx +55 -55
  132. package/src/components/HeadingGroup.tsx +49 -49
  133. package/src/components/ModalHeader.tsx +125 -125
  134. package/src/components/ModalSheet.tsx +59 -57
  135. package/src/components/Onairos.tsx +422 -422
  136. package/src/components/OnairosButton.tsx +339 -0
  137. package/src/components/OnairosSignInButton.tsx +31 -9
  138. package/src/components/Overlay.tsx +506 -506
  139. package/src/components/PersonaImage.tsx +79 -79
  140. package/src/components/PersonaLoadingScreen.tsx +201 -201
  141. package/src/components/PersonalizationConsentScreen.tsx +410 -410
  142. package/src/components/PinCreationScreen.tsx +492 -492
  143. package/src/components/PinInput.tsx +555 -555
  144. package/src/components/PlatformConnectorsStep.tsx +891 -891
  145. package/src/components/PlatformList.tsx +144 -144
  146. package/src/components/PlatformToggle.tsx +226 -226
  147. package/src/components/PrimaryButton.tsx +213 -213
  148. package/src/components/SignInMatchAnimation.tsx +225 -225
  149. package/src/components/SignInStep.tsx +217 -217
  150. package/src/components/TrainingModal.tsx +1047 -1047
  151. package/src/components/UniversalOnboarding.tsx +2887 -2887
  152. package/src/components/VerificationStep.tsx +198 -198
  153. package/src/components/WelcomeScreen.tsx +490 -473
  154. package/src/components/icons/Basicproficon.tsx +30 -30
  155. package/src/components/icons/Basicprofile.tsx +17 -17
  156. package/src/components/icons/Checkbox.tsx +17 -17
  157. package/src/components/icons/Checkmark.tsx +24 -24
  158. package/src/components/icons/Contentanalysis.tsx +17 -17
  159. package/src/components/icons/Contenticon.tsx +30 -30
  160. package/src/components/icons/EnochE.tsx +39 -39
  161. package/src/components/icons/Personalityicon.tsx +22 -22
  162. package/src/components/icons/Personalityprofile.tsx +17 -17
  163. package/src/components/icons/Personalitytraits.tsx +17 -17
  164. package/src/components/icons/Userpreferences.tsx +17 -17
  165. package/src/components/icons/index.ts +12 -12
  166. package/src/components/onboarding/OAuthWebView.tsx +232 -232
  167. package/src/config/api.ts +25 -25
  168. package/src/context/AuthContext.tsx +393 -393
  169. package/src/hooks/useConnectedAccounts.ts +138 -138
  170. package/src/hooks/useConnections.ts +161 -161
  171. package/src/hooks/useCredentials.ts +174 -174
  172. package/src/hooks/useUserConnections.ts +165 -165
  173. package/src/index.js +14 -0
  174. package/src/index.ts +99 -96
  175. package/src/services/apiClient.ts +336 -336
  176. package/src/services/apiKeyService.ts +919 -919
  177. package/src/services/authService.ts +1008 -1008
  178. package/src/services/biometricPinService.ts +192 -192
  179. package/src/services/connectedAccountsService.ts +289 -289
  180. package/src/services/googleAuthService.ts +279 -279
  181. package/src/services/imageCompressionService.ts +302 -302
  182. package/src/services/jwtStorageService.ts +256 -256
  183. package/src/services/mobileTrainingService.ts +203 -203
  184. package/src/services/pinEncryptionService.ts +75 -75
  185. package/src/services/pinStorageUtils.ts +96 -96
  186. package/src/services/platformAuthService.ts +1346 -1346
  187. package/src/services/storageService.ts +451 -451
  188. package/src/services/trainingApiHelpers.ts +66 -66
  189. package/src/services/userConnectionsService.ts +556 -556
  190. package/src/services/youtubeMigrationService.ts +453 -453
  191. package/src/theme/index.ts +239 -239
  192. package/src/types/ambient.d.ts +28 -28
  193. package/src/types/index.ts +265 -265
  194. package/src/types/node-fix.d.ts +18 -18
  195. package/src/types/node-override.d.ts +23 -23
  196. package/src/types/opacity.d.ts +15 -15
  197. package/src/types/types.d.ts +17 -17
  198. package/src/utils/Portal.tsx +82 -82
  199. package/src/utils/api.js +111 -111
  200. package/src/utils/auth.js +103 -103
  201. package/src/utils/crypto.js +59 -59
  202. package/src/utils/encryption.ts +68 -68
  203. package/src/utils/eventUtils.ts +302 -302
  204. package/src/utils/haptics.ts +58 -58
  205. package/src/utils/imagePreloader.ts +2 -2
  206. package/src/utils/programmaticFlow.ts +112 -112
  207. 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
  };