@oxyhq/services 5.13.12 → 5.13.16

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 (209) hide show
  1. package/README.md +10 -0
  2. package/lib/commonjs/core/OxyServices.base.js +271 -0
  3. package/lib/commonjs/core/OxyServices.base.js.map +1 -0
  4. package/lib/commonjs/core/OxyServices.errors.js +26 -0
  5. package/lib/commonjs/core/OxyServices.errors.js.map +1 -0
  6. package/lib/commonjs/core/OxyServices.js +58 -2009
  7. package/lib/commonjs/core/OxyServices.js.map +1 -1
  8. package/lib/commonjs/core/mixins/OxyServices.analytics.js +60 -0
  9. package/lib/commonjs/core/mixins/OxyServices.analytics.js.map +1 -0
  10. package/lib/commonjs/core/mixins/OxyServices.assets.js +406 -0
  11. package/lib/commonjs/core/mixins/OxyServices.assets.js.map +1 -0
  12. package/lib/commonjs/core/mixins/OxyServices.auth.js +303 -0
  13. package/lib/commonjs/core/mixins/OxyServices.auth.js.map +1 -0
  14. package/lib/commonjs/core/mixins/OxyServices.developer.js +115 -0
  15. package/lib/commonjs/core/mixins/OxyServices.developer.js.map +1 -0
  16. package/lib/commonjs/core/mixins/OxyServices.devices.js +119 -0
  17. package/lib/commonjs/core/mixins/OxyServices.devices.js.map +1 -0
  18. package/lib/commonjs/core/mixins/OxyServices.karma.js +117 -0
  19. package/lib/commonjs/core/mixins/OxyServices.karma.js.map +1 -0
  20. package/lib/commonjs/core/mixins/OxyServices.language.js +124 -0
  21. package/lib/commonjs/core/mixins/OxyServices.language.js.map +1 -0
  22. package/lib/commonjs/core/mixins/OxyServices.location.js +55 -0
  23. package/lib/commonjs/core/mixins/OxyServices.location.js.map +1 -0
  24. package/lib/commonjs/core/mixins/OxyServices.payment.js +66 -0
  25. package/lib/commonjs/core/mixins/OxyServices.payment.js.map +1 -0
  26. package/lib/commonjs/core/mixins/OxyServices.privacy.js +174 -0
  27. package/lib/commonjs/core/mixins/OxyServices.privacy.js.map +1 -0
  28. package/lib/commonjs/core/mixins/OxyServices.totp.js +53 -0
  29. package/lib/commonjs/core/mixins/OxyServices.totp.js.map +1 -0
  30. package/lib/commonjs/core/mixins/OxyServices.user.js +389 -0
  31. package/lib/commonjs/core/mixins/OxyServices.user.js.map +1 -0
  32. package/lib/commonjs/core/mixins/OxyServices.utility.js +161 -0
  33. package/lib/commonjs/core/mixins/OxyServices.utility.js.map +1 -0
  34. package/lib/commonjs/core/mixins/index.js +39 -0
  35. package/lib/commonjs/core/mixins/index.js.map +1 -0
  36. package/lib/commonjs/core/mixins/mixinHelpers.js +62 -0
  37. package/lib/commonjs/core/mixins/mixinHelpers.js.map +1 -0
  38. package/lib/commonjs/index.js.map +1 -1
  39. package/lib/commonjs/ui/context/OxyContext.js +26 -47
  40. package/lib/commonjs/ui/context/OxyContext.js.map +1 -1
  41. package/lib/commonjs/ui/screens/PrivacySettingsScreen.js +239 -1
  42. package/lib/commonjs/ui/screens/PrivacySettingsScreen.js.map +1 -1
  43. package/lib/commonjs/utils/apiUtils.js +0 -14
  44. package/lib/commonjs/utils/apiUtils.js.map +1 -1
  45. package/lib/commonjs/utils/asyncUtils.js +0 -20
  46. package/lib/commonjs/utils/asyncUtils.js.map +1 -1
  47. package/lib/module/core/OxyServices.base.js +265 -0
  48. package/lib/module/core/OxyServices.base.js.map +1 -0
  49. package/lib/module/core/OxyServices.errors.js +20 -0
  50. package/lib/module/core/OxyServices.errors.js.map +1 -0
  51. package/lib/module/core/OxyServices.js +43 -2005
  52. package/lib/module/core/OxyServices.js.map +1 -1
  53. package/lib/module/core/mixins/OxyServices.analytics.js +56 -0
  54. package/lib/module/core/mixins/OxyServices.analytics.js.map +1 -0
  55. package/lib/module/core/mixins/OxyServices.assets.js +402 -0
  56. package/lib/module/core/mixins/OxyServices.assets.js.map +1 -0
  57. package/lib/module/core/mixins/OxyServices.auth.js +299 -0
  58. package/lib/module/core/mixins/OxyServices.auth.js.map +1 -0
  59. package/lib/module/core/mixins/OxyServices.developer.js +111 -0
  60. package/lib/module/core/mixins/OxyServices.developer.js.map +1 -0
  61. package/lib/module/core/mixins/OxyServices.devices.js +115 -0
  62. package/lib/module/core/mixins/OxyServices.devices.js.map +1 -0
  63. package/lib/module/core/mixins/OxyServices.karma.js +113 -0
  64. package/lib/module/core/mixins/OxyServices.karma.js.map +1 -0
  65. package/lib/module/core/mixins/OxyServices.language.js +120 -0
  66. package/lib/module/core/mixins/OxyServices.language.js.map +1 -0
  67. package/lib/module/core/mixins/OxyServices.location.js +51 -0
  68. package/lib/module/core/mixins/OxyServices.location.js.map +1 -0
  69. package/lib/module/core/mixins/OxyServices.payment.js +62 -0
  70. package/lib/module/core/mixins/OxyServices.payment.js.map +1 -0
  71. package/lib/module/core/mixins/OxyServices.privacy.js +170 -0
  72. package/lib/module/core/mixins/OxyServices.privacy.js.map +1 -0
  73. package/lib/module/core/mixins/OxyServices.totp.js +49 -0
  74. package/lib/module/core/mixins/OxyServices.totp.js.map +1 -0
  75. package/lib/module/core/mixins/OxyServices.user.js +385 -0
  76. package/lib/module/core/mixins/OxyServices.user.js.map +1 -0
  77. package/lib/module/core/mixins/OxyServices.utility.js +156 -0
  78. package/lib/module/core/mixins/OxyServices.utility.js.map +1 -0
  79. package/lib/module/core/mixins/index.js +36 -0
  80. package/lib/module/core/mixins/index.js.map +1 -0
  81. package/lib/module/core/mixins/mixinHelpers.js +56 -0
  82. package/lib/module/core/mixins/mixinHelpers.js.map +1 -0
  83. package/lib/module/index.js.map +1 -1
  84. package/lib/module/ui/context/OxyContext.js +26 -47
  85. package/lib/module/ui/context/OxyContext.js.map +1 -1
  86. package/lib/module/ui/navigation/types.js.map +1 -1
  87. package/lib/module/ui/screens/PrivacySettingsScreen.js +241 -3
  88. package/lib/module/ui/screens/PrivacySettingsScreen.js.map +1 -1
  89. package/lib/module/utils/apiUtils.js +0 -13
  90. package/lib/module/utils/apiUtils.js.map +1 -1
  91. package/lib/module/utils/asyncUtils.js +0 -20
  92. package/lib/module/utils/asyncUtils.js.map +1 -1
  93. package/lib/typescript/core/OxyServices.base.d.ts +123 -0
  94. package/lib/typescript/core/OxyServices.base.d.ts.map +1 -0
  95. package/lib/typescript/core/OxyServices.d.ts +969 -682
  96. package/lib/typescript/core/OxyServices.d.ts.map +1 -1
  97. package/lib/typescript/core/OxyServices.errors.d.ts +12 -0
  98. package/lib/typescript/core/OxyServices.errors.d.ts.map +1 -0
  99. package/lib/typescript/core/mixins/OxyServices.analytics.d.ts +70 -0
  100. package/lib/typescript/core/mixins/OxyServices.analytics.d.ts.map +1 -0
  101. package/lib/typescript/core/mixins/OxyServices.assets.d.ts +159 -0
  102. package/lib/typescript/core/mixins/OxyServices.assets.d.ts.map +1 -0
  103. package/lib/typescript/core/mixins/OxyServices.auth.d.ts +168 -0
  104. package/lib/typescript/core/mixins/OxyServices.auth.d.ts.map +1 -0
  105. package/lib/typescript/core/mixins/OxyServices.developer.d.ts +103 -0
  106. package/lib/typescript/core/mixins/OxyServices.developer.d.ts.map +1 -0
  107. package/lib/typescript/core/mixins/OxyServices.devices.d.ts +93 -0
  108. package/lib/typescript/core/mixins/OxyServices.devices.d.ts.map +1 -0
  109. package/lib/typescript/core/mixins/OxyServices.karma.d.ts +89 -0
  110. package/lib/typescript/core/mixins/OxyServices.karma.d.ts.map +1 -0
  111. package/lib/typescript/core/mixins/OxyServices.language.d.ts +85 -0
  112. package/lib/typescript/core/mixins/OxyServices.language.d.ts.map +1 -0
  113. package/lib/typescript/core/mixins/OxyServices.location.d.ts +68 -0
  114. package/lib/typescript/core/mixins/OxyServices.location.d.ts.map +1 -0
  115. package/lib/typescript/core/mixins/OxyServices.payment.d.ts +74 -0
  116. package/lib/typescript/core/mixins/OxyServices.payment.d.ts.map +1 -0
  117. package/lib/typescript/core/mixins/OxyServices.privacy.d.ts +126 -0
  118. package/lib/typescript/core/mixins/OxyServices.privacy.d.ts.map +1 -0
  119. package/lib/typescript/core/mixins/OxyServices.totp.d.ts +69 -0
  120. package/lib/typescript/core/mixins/OxyServices.totp.d.ts.map +1 -0
  121. package/lib/typescript/core/mixins/OxyServices.user.d.ts +189 -0
  122. package/lib/typescript/core/mixins/OxyServices.user.d.ts.map +1 -0
  123. package/lib/typescript/core/mixins/OxyServices.utility.d.ts +97 -0
  124. package/lib/typescript/core/mixins/OxyServices.utility.d.ts.map +1 -0
  125. package/lib/typescript/core/mixins/index.d.ts +898 -0
  126. package/lib/typescript/core/mixins/index.d.ts.map +1 -0
  127. package/lib/typescript/core/mixins/mixinHelpers.d.ts +32 -0
  128. package/lib/typescript/core/mixins/mixinHelpers.d.ts.map +1 -0
  129. package/lib/typescript/index.d.ts +1 -1
  130. package/lib/typescript/index.d.ts.map +1 -1
  131. package/lib/typescript/models/interfaces.d.ts +36 -0
  132. package/lib/typescript/models/interfaces.d.ts.map +1 -1
  133. package/lib/typescript/ui/context/OxyContext.d.ts +2 -6
  134. package/lib/typescript/ui/context/OxyContext.d.ts.map +1 -1
  135. package/lib/typescript/ui/navigation/types.d.ts +0 -1
  136. package/lib/typescript/ui/navigation/types.d.ts.map +1 -1
  137. package/lib/typescript/ui/screens/PrivacySettingsScreen.d.ts.map +1 -1
  138. package/lib/typescript/utils/apiUtils.d.ts +0 -7
  139. package/lib/typescript/utils/apiUtils.d.ts.map +1 -1
  140. package/lib/typescript/utils/asyncUtils.d.ts +0 -11
  141. package/lib/typescript/utils/asyncUtils.d.ts.map +1 -1
  142. package/package.json +1 -1
  143. package/src/core/OxyServices.base.ts +311 -0
  144. package/src/core/OxyServices.errors.ts +26 -0
  145. package/src/core/OxyServices.ts +43 -2026
  146. package/src/core/mixins/OxyServices.analytics.ts +53 -0
  147. package/src/core/mixins/OxyServices.assets.ts +390 -0
  148. package/src/core/mixins/OxyServices.auth.ts +275 -0
  149. package/src/core/mixins/OxyServices.developer.ts +114 -0
  150. package/src/core/mixins/OxyServices.devices.ts +103 -0
  151. package/src/core/mixins/OxyServices.karma.ts +111 -0
  152. package/src/core/mixins/OxyServices.language.ts +127 -0
  153. package/src/core/mixins/OxyServices.location.ts +46 -0
  154. package/src/core/mixins/OxyServices.payment.ts +59 -0
  155. package/src/core/mixins/OxyServices.privacy.ts +182 -0
  156. package/src/core/mixins/OxyServices.totp.ts +36 -0
  157. package/src/core/mixins/OxyServices.user.ts +380 -0
  158. package/src/core/mixins/OxyServices.utility.ts +187 -0
  159. package/src/core/mixins/index.ts +58 -0
  160. package/src/core/mixins/mixinHelpers.ts +69 -0
  161. package/src/index.ts +4 -0
  162. package/src/models/interfaces.ts +40 -0
  163. package/src/ui/context/OxyContext.tsx +35 -53
  164. package/src/ui/navigation/types.ts +0 -1
  165. package/src/ui/screens/PrivacySettingsScreen.tsx +240 -2
  166. package/src/utils/apiUtils.ts +0 -14
  167. package/src/utils/asyncUtils.ts +0 -20
  168. package/lib/commonjs/ui/screens/internal/SignInPasswordStep.js +0 -192
  169. package/lib/commonjs/ui/screens/internal/SignInPasswordStep.js.map +0 -1
  170. package/lib/commonjs/ui/screens/internal/SignInUsernameStep.js +0 -142
  171. package/lib/commonjs/ui/screens/internal/SignInUsernameStep.js.map +0 -1
  172. package/lib/commonjs/ui/screens/internal/SignUpIdentityStep.js +0 -113
  173. package/lib/commonjs/ui/screens/internal/SignUpIdentityStep.js.map +0 -1
  174. package/lib/commonjs/ui/screens/internal/SignUpSecurityStep.js +0 -132
  175. package/lib/commonjs/ui/screens/internal/SignUpSecurityStep.js.map +0 -1
  176. package/lib/commonjs/ui/screens/internal/SignUpSummaryStep.js +0 -83
  177. package/lib/commonjs/ui/screens/internal/SignUpSummaryStep.js.map +0 -1
  178. package/lib/commonjs/ui/screens/internal/SignUpWelcomeStep.js +0 -58
  179. package/lib/commonjs/ui/screens/internal/SignUpWelcomeStep.js.map +0 -1
  180. package/lib/module/ui/screens/internal/SignInPasswordStep.js +0 -186
  181. package/lib/module/ui/screens/internal/SignInPasswordStep.js.map +0 -1
  182. package/lib/module/ui/screens/internal/SignInUsernameStep.js +0 -136
  183. package/lib/module/ui/screens/internal/SignInUsernameStep.js.map +0 -1
  184. package/lib/module/ui/screens/internal/SignUpIdentityStep.js +0 -108
  185. package/lib/module/ui/screens/internal/SignUpIdentityStep.js.map +0 -1
  186. package/lib/module/ui/screens/internal/SignUpSecurityStep.js +0 -127
  187. package/lib/module/ui/screens/internal/SignUpSecurityStep.js.map +0 -1
  188. package/lib/module/ui/screens/internal/SignUpSummaryStep.js +0 -78
  189. package/lib/module/ui/screens/internal/SignUpSummaryStep.js.map +0 -1
  190. package/lib/module/ui/screens/internal/SignUpWelcomeStep.js +0 -53
  191. package/lib/module/ui/screens/internal/SignUpWelcomeStep.js.map +0 -1
  192. package/lib/typescript/ui/screens/internal/SignInPasswordStep.d.ts +0 -28
  193. package/lib/typescript/ui/screens/internal/SignInPasswordStep.d.ts.map +0 -1
  194. package/lib/typescript/ui/screens/internal/SignInUsernameStep.d.ts +0 -25
  195. package/lib/typescript/ui/screens/internal/SignInUsernameStep.d.ts.map +0 -1
  196. package/lib/typescript/ui/screens/internal/SignUpIdentityStep.d.ts +0 -20
  197. package/lib/typescript/ui/screens/internal/SignUpIdentityStep.d.ts.map +0 -1
  198. package/lib/typescript/ui/screens/internal/SignUpSecurityStep.d.ts +0 -24
  199. package/lib/typescript/ui/screens/internal/SignUpSecurityStep.d.ts.map +0 -1
  200. package/lib/typescript/ui/screens/internal/SignUpSummaryStep.d.ts +0 -15
  201. package/lib/typescript/ui/screens/internal/SignUpSummaryStep.d.ts.map +0 -1
  202. package/lib/typescript/ui/screens/internal/SignUpWelcomeStep.d.ts +0 -13
  203. package/lib/typescript/ui/screens/internal/SignUpWelcomeStep.d.ts.map +0 -1
  204. package/src/ui/screens/internal/SignInPasswordStep.tsx +0 -184
  205. package/src/ui/screens/internal/SignInUsernameStep.tsx +0 -145
  206. package/src/ui/screens/internal/SignUpIdentityStep.tsx +0 -112
  207. package/src/ui/screens/internal/SignUpSecurityStep.tsx +0 -132
  208. package/src/ui/screens/internal/SignUpSummaryStep.tsx +0 -66
  209. package/src/ui/screens/internal/SignUpWelcomeStep.tsx +0 -52
@@ -1,145 +0,0 @@
1
- import type React from 'react';
2
- import { useRef } from 'react';
3
- import { type TextInput, View, Text } from 'react-native';
4
- import Animated, {
5
- useAnimatedStyle,
6
- SharedValue,
7
- } from 'react-native-reanimated';
8
- import { Ionicons } from '@expo/vector-icons';
9
- import { useI18n } from '../../hooks/useI18n';
10
- import HighFive from '../../../assets/illustrations/HighFive';
11
- import GroupedPillButtons from '../../components/internal/GroupedPillButtons';
12
- import TextField from '../../components/internal/TextField';
13
-
14
- interface SignInUsernameStepProps {
15
- styles: any;
16
- fadeAnim: SharedValue<number>;
17
- slideAnim: SharedValue<number>;
18
- scaleAnim: SharedValue<number>;
19
- colors: any;
20
- isAddAccountMode: boolean;
21
- user: any;
22
- errorMessage: string;
23
- isInputFocused: boolean;
24
- username: string;
25
- validationStatus: 'idle' | 'validating' | 'valid' | 'invalid';
26
- userProfile: any;
27
- isValidating: boolean;
28
- handleInputFocus: () => void;
29
- handleInputBlur: () => void;
30
- handleUsernameChange: (text: string) => void;
31
- handleUsernameContinue: () => void;
32
- navigate: any;
33
- }
34
-
35
- const SignInUsernameStep: React.FC<SignInUsernameStepProps> = ({
36
- styles,
37
- fadeAnim,
38
- slideAnim,
39
- scaleAnim,
40
- colors,
41
- isAddAccountMode,
42
- user,
43
- errorMessage,
44
- isInputFocused,
45
- username,
46
- validationStatus,
47
- userProfile,
48
- isValidating,
49
- handleInputFocus,
50
- handleInputBlur,
51
- handleUsernameChange,
52
- handleUsernameContinue: parentHandleUsernameContinue,
53
- navigate,
54
- }) => {
55
- const inputRef = useRef<TextInput>(null);
56
- const { t } = useI18n();
57
-
58
- // Animated styles - properly memoized to prevent re-renders
59
- const animatedStyle = useAnimatedStyle(() => {
60
- return {
61
- opacity: fadeAnim.value,
62
- transform: [
63
- { translateX: slideAnim.value },
64
- { scale: scaleAnim.value }
65
- ]
66
- };
67
- });
68
-
69
- const handleUsernameContinue = () => {
70
- if (!username || validationStatus === 'invalid') {
71
- setTimeout(() => {
72
- inputRef.current?.focus();
73
- }, 0);
74
- }
75
- parentHandleUsernameContinue();
76
- };
77
- return (
78
- <Animated.View style={[
79
- styles.stepContainer,
80
- animatedStyle
81
- ]}>
82
- <HighFive width={100} height={100} />
83
- <View style={styles.modernHeader}>
84
- <Text style={[styles.modernTitle, { color: colors.text }]}>
85
- {isAddAccountMode ? (t('signin.addAccountTitle') || 'Add Another Account') : (t('signin.title') || 'Sign In')}
86
- </Text>
87
- <Text style={[styles.modernSubtitle, { color: colors.secondaryText }]}>
88
- {isAddAccountMode
89
- ? (t('signin.addAccountSubtitle') || 'Sign in with another account')
90
- : (t('signin.subtitle') || 'Sign in to continue your journey')
91
- }
92
- </Text>
93
- </View>
94
- {isAddAccountMode && (
95
- <View style={[styles.modernInfoCard, { backgroundColor: colors.inputBackground }]}>
96
- <Ionicons name="information-circle" size={20} color={colors.primary} />
97
- <Text style={[styles.modernInfoText, { color: colors.text }]}>
98
- {t('signin.currentlySignedInAs') || 'Currently signed in as'} <Text style={{ fontWeight: 'bold' }}>{user?.name?.full || user?.username}</Text>
99
- </Text>
100
- </View>
101
- )}
102
- <View style={styles.modernInputContainer}>
103
- <TextField
104
- ref={inputRef}
105
- label={t('common.labels.username')}
106
- leading={<Ionicons name="person-outline" size={24} color={colors.secondaryText} />}
107
- value={username}
108
- onChangeText={handleUsernameChange}
109
- onFocus={handleInputFocus}
110
- onBlur={handleInputBlur}
111
- autoCapitalize="none"
112
- autoCorrect={false}
113
- testID="username-input"
114
- variant="filled"
115
- error={validationStatus === 'invalid' ? errorMessage : undefined}
116
- loading={validationStatus === 'validating'}
117
- success={validationStatus === 'valid'}
118
- onSubmitEditing={handleUsernameContinue}
119
- autoFocus
120
- />
121
- </View>
122
- <GroupedPillButtons
123
- buttons={[
124
- {
125
- text: t('common.links.signUp') || 'Sign Up',
126
- onPress: () => navigate('SignUp'),
127
- icon: 'person-add',
128
- variant: 'transparent',
129
- },
130
- {
131
- text: t('common.actions.continue'),
132
- onPress: handleUsernameContinue,
133
- icon: 'arrow-forward',
134
- variant: 'primary',
135
- loading: isValidating,
136
- testID: 'username-next-button',
137
- },
138
- ]}
139
- colors={colors}
140
- />
141
- </Animated.View>
142
- );
143
- };
144
-
145
- export default SignInUsernameStep;
@@ -1,112 +0,0 @@
1
- import type React from 'react';
2
- import { useRef } from 'react';
3
- import { View, Text, Animated, TouchableOpacity, type TextInput } from 'react-native';
4
- import GroupedPillButtons from '../../components/internal/GroupedPillButtons';
5
- import TextField from '../../components/internal/TextField';
6
- import HighFive from '../../../assets/illustrations/HighFive';
7
- import { Ionicons } from '@expo/vector-icons';
8
-
9
- interface SignUpIdentityStepProps {
10
- styles: any;
11
- fadeAnim: Animated.Value;
12
- slideAnim: Animated.Value;
13
- colors: any;
14
- formData: any;
15
- validationState: any;
16
- updateField: (field: string, value: string) => void;
17
- setErrorMessage: (msg: string) => void;
18
- prevStep: () => void;
19
- handleIdentityNext: () => void;
20
- ValidationMessage: React.FC<any>;
21
- validateEmail: (email: string) => boolean;
22
- navigate: any;
23
- }
24
-
25
- const SignUpIdentityStep: React.FC<SignUpIdentityStepProps> = ({
26
- styles,
27
- fadeAnim,
28
- slideAnim,
29
- colors,
30
- formData,
31
- validationState,
32
- updateField,
33
- setErrorMessage,
34
- prevStep,
35
- handleIdentityNext: parentHandleIdentityNext,
36
- ValidationMessage,
37
- validateEmail,
38
- navigate,
39
- }) => {
40
- const inputRef = useRef<TextInput>(null);
41
- const handleIdentityNext = () => {
42
- if (!formData.username || validationState.status === 'invalid') {
43
- setTimeout(() => {
44
- inputRef.current?.focus();
45
- }, 0);
46
- }
47
- parentHandleIdentityNext();
48
- };
49
- return (
50
- <Animated.View style={[
51
- styles.stepContainer,
52
- { opacity: fadeAnim, transform: [{ translateX: slideAnim }] }
53
- ]}>
54
- <View style={styles.modernHeader}>
55
- <Text style={[styles.stepTitle, { color: colors.text }]}>Who are you?</Text>
56
- </View>
57
- <TextField
58
- ref={inputRef}
59
- leading={<Ionicons name="person-outline" size={24} color={colors.secondaryText} />}
60
- label="Username"
61
- value={formData.username}
62
- onChangeText={(text) => {
63
- updateField('username', text);
64
- setErrorMessage('');
65
- }}
66
- autoCapitalize="none"
67
- autoCorrect={false}
68
- testID="username-input"
69
- variant="filled"
70
- error={validationState.status === 'invalid' ? validationState.message : undefined}
71
- loading={validationState.status === 'validating'}
72
- success={validationState.status === 'valid'}
73
- onSubmitEditing={handleIdentityNext}
74
- autoFocus
75
- />
76
- <ValidationMessage validationState={validationState} colors={colors} styles={styles} />
77
- <TextField
78
- leading={<Ionicons name="mail-outline" size={24} color={colors.secondaryText} />}
79
- label="Email"
80
- value={formData.email}
81
- onChangeText={(text) => {
82
- updateField('email', text);
83
- }}
84
- keyboardType="email-address"
85
- autoCapitalize="none"
86
- autoCorrect={false}
87
- testID="email-input"
88
- variant="filled"
89
- error={formData.email && !validateEmail(formData.email) ? 'Please enter a valid email address' : undefined}
90
- />
91
- <GroupedPillButtons
92
- buttons={[
93
- {
94
- text: 'Back',
95
- onPress: prevStep,
96
- icon: 'arrow-back',
97
- variant: 'transparent',
98
- },
99
- {
100
- text: 'Next',
101
- onPress: handleIdentityNext,
102
- icon: 'arrow-forward',
103
- variant: 'primary',
104
- },
105
- ]}
106
- colors={colors}
107
- />
108
- </Animated.View>
109
- );
110
- };
111
-
112
- export default SignUpIdentityStep;
@@ -1,132 +0,0 @@
1
- import type React from 'react';
2
- import { useRef, useCallback, useEffect } from 'react';
3
- import { View, Text, Animated, type TextInput } from 'react-native';
4
- import { Ionicons } from '@expo/vector-icons';
5
- import GroupedPillButtons from '../../components/internal/GroupedPillButtons';
6
- import TextField from '../../components/internal/TextField';
7
-
8
- interface SignUpSecurityStepProps {
9
- styles: any;
10
- fadeAnim: Animated.Value;
11
- slideAnim: Animated.Value;
12
- colors: any;
13
- formData: any;
14
- passwordVisibility: { password: boolean; confirmPassword: boolean };
15
- updateField: (field: string, value: string) => void;
16
- validatePassword: (password: string) => boolean;
17
- validatePasswordsMatch: (password: string, confirmPassword: string) => boolean;
18
- prevStep: () => void;
19
- handleSecurityNext: () => void;
20
- setErrorMessage: (msg: string) => void;
21
- togglePasswordVisibility: () => void;
22
- PASSWORD_MIN_LENGTH: number;
23
- }
24
-
25
- const SignUpSecurityStep: React.FC<SignUpSecurityStepProps> = ({
26
- styles,
27
- fadeAnim,
28
- slideAnim,
29
- colors,
30
- formData,
31
- passwordVisibility,
32
- updateField,
33
- validatePassword,
34
- validatePasswordsMatch,
35
- prevStep,
36
- handleSecurityNext: parentHandleSecurityNext,
37
- setErrorMessage,
38
- togglePasswordVisibility,
39
- PASSWORD_MIN_LENGTH,
40
- }) => {
41
- const passwordRef = useRef<TextInput>(null);
42
- const confirmPasswordRef = useRef<TextInput>(null);
43
-
44
- // Focus the first invalid field on error or when step becomes active
45
- useEffect(() => {
46
- if (formData.password && typeof formData.password === 'string' && !validatePassword(formData.password)) {
47
- setTimeout(() => {
48
- passwordRef.current?.focus();
49
- }, 0);
50
- } else if (formData.confirmPassword && typeof formData.confirmPassword === 'string' && !validatePasswordsMatch(formData.password, formData.confirmPassword)) {
51
- setTimeout(() => {
52
- confirmPasswordRef.current?.focus();
53
- }, 0);
54
- }
55
- }, [formData.password, formData.confirmPassword, validatePassword, validatePasswordsMatch]);
56
-
57
- const handleSecurityNext = useCallback(() => {
58
- if (!formData.password || !validatePassword(formData.password)) {
59
- setTimeout(() => {
60
- passwordRef.current?.focus();
61
- }, 0);
62
- return;
63
- }
64
- if (!formData.confirmPassword || !validatePasswordsMatch(formData.password, formData.confirmPassword)) {
65
- setTimeout(() => {
66
- confirmPasswordRef.current?.focus();
67
- }, 0);
68
- return;
69
- }
70
- parentHandleSecurityNext();
71
- }, [formData.password, formData.confirmPassword, validatePassword, validatePasswordsMatch, parentHandleSecurityNext]);
72
-
73
- return (
74
- <Animated.View style={[
75
- styles.stepContainer,
76
- { opacity: fadeAnim, transform: [{ translateX: slideAnim }] }
77
- ]}>
78
- <View style={styles.modernHeader}>
79
- <Text style={[styles.stepTitle, { color: colors.text }]}>Secure your account</Text>
80
- </View>
81
- <TextField
82
- ref={passwordRef}
83
- leading={<Ionicons name="lock-closed-outline" size={24} color={colors.secondaryText} />}
84
- label="Password"
85
- value={formData.password}
86
- onChangeText={text => updateField('password', text)}
87
- secureTextEntry={!passwordVisibility.password}
88
- autoCapitalize="none"
89
- autoCorrect={false}
90
- testID="password-input"
91
- variant="filled"
92
- error={formData.password && typeof formData.password === 'string' && !validatePassword(formData.password) ? `Password must be at least ${PASSWORD_MIN_LENGTH} characters` : undefined}
93
- onSubmitEditing={() => confirmPasswordRef.current?.focus()}
94
- autoFocus
95
- />
96
- <Text style={[styles.passwordHint, { color: colors.secondaryText }]}>Password must be at least {PASSWORD_MIN_LENGTH} characters long</Text>
97
- <TextField
98
- ref={confirmPasswordRef}
99
- leading={<Ionicons name="lock-closed-outline" size={24} color={colors.secondaryText} />}
100
- label="Confirm Password"
101
- value={formData.confirmPassword}
102
- onChangeText={text => updateField('confirmPassword', text)}
103
- secureTextEntry={!passwordVisibility.confirmPassword}
104
- autoCapitalize="none"
105
- autoCorrect={false}
106
- testID="confirm-password-input"
107
- variant="filled"
108
- error={formData.confirmPassword && typeof formData.confirmPassword === 'string' && !validatePasswordsMatch(formData.password, formData.confirmPassword) ? 'Passwords do not match' : undefined}
109
- onSubmitEditing={handleSecurityNext}
110
- />
111
- <GroupedPillButtons
112
- buttons={[
113
- {
114
- text: 'Back',
115
- onPress: prevStep,
116
- icon: 'arrow-back',
117
- variant: 'transparent',
118
- },
119
- {
120
- text: 'Next',
121
- onPress: handleSecurityNext,
122
- icon: 'arrow-forward',
123
- variant: 'primary',
124
- },
125
- ]}
126
- colors={colors}
127
- />
128
- </Animated.View>
129
- );
130
- };
131
-
132
- export default SignUpSecurityStep;
@@ -1,66 +0,0 @@
1
- import type React from 'react';
2
- import { View, Text, Animated, TouchableOpacity } from 'react-native';
3
- import GroupedPillButtons from '../../components/internal/GroupedPillButtons';
4
-
5
- interface SignUpSummaryStepProps {
6
- styles: any;
7
- fadeAnim: Animated.Value;
8
- slideAnim: Animated.Value;
9
- colors: any;
10
- formData: any;
11
- isLoading: boolean;
12
- handleSignUp: () => void;
13
- prevStep: () => void;
14
- }
15
-
16
- const SignUpSummaryStep: React.FC<SignUpSummaryStepProps> = ({
17
- styles,
18
- fadeAnim,
19
- slideAnim,
20
- colors,
21
- formData,
22
- isLoading,
23
- handleSignUp,
24
- prevStep,
25
- }) => (
26
- <Animated.View style={[
27
- styles.stepContainer,
28
- { opacity: fadeAnim, transform: [{ translateX: slideAnim }] }
29
- ]}>
30
- <View style={styles.modernHeader}>
31
- <Text style={[styles.stepTitle, { color: colors.text }]}>Ready to join</Text>
32
- </View>
33
- <View style={styles.summaryContainer}>
34
- <View style={styles.summaryRow}>
35
- <Text style={[styles.summaryLabel, { color: colors.secondaryText }]}>Username:</Text>
36
- <Text style={[styles.summaryValue, { color: colors.text }]}>{formData.username}</Text>
37
- </View>
38
- <View style={styles.summaryRow}>
39
- <Text style={[styles.summaryLabel, { color: colors.secondaryText }]}>Email:</Text>
40
- <Text style={[styles.summaryValue, { color: colors.text }]}>{formData.email}</Text>
41
- </View>
42
- </View>
43
- <GroupedPillButtons
44
- buttons={[
45
- {
46
- text: 'Back',
47
- onPress: prevStep,
48
- icon: 'arrow-back',
49
- variant: 'transparent',
50
- },
51
- {
52
- text: 'Create Account',
53
- onPress: handleSignUp,
54
- icon: 'checkmark',
55
- variant: 'primary',
56
- disabled: isLoading,
57
- loading: isLoading,
58
- testID: 'signup-button',
59
- },
60
- ]}
61
- colors={colors}
62
- />
63
- </Animated.View>
64
- );
65
-
66
- export default SignUpSummaryStep;
@@ -1,52 +0,0 @@
1
- import type React from 'react';
2
- import { View, Text, Animated } from 'react-native';
3
- import HighFive from '../../../assets/illustrations/HighFive';
4
- import GroupedPillButtons from '../../components/internal/GroupedPillButtons';
5
-
6
- interface SignUpWelcomeStepProps {
7
- styles: any;
8
- fadeAnim: Animated.Value;
9
- slideAnim: Animated.Value;
10
- colors: any;
11
- nextStep: () => void;
12
- navigate: any;
13
- }
14
-
15
- const SignUpWelcomeStep: React.FC<SignUpWelcomeStepProps> = ({
16
- styles,
17
- fadeAnim,
18
- slideAnim,
19
- colors,
20
- nextStep,
21
- navigate,
22
- }) => (
23
- <Animated.View style={[
24
- styles.stepContainer,
25
- { opacity: fadeAnim, transform: [{ translateX: slideAnim }] }
26
- ]}>
27
- <HighFive width={100} height={100} />
28
- <View style={styles.modernHeader}>
29
- <Text style={[styles.modernTitle, { color: colors.text }]}>Welcome to Oxy</Text>
30
- <Text style={[styles.modernSubtitle, { color: colors.secondaryText }]}>We're excited to have you join us. Let's get your account set up in just a few easy steps.</Text>
31
- </View>
32
- <GroupedPillButtons
33
- buttons={[
34
- {
35
- text: 'Sign In',
36
- onPress: () => navigate('SignIn'),
37
- icon: 'log-in-outline',
38
- variant: 'transparent',
39
- },
40
- {
41
- text: 'Get Started',
42
- onPress: nextStep,
43
- icon: 'arrow-forward',
44
- variant: 'primary',
45
- },
46
- ]}
47
- colors={colors}
48
- />
49
- </Animated.View>
50
- );
51
-
52
- export default SignUpWelcomeStep;