@onairos/react-native 3.1.15 → 3.1.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +404 -0
- package/lib/commonjs/assets/images/Checkbox.svg +3 -3
- package/lib/commonjs/assets/images/EnochE.svg +19 -19
- package/lib/commonjs/assets/images/Personalityprofile.svg +3 -3
- package/lib/commonjs/assets/images/Personalitytraits.svg +3 -3
- package/lib/commonjs/assets/images/Userpreferences.svg +3 -3
- package/lib/commonjs/assets/images/arrow.svg +20 -20
- package/lib/commonjs/assets/images/basicproficon.svg +43 -43
- package/lib/commonjs/assets/images/basicprofile.svg +3 -3
- package/lib/commonjs/assets/images/checkmark.svg +4 -4
- package/lib/commonjs/assets/images/contentanalysis.svg +3 -3
- package/lib/commonjs/assets/images/contenticon.svg +23 -23
- package/lib/commonjs/assets/images/personalityicon.svg +18 -18
- package/lib/commonjs/assets/images/x-close.svg +3 -3
- package/lib/commonjs/components/OnairosSignInButton.js +32 -74
- package/lib/commonjs/components/OnairosSignInButton.js.map +1 -1
- package/lib/commonjs/components/UniversalOnboarding.js +4 -4
- package/lib/commonjs/config/api.js +2 -2
- package/lib/commonjs/hooks/useConnections.js +6 -6
- package/lib/commonjs/hooks/useUserConnections.js +10 -10
- package/lib/commonjs/index.js +5 -12
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/services/apiClient.js +35 -35
- package/lib/commonjs/services/apiKeyService.js +99 -99
- package/lib/commonjs/services/authService.js +82 -82
- package/lib/commonjs/services/biometricPinService.js +10 -10
- package/lib/commonjs/services/connectedAccountsService.js +32 -32
- package/lib/commonjs/services/googleAuthService.js +15 -15
- package/lib/commonjs/services/imageCompressionService.js +15 -15
- package/lib/commonjs/services/jwtStorageService.js +59 -59
- package/lib/commonjs/services/mobileTrainingService.js +14 -14
- package/lib/commonjs/services/pinEncryptionService.js +10 -10
- package/lib/commonjs/services/pinStorageUtils.js +15 -15
- package/lib/commonjs/services/platformAuthService.js +47 -47
- package/lib/commonjs/services/storageService.js +31 -31
- package/lib/commonjs/services/trainingApiHelpers.js +33 -33
- package/lib/commonjs/services/userConnectionsService.js +24 -24
- package/lib/commonjs/utils/Portal.js +4 -4
- package/lib/commonjs/utils/api.js +24 -24
- package/lib/commonjs/utils/auth.js +18 -18
- package/lib/commonjs/utils/crypto.js +13 -13
- package/lib/commonjs/utils/encryption.js +12 -12
- package/lib/commonjs/utils/eventUtils.js +52 -52
- package/lib/commonjs/utils/programmaticFlow.js +16 -16
- package/lib/commonjs/utils/retryHelper.js +27 -27
- package/lib/module/assets/images/Checkbox.svg +3 -3
- package/lib/module/assets/images/EnochE.svg +19 -19
- package/lib/module/assets/images/Personalityprofile.svg +3 -3
- package/lib/module/assets/images/Personalitytraits.svg +3 -3
- package/lib/module/assets/images/Userpreferences.svg +3 -3
- package/lib/module/assets/images/arrow.svg +20 -20
- package/lib/module/assets/images/basicproficon.svg +43 -43
- package/lib/module/assets/images/basicprofile.svg +3 -3
- package/lib/module/assets/images/checkmark.svg +4 -4
- package/lib/module/assets/images/contentanalysis.svg +3 -3
- package/lib/module/assets/images/contenticon.svg +23 -23
- package/lib/module/assets/images/personalityicon.svg +18 -18
- package/lib/module/assets/images/x-close.svg +3 -3
- package/lib/module/components/OnairosSignInButton.js +32 -74
- package/lib/module/components/OnairosSignInButton.js.map +1 -1
- package/lib/module/components/UniversalOnboarding.js +4 -4
- package/lib/module/config/api.js +2 -2
- package/lib/module/hooks/useConnections.js +6 -6
- package/lib/module/hooks/useUserConnections.js +10 -10
- package/lib/module/index.js +5 -6
- package/lib/module/index.js.map +1 -1
- package/lib/module/services/apiClient.js +35 -35
- package/lib/module/services/apiKeyService.js +99 -99
- package/lib/module/services/authService.js +82 -82
- package/lib/module/services/biometricPinService.js +10 -10
- package/lib/module/services/connectedAccountsService.js +32 -32
- package/lib/module/services/googleAuthService.js +15 -15
- package/lib/module/services/imageCompressionService.js +15 -15
- package/lib/module/services/jwtStorageService.js +59 -59
- package/lib/module/services/mobileTrainingService.js +14 -14
- package/lib/module/services/pinEncryptionService.js +10 -10
- package/lib/module/services/pinStorageUtils.js +15 -15
- package/lib/module/services/platformAuthService.js +47 -47
- package/lib/module/services/storageService.js +31 -31
- package/lib/module/services/trainingApiHelpers.js +33 -33
- package/lib/module/services/userConnectionsService.js +24 -24
- package/lib/module/utils/Portal.js +4 -4
- package/lib/module/utils/api.js +24 -24
- package/lib/module/utils/auth.js +18 -18
- package/lib/module/utils/crypto.js +13 -13
- package/lib/module/utils/encryption.js +12 -12
- package/lib/module/utils/eventUtils.js +52 -52
- package/lib/module/utils/programmaticFlow.js +16 -16
- package/lib/module/utils/retryHelper.js +27 -27
- package/lib/typescript/components/OnairosSignInButton.d.ts.map +1 -1
- package/lib/typescript/index.d.ts +0 -1
- package/lib/typescript/index.d.ts.map +1 -1
- package/package.json +163 -163
- package/src/api/index.ts +151 -151
- package/src/assets/images/Checkbox.svg +3 -3
- package/src/assets/images/EnochE.svg +19 -19
- package/src/assets/images/Personalityprofile.svg +3 -3
- package/src/assets/images/Personalitytraits.svg +3 -3
- package/src/assets/images/Userpreferences.svg +3 -3
- package/src/assets/images/arrow.svg +20 -20
- package/src/assets/images/basicproficon.svg +43 -43
- package/src/assets/images/basicprofile.svg +3 -3
- package/src/assets/images/checkmark.svg +4 -4
- package/src/assets/images/contentanalysis.svg +3 -3
- package/src/assets/images/contenticon.svg +23 -23
- package/src/assets/images/personalityicon.svg +18 -18
- package/src/assets/images/x-close.svg +3 -3
- package/src/components/BodyText.tsx +33 -33
- package/src/components/BrandMark.tsx +62 -62
- package/src/components/CodeInput.tsx +32 -32
- package/src/components/DataRequestScreen.tsx +355 -355
- package/src/components/EmailInput.tsx +31 -31
- package/src/components/EmailVerificationModal.tsx +363 -363
- package/src/components/ExistingUserDataConfirmation.tsx +506 -506
- package/src/components/GoogleButton.tsx +55 -55
- package/src/components/HeadingGroup.tsx +49 -49
- package/src/components/ModalHeader.tsx +125 -125
- package/src/components/ModalSheet.tsx +57 -57
- package/src/components/Onairos.tsx +422 -422
- package/src/components/OnairosButton.tsx +339 -339
- package/src/components/OnairosSignInButton.tsx +130 -166
- package/src/components/Overlay.tsx +506 -506
- package/src/components/PersonaImage.tsx +79 -79
- package/src/components/PersonaLoadingScreen.tsx +201 -201
- package/src/components/PersonalizationConsentScreen.tsx +410 -410
- package/src/components/PinCreationScreen.tsx +492 -492
- package/src/components/PinInput.tsx +555 -555
- package/src/components/PlatformConnectorsStep.tsx +891 -891
- package/src/components/PlatformList.tsx +144 -144
- package/src/components/PlatformToggle.tsx +226 -226
- package/src/components/PrimaryButton.tsx +213 -213
- package/src/components/SignInMatchAnimation.tsx +225 -225
- package/src/components/SignInStep.tsx +217 -217
- package/src/components/TrainingModal.tsx +1047 -1047
- package/src/components/UniversalOnboarding.tsx +2887 -2887
- package/src/components/VerificationStep.tsx +198 -198
- package/src/components/WelcomeScreen.tsx +473 -473
- package/src/components/icons/Basicproficon.tsx +30 -30
- package/src/components/icons/Basicprofile.tsx +17 -17
- package/src/components/icons/Checkbox.tsx +17 -17
- package/src/components/icons/Checkmark.tsx +24 -24
- package/src/components/icons/Contentanalysis.tsx +17 -17
- package/src/components/icons/Contenticon.tsx +30 -30
- package/src/components/icons/EnochE.tsx +39 -39
- package/src/components/icons/Personalityicon.tsx +22 -22
- package/src/components/icons/Personalityprofile.tsx +17 -17
- package/src/components/icons/Personalitytraits.tsx +17 -17
- package/src/components/icons/Userpreferences.tsx +17 -17
- package/src/components/icons/index.ts +12 -12
- package/src/components/onboarding/OAuthWebView.tsx +232 -232
- package/src/config/api.ts +25 -25
- package/src/context/AuthContext.tsx +393 -393
- package/src/hooks/useConnectedAccounts.ts +138 -138
- package/src/hooks/useConnections.ts +161 -161
- package/src/hooks/useCredentials.ts +174 -174
- package/src/hooks/useUserConnections.ts +165 -165
- package/src/index.js +14 -14
- package/src/index.ts +94 -95
- package/src/services/apiClient.ts +336 -336
- package/src/services/apiKeyService.ts +919 -919
- package/src/services/authService.ts +1008 -1008
- package/src/services/biometricPinService.ts +192 -192
- package/src/services/connectedAccountsService.ts +289 -289
- package/src/services/googleAuthService.ts +279 -279
- package/src/services/imageCompressionService.ts +302 -302
- package/src/services/jwtStorageService.ts +256 -256
- package/src/services/mobileTrainingService.ts +203 -203
- package/src/services/pinEncryptionService.ts +75 -75
- package/src/services/pinStorageUtils.ts +96 -96
- package/src/services/platformAuthService.ts +1346 -1346
- package/src/services/storageService.ts +451 -451
- package/src/services/trainingApiHelpers.ts +66 -66
- package/src/services/userConnectionsService.ts +556 -556
- package/src/services/youtubeMigrationService.ts +453 -453
- package/src/theme/index.ts +239 -239
- package/src/types/ambient.d.ts +28 -28
- package/src/types/index.ts +265 -265
- package/src/types/node-fix.d.ts +18 -18
- package/src/types/node-override.d.ts +23 -23
- package/src/types/opacity.d.ts +15 -15
- package/src/types/types.d.ts +17 -17
- package/src/utils/Portal.tsx +82 -82
- package/src/utils/api.js +111 -111
- package/src/utils/auth.js +103 -103
- package/src/utils/crypto.js +59 -59
- package/src/utils/encryption.ts +68 -68
- package/src/utils/eventUtils.ts +302 -302
- package/src/utils/haptics.ts +58 -58
- package/src/utils/imagePreloader.ts +2 -2
- package/src/utils/programmaticFlow.ts +112 -112
- package/src/utils/retryHelper.ts +274 -274
|
@@ -1,175 +1,175 @@
|
|
|
1
|
-
import { useCallback } from 'react';
|
|
2
|
-
import { STORAGE_KEYS } from '../constants';
|
|
3
|
-
import type { CredentialsResult } from '../types';
|
|
4
|
-
|
|
5
|
-
// Create a mock storage for environments without Keychain access
|
|
6
|
-
const mockCredentialStorage: Record<string, any> = {};
|
|
7
|
-
|
|
8
|
-
// Try to import Keychain, but provide fallbacks if not available
|
|
9
|
-
let Keychain: any = null;
|
|
10
|
-
try {
|
|
11
|
-
Keychain = require('react-native-keychain');
|
|
12
|
-
} catch (error) {
|
|
13
|
-
console.warn('react-native-keychain module not available in useCredentials, using mock storage');
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
// Check if Keychain is properly initialized and available
|
|
17
|
-
const isKeychainAvailable = () => {
|
|
18
|
-
try {
|
|
19
|
-
return Keychain && typeof Keychain.getGenericPassword === 'function';
|
|
20
|
-
} catch (e) {
|
|
21
|
-
return false;
|
|
22
|
-
}
|
|
23
|
-
};
|
|
24
|
-
|
|
25
|
-
// Safe wrapper for getGenericPassword
|
|
26
|
-
const safeGetGenericPassword = async (options: any) => {
|
|
27
|
-
try {
|
|
28
|
-
if (isKeychainAvailable()) {
|
|
29
|
-
return await Keychain.getGenericPassword(options);
|
|
30
|
-
} else {
|
|
31
|
-
const key = options?.service || 'default';
|
|
32
|
-
return mockCredentialStorage[key] || null;
|
|
33
|
-
}
|
|
34
|
-
} catch (error) {
|
|
35
|
-
console.warn('Keychain access failed, using mock storage', error);
|
|
36
|
-
const key = options?.service || 'default';
|
|
37
|
-
return mockCredentialStorage[key] || null;
|
|
38
|
-
}
|
|
39
|
-
};
|
|
40
|
-
|
|
41
|
-
// Safe wrapper for setGenericPassword
|
|
42
|
-
const safeSetGenericPassword = async (username: string, password: string, options?: any) => {
|
|
43
|
-
try {
|
|
44
|
-
if (isKeychainAvailable()) {
|
|
45
|
-
return await Keychain.setGenericPassword(username, password, options);
|
|
46
|
-
} else {
|
|
47
|
-
const key = options?.service || 'default';
|
|
48
|
-
mockCredentialStorage[key] = { username, password };
|
|
49
|
-
return true;
|
|
50
|
-
}
|
|
51
|
-
} catch (error) {
|
|
52
|
-
console.warn('Keychain access failed, using mock storage', error);
|
|
53
|
-
const key = options?.service || 'default';
|
|
54
|
-
mockCredentialStorage[key] = { username, password };
|
|
55
|
-
return true;
|
|
56
|
-
}
|
|
57
|
-
};
|
|
58
|
-
|
|
59
|
-
// Safe wrapper for resetGenericPassword
|
|
60
|
-
const safeResetGenericPassword = async (options?: any) => {
|
|
61
|
-
try {
|
|
62
|
-
if (isKeychainAvailable()) {
|
|
63
|
-
return await Keychain.resetGenericPassword(options);
|
|
64
|
-
} else {
|
|
65
|
-
const key = options?.service || 'default';
|
|
66
|
-
delete mockCredentialStorage[key];
|
|
67
|
-
return true;
|
|
68
|
-
}
|
|
69
|
-
} catch (error) {
|
|
70
|
-
console.warn('Keychain access failed, using mock storage', error);
|
|
71
|
-
const key = options?.service || 'default';
|
|
72
|
-
delete mockCredentialStorage[key];
|
|
73
|
-
return true;
|
|
74
|
-
}
|
|
75
|
-
};
|
|
76
|
-
|
|
77
|
-
export const useCredentials = () => {
|
|
78
|
-
const hasCredentials = useCallback(async (): Promise<boolean> => {
|
|
79
|
-
try {
|
|
80
|
-
const credentials = await safeGetGenericPassword({
|
|
81
|
-
service: STORAGE_KEYS.credentials
|
|
82
|
-
});
|
|
83
|
-
return !!credentials;
|
|
84
|
-
} catch (error) {
|
|
85
|
-
console.error('Error checking credentials:', error);
|
|
86
|
-
return false;
|
|
87
|
-
}
|
|
88
|
-
}, []);
|
|
89
|
-
|
|
90
|
-
const getCredentials = useCallback(async () => {
|
|
91
|
-
try {
|
|
92
|
-
const credentials = await safeGetGenericPassword({
|
|
93
|
-
service: STORAGE_KEYS.credentials
|
|
94
|
-
});
|
|
95
|
-
if (credentials) {
|
|
96
|
-
return JSON.parse(credentials.password);
|
|
97
|
-
}
|
|
98
|
-
return null;
|
|
99
|
-
} catch (error) {
|
|
100
|
-
console.error('Error getting credentials:', error);
|
|
101
|
-
return null;
|
|
102
|
-
}
|
|
103
|
-
}, []);
|
|
104
|
-
|
|
105
|
-
const storeCredentials = useCallback(async (
|
|
106
|
-
username: string,
|
|
107
|
-
userPin: string,
|
|
108
|
-
accessToken: string
|
|
109
|
-
): Promise<boolean> => {
|
|
110
|
-
try {
|
|
111
|
-
const options: any = {
|
|
112
|
-
service: STORAGE_KEYS.credentials
|
|
113
|
-
};
|
|
114
|
-
|
|
115
|
-
// Only use secure storage options on real devices
|
|
116
|
-
if (isKeychainAvailable()) {
|
|
117
|
-
options.accessControl = Keychain.ACCESS_CONTROL?.BIOMETRY_ANY;
|
|
118
|
-
options.accessible = Keychain.ACCESSIBLE?.WHEN_UNLOCKED;
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
await safeSetGenericPassword(
|
|
122
|
-
username,
|
|
123
|
-
JSON.stringify({ userPin, accessToken }),
|
|
124
|
-
options
|
|
125
|
-
);
|
|
126
|
-
return true;
|
|
127
|
-
} catch (error) {
|
|
128
|
-
console.error('Error storing credentials:', error);
|
|
129
|
-
return false;
|
|
130
|
-
}
|
|
131
|
-
}, []);
|
|
132
|
-
|
|
133
|
-
const clearCredentials = useCallback(async (): Promise<void> => {
|
|
134
|
-
try {
|
|
135
|
-
await safeResetGenericPassword({
|
|
136
|
-
service: STORAGE_KEYS.credentials
|
|
137
|
-
});
|
|
138
|
-
} catch (error) {
|
|
139
|
-
console.error('Error clearing credentials:', error);
|
|
140
|
-
}
|
|
141
|
-
}, []);
|
|
142
|
-
|
|
143
|
-
const validateCredentials = useCallback(async (username: string): Promise<CredentialsResult> => {
|
|
144
|
-
try {
|
|
145
|
-
const response = await fetch(`https://api2.onairos.uk/validate`, {
|
|
146
|
-
method: 'POST',
|
|
147
|
-
headers: {
|
|
148
|
-
'Content-Type': 'application/json',
|
|
149
|
-
},
|
|
150
|
-
body: JSON.stringify({ username }),
|
|
151
|
-
});
|
|
152
|
-
|
|
153
|
-
const data = await response.json();
|
|
154
|
-
return {
|
|
155
|
-
success: true,
|
|
156
|
-
isValid: data.valid,
|
|
157
|
-
credentials: data.credentials,
|
|
158
|
-
};
|
|
159
|
-
} catch (error) {
|
|
160
|
-
console.error('Error validating credentials:', error);
|
|
161
|
-
return {
|
|
162
|
-
success: false,
|
|
163
|
-
isValid: false
|
|
164
|
-
};
|
|
165
|
-
}
|
|
166
|
-
}, []);
|
|
167
|
-
|
|
168
|
-
return {
|
|
169
|
-
hasCredentials,
|
|
170
|
-
getCredentials,
|
|
171
|
-
storeCredentials,
|
|
172
|
-
clearCredentials,
|
|
173
|
-
validateCredentials,
|
|
174
|
-
};
|
|
1
|
+
import { useCallback } from 'react';
|
|
2
|
+
import { STORAGE_KEYS } from '../constants';
|
|
3
|
+
import type { CredentialsResult } from '../types';
|
|
4
|
+
|
|
5
|
+
// Create a mock storage for environments without Keychain access
|
|
6
|
+
const mockCredentialStorage: Record<string, any> = {};
|
|
7
|
+
|
|
8
|
+
// Try to import Keychain, but provide fallbacks if not available
|
|
9
|
+
let Keychain: any = null;
|
|
10
|
+
try {
|
|
11
|
+
Keychain = require('react-native-keychain');
|
|
12
|
+
} catch (error) {
|
|
13
|
+
console.warn('react-native-keychain module not available in useCredentials, using mock storage');
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
// Check if Keychain is properly initialized and available
|
|
17
|
+
const isKeychainAvailable = () => {
|
|
18
|
+
try {
|
|
19
|
+
return Keychain && typeof Keychain.getGenericPassword === 'function';
|
|
20
|
+
} catch (e) {
|
|
21
|
+
return false;
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
// Safe wrapper for getGenericPassword
|
|
26
|
+
const safeGetGenericPassword = async (options: any) => {
|
|
27
|
+
try {
|
|
28
|
+
if (isKeychainAvailable()) {
|
|
29
|
+
return await Keychain.getGenericPassword(options);
|
|
30
|
+
} else {
|
|
31
|
+
const key = options?.service || 'default';
|
|
32
|
+
return mockCredentialStorage[key] || null;
|
|
33
|
+
}
|
|
34
|
+
} catch (error) {
|
|
35
|
+
console.warn('Keychain access failed, using mock storage', error);
|
|
36
|
+
const key = options?.service || 'default';
|
|
37
|
+
return mockCredentialStorage[key] || null;
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
// Safe wrapper for setGenericPassword
|
|
42
|
+
const safeSetGenericPassword = async (username: string, password: string, options?: any) => {
|
|
43
|
+
try {
|
|
44
|
+
if (isKeychainAvailable()) {
|
|
45
|
+
return await Keychain.setGenericPassword(username, password, options);
|
|
46
|
+
} else {
|
|
47
|
+
const key = options?.service || 'default';
|
|
48
|
+
mockCredentialStorage[key] = { username, password };
|
|
49
|
+
return true;
|
|
50
|
+
}
|
|
51
|
+
} catch (error) {
|
|
52
|
+
console.warn('Keychain access failed, using mock storage', error);
|
|
53
|
+
const key = options?.service || 'default';
|
|
54
|
+
mockCredentialStorage[key] = { username, password };
|
|
55
|
+
return true;
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
// Safe wrapper for resetGenericPassword
|
|
60
|
+
const safeResetGenericPassword = async (options?: any) => {
|
|
61
|
+
try {
|
|
62
|
+
if (isKeychainAvailable()) {
|
|
63
|
+
return await Keychain.resetGenericPassword(options);
|
|
64
|
+
} else {
|
|
65
|
+
const key = options?.service || 'default';
|
|
66
|
+
delete mockCredentialStorage[key];
|
|
67
|
+
return true;
|
|
68
|
+
}
|
|
69
|
+
} catch (error) {
|
|
70
|
+
console.warn('Keychain access failed, using mock storage', error);
|
|
71
|
+
const key = options?.service || 'default';
|
|
72
|
+
delete mockCredentialStorage[key];
|
|
73
|
+
return true;
|
|
74
|
+
}
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
export const useCredentials = () => {
|
|
78
|
+
const hasCredentials = useCallback(async (): Promise<boolean> => {
|
|
79
|
+
try {
|
|
80
|
+
const credentials = await safeGetGenericPassword({
|
|
81
|
+
service: STORAGE_KEYS.credentials
|
|
82
|
+
});
|
|
83
|
+
return !!credentials;
|
|
84
|
+
} catch (error) {
|
|
85
|
+
console.error('Error checking credentials:', error);
|
|
86
|
+
return false;
|
|
87
|
+
}
|
|
88
|
+
}, []);
|
|
89
|
+
|
|
90
|
+
const getCredentials = useCallback(async () => {
|
|
91
|
+
try {
|
|
92
|
+
const credentials = await safeGetGenericPassword({
|
|
93
|
+
service: STORAGE_KEYS.credentials
|
|
94
|
+
});
|
|
95
|
+
if (credentials) {
|
|
96
|
+
return JSON.parse(credentials.password);
|
|
97
|
+
}
|
|
98
|
+
return null;
|
|
99
|
+
} catch (error) {
|
|
100
|
+
console.error('Error getting credentials:', error);
|
|
101
|
+
return null;
|
|
102
|
+
}
|
|
103
|
+
}, []);
|
|
104
|
+
|
|
105
|
+
const storeCredentials = useCallback(async (
|
|
106
|
+
username: string,
|
|
107
|
+
userPin: string,
|
|
108
|
+
accessToken: string
|
|
109
|
+
): Promise<boolean> => {
|
|
110
|
+
try {
|
|
111
|
+
const options: any = {
|
|
112
|
+
service: STORAGE_KEYS.credentials
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
// Only use secure storage options on real devices
|
|
116
|
+
if (isKeychainAvailable()) {
|
|
117
|
+
options.accessControl = Keychain.ACCESS_CONTROL?.BIOMETRY_ANY;
|
|
118
|
+
options.accessible = Keychain.ACCESSIBLE?.WHEN_UNLOCKED;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
await safeSetGenericPassword(
|
|
122
|
+
username,
|
|
123
|
+
JSON.stringify({ userPin, accessToken }),
|
|
124
|
+
options
|
|
125
|
+
);
|
|
126
|
+
return true;
|
|
127
|
+
} catch (error) {
|
|
128
|
+
console.error('Error storing credentials:', error);
|
|
129
|
+
return false;
|
|
130
|
+
}
|
|
131
|
+
}, []);
|
|
132
|
+
|
|
133
|
+
const clearCredentials = useCallback(async (): Promise<void> => {
|
|
134
|
+
try {
|
|
135
|
+
await safeResetGenericPassword({
|
|
136
|
+
service: STORAGE_KEYS.credentials
|
|
137
|
+
});
|
|
138
|
+
} catch (error) {
|
|
139
|
+
console.error('Error clearing credentials:', error);
|
|
140
|
+
}
|
|
141
|
+
}, []);
|
|
142
|
+
|
|
143
|
+
const validateCredentials = useCallback(async (username: string): Promise<CredentialsResult> => {
|
|
144
|
+
try {
|
|
145
|
+
const response = await fetch(`https://api2.onairos.uk/validate`, {
|
|
146
|
+
method: 'POST',
|
|
147
|
+
headers: {
|
|
148
|
+
'Content-Type': 'application/json',
|
|
149
|
+
},
|
|
150
|
+
body: JSON.stringify({ username }),
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
const data = await response.json();
|
|
154
|
+
return {
|
|
155
|
+
success: true,
|
|
156
|
+
isValid: data.valid,
|
|
157
|
+
credentials: data.credentials,
|
|
158
|
+
};
|
|
159
|
+
} catch (error) {
|
|
160
|
+
console.error('Error validating credentials:', error);
|
|
161
|
+
return {
|
|
162
|
+
success: false,
|
|
163
|
+
isValid: false
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
}, []);
|
|
167
|
+
|
|
168
|
+
return {
|
|
169
|
+
hasCredentials,
|
|
170
|
+
getCredentials,
|
|
171
|
+
storeCredentials,
|
|
172
|
+
clearCredentials,
|
|
173
|
+
validateCredentials,
|
|
174
|
+
};
|
|
175
175
|
};
|