@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,139 +1,139 @@
1
- import { useState, useEffect, useCallback } from 'react';
2
- import {
3
- ConnectedAccount,
4
- getConnectedAccountsSmart,
5
- // Keep legacy imports for any edge cases
6
- getConnectedAccountsByUsername,
7
- getConnectedAccountsByEmail,
8
- getConnectedAccountsByUserId
9
- } from '../services/connectedAccountsService';
10
- import { useAuth } from '../context/AuthContext';
11
-
12
- export interface UseConnectedAccountsReturn {
13
- connectedAccounts: ConnectedAccount[];
14
- isLoading: boolean;
15
- error: string | null;
16
- refreshAccounts: () => Promise<void>;
17
- addAccount: (platform: string, username: string) => void;
18
- removeAccount: (platform: string) => void;
19
- }
20
-
21
- export const useConnectedAccounts = (): UseConnectedAccountsReturn => {
22
- const { user } = useAuth();
23
- const [connectedAccounts, setConnectedAccounts] = useState<ConnectedAccount[]>([]);
24
- const [isLoading, setIsLoading] = useState<boolean>(true);
25
- const [error, setError] = useState<string | null>(null);
26
-
27
- const fetchConnectedAccounts = useCallback(async () => {
28
- if (!user) {
29
- console.log('🔍 No user available for fetching connected accounts');
30
- setIsLoading(false);
31
- return;
32
- }
33
-
34
- try {
35
- setIsLoading(true);
36
- setError(null);
37
-
38
- console.log('🚀 [HOOK] Starting connected accounts fetch with new smart API...');
39
- console.log('🚀 [HOOK] User info available:', {
40
- email: user.email,
41
- id: user.id,
42
- name: user.name
43
- });
44
-
45
- // Use the new smart API function - makes only ONE request with intelligent fallbacks
46
- const accounts = await getConnectedAccountsSmart(
47
- user.email, // Primary identifier (email)
48
- user.id, // Secondary identifier (user ID)
49
- user.name // Tertiary identifier (username)
50
- );
51
-
52
- console.log(`✅ [HOOK] Connected accounts loaded via smart API: ${accounts.length} accounts`);
53
- setConnectedAccounts(accounts);
54
-
55
- } catch (err) {
56
- console.error('❌ [HOOK] Error fetching connected accounts:', err);
57
- setError('Failed to load connected accounts');
58
- } finally {
59
- setIsLoading(false);
60
- }
61
- }, [user]);
62
-
63
- const refreshAccounts = useCallback(async () => {
64
- console.log('🔄 [HOOK] Refreshing connected accounts...');
65
- await fetchConnectedAccounts();
66
- }, [fetchConnectedAccounts]);
67
-
68
- const addAccount = useCallback((platform: string, username: string) => {
69
- // Create a temporary URL for the account
70
- const tempUrl = `https://${platform.toLowerCase()}.com/${username}`;
71
-
72
- const newAccount: ConnectedAccount = {
73
- platform,
74
- username,
75
- url: tempUrl,
76
- };
77
-
78
- setConnectedAccounts(prev => {
79
- // Check if account already exists
80
- const exists = prev.some(acc =>
81
- acc.platform.toLowerCase() === platform.toLowerCase()
82
- );
83
-
84
- if (exists) {
85
- // Update existing account
86
- return prev.map(acc =>
87
- acc.platform.toLowerCase() === platform.toLowerCase()
88
- ? newAccount
89
- : acc
90
- );
91
- } else {
92
- // Add new account
93
- return [...prev, newAccount];
94
- }
95
- });
96
-
97
- console.log('✅ [HOOK] Account added locally:', newAccount);
98
-
99
- // TODO: In a real implementation, you would also send this to your backend
100
- // Example:
101
- // try {
102
- // await saveConnectedAccount(user.id, platform, username);
103
- // } catch (error) {
104
- // console.error('Failed to save account to backend:', error);
105
- // // Optionally revert the local change
106
- // }
107
- }, []);
108
-
109
- const removeAccount = useCallback((platform: string) => {
110
- setConnectedAccounts(prev =>
111
- prev.filter(acc => acc.platform.toLowerCase() !== platform.toLowerCase())
112
- );
113
-
114
- console.log('✅ [HOOK] Account removed locally:', platform);
115
-
116
- // TODO: In a real implementation, you would also remove this from your backend
117
- // Example:
118
- // try {
119
- // await removeConnectedAccount(user.id, platform);
120
- // } catch (error) {
121
- // console.error('Failed to remove account from backend:', error);
122
- // // Optionally revert the local change
123
- // }
124
- }, []);
125
-
126
- // Fetch accounts when component mounts or user changes
127
- useEffect(() => {
128
- fetchConnectedAccounts();
129
- }, [fetchConnectedAccounts]);
130
-
131
- return {
132
- connectedAccounts,
133
- isLoading,
134
- error,
135
- refreshAccounts,
136
- addAccount,
137
- removeAccount,
138
- };
1
+ import { useState, useEffect, useCallback } from 'react';
2
+ import {
3
+ ConnectedAccount,
4
+ getConnectedAccountsSmart,
5
+ // Keep legacy imports for any edge cases
6
+ getConnectedAccountsByUsername,
7
+ getConnectedAccountsByEmail,
8
+ getConnectedAccountsByUserId
9
+ } from '../services/connectedAccountsService';
10
+ import { useAuth } from '../context/AuthContext';
11
+
12
+ export interface UseConnectedAccountsReturn {
13
+ connectedAccounts: ConnectedAccount[];
14
+ isLoading: boolean;
15
+ error: string | null;
16
+ refreshAccounts: () => Promise<void>;
17
+ addAccount: (platform: string, username: string) => void;
18
+ removeAccount: (platform: string) => void;
19
+ }
20
+
21
+ export const useConnectedAccounts = (): UseConnectedAccountsReturn => {
22
+ const { user } = useAuth();
23
+ const [connectedAccounts, setConnectedAccounts] = useState<ConnectedAccount[]>([]);
24
+ const [isLoading, setIsLoading] = useState<boolean>(true);
25
+ const [error, setError] = useState<string | null>(null);
26
+
27
+ const fetchConnectedAccounts = useCallback(async () => {
28
+ if (!user) {
29
+ console.log('🔍 No user available for fetching connected accounts');
30
+ setIsLoading(false);
31
+ return;
32
+ }
33
+
34
+ try {
35
+ setIsLoading(true);
36
+ setError(null);
37
+
38
+ console.log('🚀 [HOOK] Starting connected accounts fetch with new smart API...');
39
+ console.log('🚀 [HOOK] User info available:', {
40
+ email: user.email,
41
+ id: user.id,
42
+ name: user.name
43
+ });
44
+
45
+ // Use the new smart API function - makes only ONE request with intelligent fallbacks
46
+ const accounts = await getConnectedAccountsSmart(
47
+ user.email, // Primary identifier (email)
48
+ user.id, // Secondary identifier (user ID)
49
+ user.name // Tertiary identifier (username)
50
+ );
51
+
52
+ console.log(`✅ [HOOK] Connected accounts loaded via smart API: ${accounts.length} accounts`);
53
+ setConnectedAccounts(accounts);
54
+
55
+ } catch (err) {
56
+ console.error('❌ [HOOK] Error fetching connected accounts:', err);
57
+ setError('Failed to load connected accounts');
58
+ } finally {
59
+ setIsLoading(false);
60
+ }
61
+ }, [user]);
62
+
63
+ const refreshAccounts = useCallback(async () => {
64
+ console.log('🔄 [HOOK] Refreshing connected accounts...');
65
+ await fetchConnectedAccounts();
66
+ }, [fetchConnectedAccounts]);
67
+
68
+ const addAccount = useCallback((platform: string, username: string) => {
69
+ // Create a temporary URL for the account
70
+ const tempUrl = `https://${platform.toLowerCase()}.com/${username}`;
71
+
72
+ const newAccount: ConnectedAccount = {
73
+ platform,
74
+ username,
75
+ url: tempUrl,
76
+ };
77
+
78
+ setConnectedAccounts(prev => {
79
+ // Check if account already exists
80
+ const exists = prev.some(acc =>
81
+ acc.platform.toLowerCase() === platform.toLowerCase()
82
+ );
83
+
84
+ if (exists) {
85
+ // Update existing account
86
+ return prev.map(acc =>
87
+ acc.platform.toLowerCase() === platform.toLowerCase()
88
+ ? newAccount
89
+ : acc
90
+ );
91
+ } else {
92
+ // Add new account
93
+ return [...prev, newAccount];
94
+ }
95
+ });
96
+
97
+ console.log('✅ [HOOK] Account added locally:', newAccount);
98
+
99
+ // TODO: In a real implementation, you would also send this to your backend
100
+ // Example:
101
+ // try {
102
+ // await saveConnectedAccount(user.id, platform, username);
103
+ // } catch (error) {
104
+ // console.error('Failed to save account to backend:', error);
105
+ // // Optionally revert the local change
106
+ // }
107
+ }, []);
108
+
109
+ const removeAccount = useCallback((platform: string) => {
110
+ setConnectedAccounts(prev =>
111
+ prev.filter(acc => acc.platform.toLowerCase() !== platform.toLowerCase())
112
+ );
113
+
114
+ console.log('✅ [HOOK] Account removed locally:', platform);
115
+
116
+ // TODO: In a real implementation, you would also remove this from your backend
117
+ // Example:
118
+ // try {
119
+ // await removeConnectedAccount(user.id, platform);
120
+ // } catch (error) {
121
+ // console.error('Failed to remove account from backend:', error);
122
+ // // Optionally revert the local change
123
+ // }
124
+ }, []);
125
+
126
+ // Fetch accounts when component mounts or user changes
127
+ useEffect(() => {
128
+ fetchConnectedAccounts();
129
+ }, [fetchConnectedAccounts]);
130
+
131
+ return {
132
+ connectedAccounts,
133
+ isLoading,
134
+ error,
135
+ refreshAccounts,
136
+ addAccount,
137
+ removeAccount,
138
+ };
139
139
  };
@@ -1,161 +1,161 @@
1
- import { useState, useCallback } from 'react';
2
- import { initiateOAuth, initiateNativeAuth, exchangeCodeForToken } from '../services/platformAuthService';
3
- import AsyncStorage from '@react-native-async-storage/async-storage';
4
- import { getOnairosUsername } from '../services/authService';
5
-
6
- export interface ConnectionStatus {
7
- [key: string]: {
8
- userName: string;
9
- connected: boolean;
10
- };
11
- }
12
-
13
- export const useConnections = () => {
14
- const [connections, setConnections] = useState<ConnectionStatus>({});
15
- const [isConnecting, setIsConnecting] = useState(false);
16
-
17
- /**
18
- * Connect a platform using OAuth or native SDK
19
- */
20
- const connectPlatform = useCallback(async (platform: string, username: string): Promise<boolean> => {
21
- try {
22
- setIsConnecting(true);
23
-
24
- // Determine if we should use native SDK or OAuth
25
- const useNativeSDK = platform === 'youtube' || platform === 'instagram';
26
-
27
- let success = false;
28
-
29
- if (useNativeSDK) {
30
- // Use native SDK
31
- success = await initiateNativeAuth(platform, username);
32
- } else {
33
- // For demo purposes, we'll simulate a successful connection
34
- await new Promise(resolve => setTimeout(() => resolve(undefined), 1000));
35
- success = true;
36
- }
37
-
38
- if (success) {
39
- // Update connections state locally
40
- setConnections(prev => ({
41
- ...prev,
42
- [platform]: { userName: username, connected: true }
43
- }));
44
-
45
- // Update user account info via API
46
- try {
47
- const token = await AsyncStorage.getItem('auth_token');
48
- // Get the stored Onairos username for API calls
49
- const storedUsername = await getOnairosUsername();
50
- const apiUsername = storedUsername || username;
51
-
52
- console.log(`🔗 Using username for ${platform} API call:`, {
53
- providedUsername: username,
54
- storedUsername,
55
- finalApiUsername: apiUsername
56
- });
57
-
58
- if (token) {
59
- const response = await fetch('https://api2.onairos.uk/enoch/users/update', {
60
- method: 'POST',
61
- headers: {
62
- 'Content-Type': 'application/json',
63
- 'Authorization': token
64
- },
65
- body: JSON.stringify({
66
- UpdateType: 'connection',
67
- updateType: 'Add',
68
- connection: platform,
69
- username: apiUsername // Use stored Onairos username
70
- })
71
- });
72
-
73
- console.log(`Platform connection update response for ${platform}:`, response.status);
74
- }
75
- } catch (apiError) {
76
- console.warn(`Error updating user connections for ${platform}, but continuing:`, apiError);
77
- // Continue even if the API call fails
78
- }
79
-
80
- return true;
81
- }
82
-
83
- return false;
84
- } catch (error) {
85
- console.error(`Error connecting platform ${platform}:`, error);
86
- return false;
87
- } finally {
88
- setIsConnecting(false);
89
- }
90
- }, []);
91
-
92
- /**
93
- * Disconnect a platform
94
- */
95
- const disconnectPlatform = useCallback(async (platform: string, username?: string): Promise<boolean> => {
96
- try {
97
- // Update local state
98
- setConnections(prev => {
99
- const newConnections = { ...prev };
100
- delete newConnections[platform];
101
- return newConnections;
102
- });
103
-
104
- // Update user account info via API
105
- try {
106
- const token = await AsyncStorage.getItem('auth_token');
107
- // Get the stored Onairos username for API calls
108
- const storedUsername = await getOnairosUsername();
109
- const apiUsername = storedUsername || username || 'user';
110
-
111
- console.log(`🔗 Using username for ${platform} disconnect API call:`, {
112
- providedUsername: username,
113
- storedUsername,
114
- finalApiUsername: apiUsername
115
- });
116
-
117
- if (token) {
118
- const response = await fetch('https://api2.onairos.uk/enoch/users/update', {
119
- method: 'POST',
120
- headers: {
121
- 'Content-Type': 'application/json',
122
- 'Authorization': token
123
- },
124
- body: JSON.stringify({
125
- UpdateType: 'connection',
126
- updateType: 'Remove',
127
- connection: platform,
128
- username: apiUsername // Use stored Onairos username
129
- })
130
- });
131
-
132
- console.log(`Platform disconnection update response for ${platform}:`, response.status);
133
- }
134
- } catch (apiError) {
135
- console.warn(`Error updating user connections for ${platform}, but continuing:`, apiError);
136
- // Continue even if the API call fails
137
- }
138
-
139
- return true;
140
- } catch (error) {
141
- console.error(`Error disconnecting platform ${platform}:`, error);
142
- return false;
143
- }
144
- }, []);
145
-
146
- /**
147
- * Get current connection status
148
- */
149
- const getConnectionStatus = useCallback(async (): Promise<ConnectionStatus> => {
150
- // In a real app, you might fetch this from storage or API
151
- return connections;
152
- }, [connections]);
153
-
154
- return {
155
- connections,
156
- connectPlatform,
157
- disconnectPlatform,
158
- getConnectionStatus,
159
- isConnecting
160
- };
161
- };
1
+ import { useState, useCallback } from 'react';
2
+ import { initiateOAuth, initiateNativeAuth, exchangeCodeForToken } from '../services/platformAuthService';
3
+ import AsyncStorage from '@react-native-async-storage/async-storage';
4
+ import { getOnairosUsername } from '../services/authService';
5
+
6
+ export interface ConnectionStatus {
7
+ [key: string]: {
8
+ userName: string;
9
+ connected: boolean;
10
+ };
11
+ }
12
+
13
+ export const useConnections = () => {
14
+ const [connections, setConnections] = useState<ConnectionStatus>({});
15
+ const [isConnecting, setIsConnecting] = useState(false);
16
+
17
+ /**
18
+ * Connect a platform using OAuth or native SDK
19
+ */
20
+ const connectPlatform = useCallback(async (platform: string, username: string): Promise<boolean> => {
21
+ try {
22
+ setIsConnecting(true);
23
+
24
+ // Determine if we should use native SDK or OAuth
25
+ const useNativeSDK = platform === 'youtube' || platform === 'instagram';
26
+
27
+ let success = false;
28
+
29
+ if (useNativeSDK) {
30
+ // Use native SDK
31
+ success = await initiateNativeAuth(platform, username);
32
+ } else {
33
+ // For demo purposes, we'll simulate a successful connection
34
+ await new Promise(resolve => setTimeout(() => resolve(undefined), 1000));
35
+ success = true;
36
+ }
37
+
38
+ if (success) {
39
+ // Update connections state locally
40
+ setConnections(prev => ({
41
+ ...prev,
42
+ [platform]: { userName: username, connected: true }
43
+ }));
44
+
45
+ // Update user account info via API
46
+ try {
47
+ const token = await AsyncStorage.getItem('auth_token');
48
+ // Get the stored Onairos username for API calls
49
+ const storedUsername = await getOnairosUsername();
50
+ const apiUsername = storedUsername || username;
51
+
52
+ console.log(`🔗 Using username for ${platform} API call:`, {
53
+ providedUsername: username,
54
+ storedUsername,
55
+ finalApiUsername: apiUsername
56
+ });
57
+
58
+ if (token) {
59
+ const response = await fetch('https://api2.onairos.uk/enoch/users/update', {
60
+ method: 'POST',
61
+ headers: {
62
+ 'Content-Type': 'application/json',
63
+ 'Authorization': token
64
+ },
65
+ body: JSON.stringify({
66
+ UpdateType: 'connection',
67
+ updateType: 'Add',
68
+ connection: platform,
69
+ username: apiUsername // Use stored Onairos username
70
+ })
71
+ });
72
+
73
+ console.log(`Platform connection update response for ${platform}:`, response.status);
74
+ }
75
+ } catch (apiError) {
76
+ console.warn(`Error updating user connections for ${platform}, but continuing:`, apiError);
77
+ // Continue even if the API call fails
78
+ }
79
+
80
+ return true;
81
+ }
82
+
83
+ return false;
84
+ } catch (error) {
85
+ console.error(`Error connecting platform ${platform}:`, error);
86
+ return false;
87
+ } finally {
88
+ setIsConnecting(false);
89
+ }
90
+ }, []);
91
+
92
+ /**
93
+ * Disconnect a platform
94
+ */
95
+ const disconnectPlatform = useCallback(async (platform: string, username?: string): Promise<boolean> => {
96
+ try {
97
+ // Update local state
98
+ setConnections(prev => {
99
+ const newConnections = { ...prev };
100
+ delete newConnections[platform];
101
+ return newConnections;
102
+ });
103
+
104
+ // Update user account info via API
105
+ try {
106
+ const token = await AsyncStorage.getItem('auth_token');
107
+ // Get the stored Onairos username for API calls
108
+ const storedUsername = await getOnairosUsername();
109
+ const apiUsername = storedUsername || username || 'user';
110
+
111
+ console.log(`🔗 Using username for ${platform} disconnect API call:`, {
112
+ providedUsername: username,
113
+ storedUsername,
114
+ finalApiUsername: apiUsername
115
+ });
116
+
117
+ if (token) {
118
+ const response = await fetch('https://api2.onairos.uk/enoch/users/update', {
119
+ method: 'POST',
120
+ headers: {
121
+ 'Content-Type': 'application/json',
122
+ 'Authorization': token
123
+ },
124
+ body: JSON.stringify({
125
+ UpdateType: 'connection',
126
+ updateType: 'Remove',
127
+ connection: platform,
128
+ username: apiUsername // Use stored Onairos username
129
+ })
130
+ });
131
+
132
+ console.log(`Platform disconnection update response for ${platform}:`, response.status);
133
+ }
134
+ } catch (apiError) {
135
+ console.warn(`Error updating user connections for ${platform}, but continuing:`, apiError);
136
+ // Continue even if the API call fails
137
+ }
138
+
139
+ return true;
140
+ } catch (error) {
141
+ console.error(`Error disconnecting platform ${platform}:`, error);
142
+ return false;
143
+ }
144
+ }, []);
145
+
146
+ /**
147
+ * Get current connection status
148
+ */
149
+ const getConnectionStatus = useCallback(async (): Promise<ConnectionStatus> => {
150
+ // In a real app, you might fetch this from storage or API
151
+ return connections;
152
+ }, [connections]);
153
+
154
+ return {
155
+ connections,
156
+ connectPlatform,
157
+ disconnectPlatform,
158
+ getConnectionStatus,
159
+ isConnecting
160
+ };
161
+ };