@onairos/react-native 3.1.16 → 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/OnairosButton.js +290 -0
- package/lib/commonjs/components/OnairosButton.js.map +1 -0
- package/lib/commonjs/components/OnairosSignInButton.js +30 -8
- 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 +9 -10
- 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/OnairosButton.js +282 -0
- package/lib/module/components/OnairosButton.js.map +1 -0
- package/lib/module/components/OnairosSignInButton.js +30 -8
- 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 +8 -10
- 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/OnairosButton.d.ts +37 -0
- package/lib/typescript/components/OnairosButton.d.ts.map +1 -0
- package/lib/typescript/components/OnairosSignInButton.d.ts +2 -1
- package/lib/typescript/components/OnairosSignInButton.d.ts.map +1 -1
- package/lib/typescript/index.d.ts +3 -4
- 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 -0
- package/src/components/OnairosSignInButton.tsx +30 -10
- 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 -0
- package/src/index.ts +94 -96
- 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,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
|
+
};
|