@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,217 +1,217 @@
|
|
|
1
|
-
import React, { useState, useEffect } from 'react';
|
|
2
|
-
import {
|
|
3
|
-
View,
|
|
4
|
-
Text,
|
|
5
|
-
StyleSheet,
|
|
6
|
-
KeyboardAvoidingView,
|
|
7
|
-
Platform,
|
|
8
|
-
Keyboard,
|
|
9
|
-
Animated,
|
|
10
|
-
} from 'react-native';
|
|
11
|
-
import { COLORS, SPACING, TEXT_STYLES } from '../theme';
|
|
12
|
-
import EmailInput from './EmailInput';
|
|
13
|
-
import GoogleButton from './GoogleButton';
|
|
14
|
-
import PrimaryButton from './PrimaryButton';
|
|
15
|
-
|
|
16
|
-
interface SignInStepProps {
|
|
17
|
-
onEmailSubmit: (email: string) => void;
|
|
18
|
-
onGoogleSignIn: () => void;
|
|
19
|
-
onContinue: () => void;
|
|
20
|
-
loading?: boolean;
|
|
21
|
-
error?: string;
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
const SignInStep: React.FC<SignInStepProps> = ({
|
|
25
|
-
onEmailSubmit,
|
|
26
|
-
onGoogleSignIn,
|
|
27
|
-
onContinue,
|
|
28
|
-
loading = false,
|
|
29
|
-
error = '',
|
|
30
|
-
}) => {
|
|
31
|
-
const [email, setEmail] = useState('');
|
|
32
|
-
const [keyboardVisible, setKeyboardVisible] = useState(false);
|
|
33
|
-
|
|
34
|
-
const handleEmailSubmit = () => {
|
|
35
|
-
// Check for reviewer bypass first
|
|
36
|
-
if (email.toLowerCase().trim() === 'reviewer') {
|
|
37
|
-
console.log('🔍 Reviewer bypass detected in new UI');
|
|
38
|
-
// Call onEmailSubmit with a special reviewer email that the parent can recognize
|
|
39
|
-
onEmailSubmit('reviewer@bypass.com');
|
|
40
|
-
return;
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
if (email.trim()) {
|
|
44
|
-
onEmailSubmit(email.trim());
|
|
45
|
-
}
|
|
46
|
-
};
|
|
47
|
-
|
|
48
|
-
useEffect(() => {
|
|
49
|
-
const keyboardDidShowListener = Keyboard.addListener(
|
|
50
|
-
'keyboardDidShow',
|
|
51
|
-
() => setKeyboardVisible(true)
|
|
52
|
-
);
|
|
53
|
-
const keyboardDidHideListener = Keyboard.addListener(
|
|
54
|
-
'keyboardDidHide',
|
|
55
|
-
() => setKeyboardVisible(false)
|
|
56
|
-
);
|
|
57
|
-
|
|
58
|
-
return () => {
|
|
59
|
-
keyboardDidHideListener?.remove();
|
|
60
|
-
keyboardDidShowListener?.remove();
|
|
61
|
-
};
|
|
62
|
-
}, []);
|
|
63
|
-
|
|
64
|
-
return (
|
|
65
|
-
<KeyboardAvoidingView
|
|
66
|
-
behavior={Platform.OS === 'ios' ? 'padding' : 'height'}
|
|
67
|
-
style={styles.container}
|
|
68
|
-
>
|
|
69
|
-
<View style={styles.content}>
|
|
70
|
-
{/* Heading */}
|
|
71
|
-
<View style={styles.headingContainer}>
|
|
72
|
-
<Text style={styles.title}>Build your Onairos persona to own your digital identity</Text>
|
|
73
|
-
<Text style={styles.subtitle}>Sign in or create an account</Text>
|
|
74
|
-
</View>
|
|
75
|
-
|
|
76
|
-
{/* Email Input */}
|
|
77
|
-
<View style={styles.inputContainer}>
|
|
78
|
-
<EmailInput
|
|
79
|
-
value={email}
|
|
80
|
-
onChangeText={setEmail}
|
|
81
|
-
onSubmitEditing={handleEmailSubmit}
|
|
82
|
-
returnKeyType="done"
|
|
83
|
-
blurOnSubmit={true}
|
|
84
|
-
/>
|
|
85
|
-
{error ? (
|
|
86
|
-
<Text style={styles.errorText}>{error}</Text>
|
|
87
|
-
) : null}
|
|
88
|
-
</View>
|
|
89
|
-
|
|
90
|
-
{/* Divider */}
|
|
91
|
-
<View style={styles.dividerContainer}>
|
|
92
|
-
<View style={styles.dividerLine} />
|
|
93
|
-
<Text style={styles.dividerText}>Or</Text>
|
|
94
|
-
<View style={styles.dividerLine} />
|
|
95
|
-
</View>
|
|
96
|
-
|
|
97
|
-
{/* Google Button */}
|
|
98
|
-
<View style={styles.googleContainer}>
|
|
99
|
-
<GoogleButton
|
|
100
|
-
onPress={onGoogleSignIn}
|
|
101
|
-
disabled={loading}
|
|
102
|
-
/>
|
|
103
|
-
</View>
|
|
104
|
-
|
|
105
|
-
{/* Spacer */}
|
|
106
|
-
<View style={styles.spacer} />
|
|
107
|
-
|
|
108
|
-
{/* Continue Button */}
|
|
109
|
-
<View style={styles.continueContainer}>
|
|
110
|
-
<PrimaryButton
|
|
111
|
-
label="Continue"
|
|
112
|
-
onPress={() => {
|
|
113
|
-
if (email.trim()) {
|
|
114
|
-
onEmailSubmit(email.trim());
|
|
115
|
-
}
|
|
116
|
-
}}
|
|
117
|
-
disabled={loading || !email.trim()}
|
|
118
|
-
loading={loading}
|
|
119
|
-
/>
|
|
120
|
-
</View>
|
|
121
|
-
</View>
|
|
122
|
-
</KeyboardAvoidingView>
|
|
123
|
-
);
|
|
124
|
-
};
|
|
125
|
-
|
|
126
|
-
const styles = StyleSheet.create({
|
|
127
|
-
container: {
|
|
128
|
-
flex: 1,
|
|
129
|
-
},
|
|
130
|
-
|
|
131
|
-
content: {
|
|
132
|
-
flex: 1,
|
|
133
|
-
paddingTop: 8, // Much smaller top padding to move headline higher
|
|
134
|
-
paddingHorizontal: 0, // No horizontal padding - let children control their own spacing
|
|
135
|
-
},
|
|
136
|
-
|
|
137
|
-
headingContainer: {
|
|
138
|
-
width: '100%', // Fill sheet width
|
|
139
|
-
marginBottom: 22, // Further reduced spacing to bring subtitle closer to email input
|
|
140
|
-
paddingHorizontal: 0, // No padding at all - text goes to absolute edges
|
|
141
|
-
// Removed alignItems: 'center' - no centering
|
|
142
|
-
},
|
|
143
|
-
|
|
144
|
-
title: {
|
|
145
|
-
fontFamily: 'IBM Plex Sans',
|
|
146
|
-
fontWeight: '700',
|
|
147
|
-
fontSize: 24,
|
|
148
|
-
lineHeight: 32,
|
|
149
|
-
color: COLORS.grey800,
|
|
150
|
-
textAlign: 'left', // Left-aligned as specified
|
|
151
|
-
marginBottom: SPACING.sm,
|
|
152
|
-
// No fixed width - let parent's 24px insets define available width (327px on 375pt device)
|
|
153
|
-
// Removed height constraint to allow natural wrapping
|
|
154
|
-
},
|
|
155
|
-
|
|
156
|
-
subtitle: {
|
|
157
|
-
fontFamily: 'Inter',
|
|
158
|
-
fontWeight: '400',
|
|
159
|
-
fontSize: 16,
|
|
160
|
-
lineHeight: 24,
|
|
161
|
-
color: COLORS.grey600,
|
|
162
|
-
textAlign: 'left', // Also left-align subtitle for consistency
|
|
163
|
-
},
|
|
164
|
-
|
|
165
|
-
inputContainer: {
|
|
166
|
-
marginBottom: 32, // Consistent spacing
|
|
167
|
-
paddingHorizontal: 0, // Match headline - no padding, full width
|
|
168
|
-
},
|
|
169
|
-
|
|
170
|
-
dividerContainer: {
|
|
171
|
-
flexDirection: 'row',
|
|
172
|
-
alignItems: 'center',
|
|
173
|
-
marginBottom: 32, // Consistent spacing
|
|
174
|
-
paddingHorizontal: 0, // Match headline - no padding, full width
|
|
175
|
-
},
|
|
176
|
-
|
|
177
|
-
dividerLine: {
|
|
178
|
-
flex: 1,
|
|
179
|
-
height: 1,
|
|
180
|
-
backgroundColor: '#E5E5E5',
|
|
181
|
-
},
|
|
182
|
-
|
|
183
|
-
dividerText: {
|
|
184
|
-
paddingHorizontal: SPACING.md,
|
|
185
|
-
fontSize: 14,
|
|
186
|
-
fontFamily: 'Inter',
|
|
187
|
-
fontWeight: '400',
|
|
188
|
-
color: COLORS.grey500,
|
|
189
|
-
},
|
|
190
|
-
|
|
191
|
-
googleContainer: {
|
|
192
|
-
marginBottom: SPACING.xl,
|
|
193
|
-
paddingHorizontal: 0, // Match headline - no padding, full width
|
|
194
|
-
},
|
|
195
|
-
|
|
196
|
-
spacer: {
|
|
197
|
-
flex: 1,
|
|
198
|
-
minHeight: 20,
|
|
199
|
-
},
|
|
200
|
-
|
|
201
|
-
continueContainer: {
|
|
202
|
-
paddingBottom: SPACING.xl,
|
|
203
|
-
paddingHorizontal: 0, // Match headline - no padding, full width
|
|
204
|
-
},
|
|
205
|
-
|
|
206
|
-
errorText: {
|
|
207
|
-
fontSize: 14,
|
|
208
|
-
fontFamily: 'Inter',
|
|
209
|
-
fontWeight: '400',
|
|
210
|
-
color: '#DC3545', // Red color for errors
|
|
211
|
-
marginTop: 8,
|
|
212
|
-
textAlign: 'left',
|
|
213
|
-
},
|
|
214
|
-
});
|
|
215
|
-
|
|
216
|
-
export { SignInStep };
|
|
217
|
-
export default SignInStep;
|
|
1
|
+
import React, { useState, useEffect } from 'react';
|
|
2
|
+
import {
|
|
3
|
+
View,
|
|
4
|
+
Text,
|
|
5
|
+
StyleSheet,
|
|
6
|
+
KeyboardAvoidingView,
|
|
7
|
+
Platform,
|
|
8
|
+
Keyboard,
|
|
9
|
+
Animated,
|
|
10
|
+
} from 'react-native';
|
|
11
|
+
import { COLORS, SPACING, TEXT_STYLES } from '../theme';
|
|
12
|
+
import EmailInput from './EmailInput';
|
|
13
|
+
import GoogleButton from './GoogleButton';
|
|
14
|
+
import PrimaryButton from './PrimaryButton';
|
|
15
|
+
|
|
16
|
+
interface SignInStepProps {
|
|
17
|
+
onEmailSubmit: (email: string) => void;
|
|
18
|
+
onGoogleSignIn: () => void;
|
|
19
|
+
onContinue: () => void;
|
|
20
|
+
loading?: boolean;
|
|
21
|
+
error?: string;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
const SignInStep: React.FC<SignInStepProps> = ({
|
|
25
|
+
onEmailSubmit,
|
|
26
|
+
onGoogleSignIn,
|
|
27
|
+
onContinue,
|
|
28
|
+
loading = false,
|
|
29
|
+
error = '',
|
|
30
|
+
}) => {
|
|
31
|
+
const [email, setEmail] = useState('');
|
|
32
|
+
const [keyboardVisible, setKeyboardVisible] = useState(false);
|
|
33
|
+
|
|
34
|
+
const handleEmailSubmit = () => {
|
|
35
|
+
// Check for reviewer bypass first
|
|
36
|
+
if (email.toLowerCase().trim() === 'reviewer') {
|
|
37
|
+
console.log('🔍 Reviewer bypass detected in new UI');
|
|
38
|
+
// Call onEmailSubmit with a special reviewer email that the parent can recognize
|
|
39
|
+
onEmailSubmit('reviewer@bypass.com');
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
if (email.trim()) {
|
|
44
|
+
onEmailSubmit(email.trim());
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
useEffect(() => {
|
|
49
|
+
const keyboardDidShowListener = Keyboard.addListener(
|
|
50
|
+
'keyboardDidShow',
|
|
51
|
+
() => setKeyboardVisible(true)
|
|
52
|
+
);
|
|
53
|
+
const keyboardDidHideListener = Keyboard.addListener(
|
|
54
|
+
'keyboardDidHide',
|
|
55
|
+
() => setKeyboardVisible(false)
|
|
56
|
+
);
|
|
57
|
+
|
|
58
|
+
return () => {
|
|
59
|
+
keyboardDidHideListener?.remove();
|
|
60
|
+
keyboardDidShowListener?.remove();
|
|
61
|
+
};
|
|
62
|
+
}, []);
|
|
63
|
+
|
|
64
|
+
return (
|
|
65
|
+
<KeyboardAvoidingView
|
|
66
|
+
behavior={Platform.OS === 'ios' ? 'padding' : 'height'}
|
|
67
|
+
style={styles.container}
|
|
68
|
+
>
|
|
69
|
+
<View style={styles.content}>
|
|
70
|
+
{/* Heading */}
|
|
71
|
+
<View style={styles.headingContainer}>
|
|
72
|
+
<Text style={styles.title}>Build your Onairos persona to own your digital identity</Text>
|
|
73
|
+
<Text style={styles.subtitle}>Sign in or create an account</Text>
|
|
74
|
+
</View>
|
|
75
|
+
|
|
76
|
+
{/* Email Input */}
|
|
77
|
+
<View style={styles.inputContainer}>
|
|
78
|
+
<EmailInput
|
|
79
|
+
value={email}
|
|
80
|
+
onChangeText={setEmail}
|
|
81
|
+
onSubmitEditing={handleEmailSubmit}
|
|
82
|
+
returnKeyType="done"
|
|
83
|
+
blurOnSubmit={true}
|
|
84
|
+
/>
|
|
85
|
+
{error ? (
|
|
86
|
+
<Text style={styles.errorText}>{error}</Text>
|
|
87
|
+
) : null}
|
|
88
|
+
</View>
|
|
89
|
+
|
|
90
|
+
{/* Divider */}
|
|
91
|
+
<View style={styles.dividerContainer}>
|
|
92
|
+
<View style={styles.dividerLine} />
|
|
93
|
+
<Text style={styles.dividerText}>Or</Text>
|
|
94
|
+
<View style={styles.dividerLine} />
|
|
95
|
+
</View>
|
|
96
|
+
|
|
97
|
+
{/* Google Button */}
|
|
98
|
+
<View style={styles.googleContainer}>
|
|
99
|
+
<GoogleButton
|
|
100
|
+
onPress={onGoogleSignIn}
|
|
101
|
+
disabled={loading}
|
|
102
|
+
/>
|
|
103
|
+
</View>
|
|
104
|
+
|
|
105
|
+
{/* Spacer */}
|
|
106
|
+
<View style={styles.spacer} />
|
|
107
|
+
|
|
108
|
+
{/* Continue Button */}
|
|
109
|
+
<View style={styles.continueContainer}>
|
|
110
|
+
<PrimaryButton
|
|
111
|
+
label="Continue"
|
|
112
|
+
onPress={() => {
|
|
113
|
+
if (email.trim()) {
|
|
114
|
+
onEmailSubmit(email.trim());
|
|
115
|
+
}
|
|
116
|
+
}}
|
|
117
|
+
disabled={loading || !email.trim()}
|
|
118
|
+
loading={loading}
|
|
119
|
+
/>
|
|
120
|
+
</View>
|
|
121
|
+
</View>
|
|
122
|
+
</KeyboardAvoidingView>
|
|
123
|
+
);
|
|
124
|
+
};
|
|
125
|
+
|
|
126
|
+
const styles = StyleSheet.create({
|
|
127
|
+
container: {
|
|
128
|
+
flex: 1,
|
|
129
|
+
},
|
|
130
|
+
|
|
131
|
+
content: {
|
|
132
|
+
flex: 1,
|
|
133
|
+
paddingTop: 8, // Much smaller top padding to move headline higher
|
|
134
|
+
paddingHorizontal: 0, // No horizontal padding - let children control their own spacing
|
|
135
|
+
},
|
|
136
|
+
|
|
137
|
+
headingContainer: {
|
|
138
|
+
width: '100%', // Fill sheet width
|
|
139
|
+
marginBottom: 22, // Further reduced spacing to bring subtitle closer to email input
|
|
140
|
+
paddingHorizontal: 0, // No padding at all - text goes to absolute edges
|
|
141
|
+
// Removed alignItems: 'center' - no centering
|
|
142
|
+
},
|
|
143
|
+
|
|
144
|
+
title: {
|
|
145
|
+
fontFamily: 'IBM Plex Sans',
|
|
146
|
+
fontWeight: '700',
|
|
147
|
+
fontSize: 24,
|
|
148
|
+
lineHeight: 32,
|
|
149
|
+
color: COLORS.grey800,
|
|
150
|
+
textAlign: 'left', // Left-aligned as specified
|
|
151
|
+
marginBottom: SPACING.sm,
|
|
152
|
+
// No fixed width - let parent's 24px insets define available width (327px on 375pt device)
|
|
153
|
+
// Removed height constraint to allow natural wrapping
|
|
154
|
+
},
|
|
155
|
+
|
|
156
|
+
subtitle: {
|
|
157
|
+
fontFamily: 'Inter',
|
|
158
|
+
fontWeight: '400',
|
|
159
|
+
fontSize: 16,
|
|
160
|
+
lineHeight: 24,
|
|
161
|
+
color: COLORS.grey600,
|
|
162
|
+
textAlign: 'left', // Also left-align subtitle for consistency
|
|
163
|
+
},
|
|
164
|
+
|
|
165
|
+
inputContainer: {
|
|
166
|
+
marginBottom: 32, // Consistent spacing
|
|
167
|
+
paddingHorizontal: 0, // Match headline - no padding, full width
|
|
168
|
+
},
|
|
169
|
+
|
|
170
|
+
dividerContainer: {
|
|
171
|
+
flexDirection: 'row',
|
|
172
|
+
alignItems: 'center',
|
|
173
|
+
marginBottom: 32, // Consistent spacing
|
|
174
|
+
paddingHorizontal: 0, // Match headline - no padding, full width
|
|
175
|
+
},
|
|
176
|
+
|
|
177
|
+
dividerLine: {
|
|
178
|
+
flex: 1,
|
|
179
|
+
height: 1,
|
|
180
|
+
backgroundColor: '#E5E5E5',
|
|
181
|
+
},
|
|
182
|
+
|
|
183
|
+
dividerText: {
|
|
184
|
+
paddingHorizontal: SPACING.md,
|
|
185
|
+
fontSize: 14,
|
|
186
|
+
fontFamily: 'Inter',
|
|
187
|
+
fontWeight: '400',
|
|
188
|
+
color: COLORS.grey500,
|
|
189
|
+
},
|
|
190
|
+
|
|
191
|
+
googleContainer: {
|
|
192
|
+
marginBottom: SPACING.xl,
|
|
193
|
+
paddingHorizontal: 0, // Match headline - no padding, full width
|
|
194
|
+
},
|
|
195
|
+
|
|
196
|
+
spacer: {
|
|
197
|
+
flex: 1,
|
|
198
|
+
minHeight: 20,
|
|
199
|
+
},
|
|
200
|
+
|
|
201
|
+
continueContainer: {
|
|
202
|
+
paddingBottom: SPACING.xl,
|
|
203
|
+
paddingHorizontal: 0, // Match headline - no padding, full width
|
|
204
|
+
},
|
|
205
|
+
|
|
206
|
+
errorText: {
|
|
207
|
+
fontSize: 14,
|
|
208
|
+
fontFamily: 'Inter',
|
|
209
|
+
fontWeight: '400',
|
|
210
|
+
color: '#DC3545', // Red color for errors
|
|
211
|
+
marginTop: 8,
|
|
212
|
+
textAlign: 'left',
|
|
213
|
+
},
|
|
214
|
+
});
|
|
215
|
+
|
|
216
|
+
export { SignInStep };
|
|
217
|
+
export default SignInStep;
|