@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.
Files changed (191) hide show
  1. package/README.md +404 -0
  2. package/lib/commonjs/assets/images/Checkbox.svg +3 -3
  3. package/lib/commonjs/assets/images/EnochE.svg +19 -19
  4. package/lib/commonjs/assets/images/Personalityprofile.svg +3 -3
  5. package/lib/commonjs/assets/images/Personalitytraits.svg +3 -3
  6. package/lib/commonjs/assets/images/Userpreferences.svg +3 -3
  7. package/lib/commonjs/assets/images/arrow.svg +20 -20
  8. package/lib/commonjs/assets/images/basicproficon.svg +43 -43
  9. package/lib/commonjs/assets/images/basicprofile.svg +3 -3
  10. package/lib/commonjs/assets/images/checkmark.svg +4 -4
  11. package/lib/commonjs/assets/images/contentanalysis.svg +3 -3
  12. package/lib/commonjs/assets/images/contenticon.svg +23 -23
  13. package/lib/commonjs/assets/images/personalityicon.svg +18 -18
  14. package/lib/commonjs/assets/images/x-close.svg +3 -3
  15. package/lib/commonjs/components/OnairosSignInButton.js +32 -74
  16. package/lib/commonjs/components/OnairosSignInButton.js.map +1 -1
  17. package/lib/commonjs/components/UniversalOnboarding.js +4 -4
  18. package/lib/commonjs/config/api.js +2 -2
  19. package/lib/commonjs/hooks/useConnections.js +6 -6
  20. package/lib/commonjs/hooks/useUserConnections.js +10 -10
  21. package/lib/commonjs/index.js +5 -12
  22. package/lib/commonjs/index.js.map +1 -1
  23. package/lib/commonjs/services/apiClient.js +35 -35
  24. package/lib/commonjs/services/apiKeyService.js +99 -99
  25. package/lib/commonjs/services/authService.js +82 -82
  26. package/lib/commonjs/services/biometricPinService.js +10 -10
  27. package/lib/commonjs/services/connectedAccountsService.js +32 -32
  28. package/lib/commonjs/services/googleAuthService.js +15 -15
  29. package/lib/commonjs/services/imageCompressionService.js +15 -15
  30. package/lib/commonjs/services/jwtStorageService.js +59 -59
  31. package/lib/commonjs/services/mobileTrainingService.js +14 -14
  32. package/lib/commonjs/services/pinEncryptionService.js +10 -10
  33. package/lib/commonjs/services/pinStorageUtils.js +15 -15
  34. package/lib/commonjs/services/platformAuthService.js +47 -47
  35. package/lib/commonjs/services/storageService.js +31 -31
  36. package/lib/commonjs/services/trainingApiHelpers.js +33 -33
  37. package/lib/commonjs/services/userConnectionsService.js +24 -24
  38. package/lib/commonjs/utils/Portal.js +4 -4
  39. package/lib/commonjs/utils/api.js +24 -24
  40. package/lib/commonjs/utils/auth.js +18 -18
  41. package/lib/commonjs/utils/crypto.js +13 -13
  42. package/lib/commonjs/utils/encryption.js +12 -12
  43. package/lib/commonjs/utils/eventUtils.js +52 -52
  44. package/lib/commonjs/utils/programmaticFlow.js +16 -16
  45. package/lib/commonjs/utils/retryHelper.js +27 -27
  46. package/lib/module/assets/images/Checkbox.svg +3 -3
  47. package/lib/module/assets/images/EnochE.svg +19 -19
  48. package/lib/module/assets/images/Personalityprofile.svg +3 -3
  49. package/lib/module/assets/images/Personalitytraits.svg +3 -3
  50. package/lib/module/assets/images/Userpreferences.svg +3 -3
  51. package/lib/module/assets/images/arrow.svg +20 -20
  52. package/lib/module/assets/images/basicproficon.svg +43 -43
  53. package/lib/module/assets/images/basicprofile.svg +3 -3
  54. package/lib/module/assets/images/checkmark.svg +4 -4
  55. package/lib/module/assets/images/contentanalysis.svg +3 -3
  56. package/lib/module/assets/images/contenticon.svg +23 -23
  57. package/lib/module/assets/images/personalityicon.svg +18 -18
  58. package/lib/module/assets/images/x-close.svg +3 -3
  59. package/lib/module/components/OnairosSignInButton.js +32 -74
  60. package/lib/module/components/OnairosSignInButton.js.map +1 -1
  61. package/lib/module/components/UniversalOnboarding.js +4 -4
  62. package/lib/module/config/api.js +2 -2
  63. package/lib/module/hooks/useConnections.js +6 -6
  64. package/lib/module/hooks/useUserConnections.js +10 -10
  65. package/lib/module/index.js +5 -6
  66. package/lib/module/index.js.map +1 -1
  67. package/lib/module/services/apiClient.js +35 -35
  68. package/lib/module/services/apiKeyService.js +99 -99
  69. package/lib/module/services/authService.js +82 -82
  70. package/lib/module/services/biometricPinService.js +10 -10
  71. package/lib/module/services/connectedAccountsService.js +32 -32
  72. package/lib/module/services/googleAuthService.js +15 -15
  73. package/lib/module/services/imageCompressionService.js +15 -15
  74. package/lib/module/services/jwtStorageService.js +59 -59
  75. package/lib/module/services/mobileTrainingService.js +14 -14
  76. package/lib/module/services/pinEncryptionService.js +10 -10
  77. package/lib/module/services/pinStorageUtils.js +15 -15
  78. package/lib/module/services/platformAuthService.js +47 -47
  79. package/lib/module/services/storageService.js +31 -31
  80. package/lib/module/services/trainingApiHelpers.js +33 -33
  81. package/lib/module/services/userConnectionsService.js +24 -24
  82. package/lib/module/utils/Portal.js +4 -4
  83. package/lib/module/utils/api.js +24 -24
  84. package/lib/module/utils/auth.js +18 -18
  85. package/lib/module/utils/crypto.js +13 -13
  86. package/lib/module/utils/encryption.js +12 -12
  87. package/lib/module/utils/eventUtils.js +52 -52
  88. package/lib/module/utils/programmaticFlow.js +16 -16
  89. package/lib/module/utils/retryHelper.js +27 -27
  90. package/lib/typescript/components/OnairosSignInButton.d.ts.map +1 -1
  91. package/lib/typescript/index.d.ts +0 -1
  92. package/lib/typescript/index.d.ts.map +1 -1
  93. package/package.json +163 -163
  94. package/src/api/index.ts +151 -151
  95. package/src/assets/images/Checkbox.svg +3 -3
  96. package/src/assets/images/EnochE.svg +19 -19
  97. package/src/assets/images/Personalityprofile.svg +3 -3
  98. package/src/assets/images/Personalitytraits.svg +3 -3
  99. package/src/assets/images/Userpreferences.svg +3 -3
  100. package/src/assets/images/arrow.svg +20 -20
  101. package/src/assets/images/basicproficon.svg +43 -43
  102. package/src/assets/images/basicprofile.svg +3 -3
  103. package/src/assets/images/checkmark.svg +4 -4
  104. package/src/assets/images/contentanalysis.svg +3 -3
  105. package/src/assets/images/contenticon.svg +23 -23
  106. package/src/assets/images/personalityicon.svg +18 -18
  107. package/src/assets/images/x-close.svg +3 -3
  108. package/src/components/BodyText.tsx +33 -33
  109. package/src/components/BrandMark.tsx +62 -62
  110. package/src/components/CodeInput.tsx +32 -32
  111. package/src/components/DataRequestScreen.tsx +355 -355
  112. package/src/components/EmailInput.tsx +31 -31
  113. package/src/components/EmailVerificationModal.tsx +363 -363
  114. package/src/components/ExistingUserDataConfirmation.tsx +506 -506
  115. package/src/components/GoogleButton.tsx +55 -55
  116. package/src/components/HeadingGroup.tsx +49 -49
  117. package/src/components/ModalHeader.tsx +125 -125
  118. package/src/components/ModalSheet.tsx +57 -57
  119. package/src/components/Onairos.tsx +422 -422
  120. package/src/components/OnairosButton.tsx +339 -339
  121. package/src/components/OnairosSignInButton.tsx +130 -166
  122. package/src/components/Overlay.tsx +506 -506
  123. package/src/components/PersonaImage.tsx +79 -79
  124. package/src/components/PersonaLoadingScreen.tsx +201 -201
  125. package/src/components/PersonalizationConsentScreen.tsx +410 -410
  126. package/src/components/PinCreationScreen.tsx +492 -492
  127. package/src/components/PinInput.tsx +555 -555
  128. package/src/components/PlatformConnectorsStep.tsx +891 -891
  129. package/src/components/PlatformList.tsx +144 -144
  130. package/src/components/PlatformToggle.tsx +226 -226
  131. package/src/components/PrimaryButton.tsx +213 -213
  132. package/src/components/SignInMatchAnimation.tsx +225 -225
  133. package/src/components/SignInStep.tsx +217 -217
  134. package/src/components/TrainingModal.tsx +1047 -1047
  135. package/src/components/UniversalOnboarding.tsx +2887 -2887
  136. package/src/components/VerificationStep.tsx +198 -198
  137. package/src/components/WelcomeScreen.tsx +473 -473
  138. package/src/components/icons/Basicproficon.tsx +30 -30
  139. package/src/components/icons/Basicprofile.tsx +17 -17
  140. package/src/components/icons/Checkbox.tsx +17 -17
  141. package/src/components/icons/Checkmark.tsx +24 -24
  142. package/src/components/icons/Contentanalysis.tsx +17 -17
  143. package/src/components/icons/Contenticon.tsx +30 -30
  144. package/src/components/icons/EnochE.tsx +39 -39
  145. package/src/components/icons/Personalityicon.tsx +22 -22
  146. package/src/components/icons/Personalityprofile.tsx +17 -17
  147. package/src/components/icons/Personalitytraits.tsx +17 -17
  148. package/src/components/icons/Userpreferences.tsx +17 -17
  149. package/src/components/icons/index.ts +12 -12
  150. package/src/components/onboarding/OAuthWebView.tsx +232 -232
  151. package/src/config/api.ts +25 -25
  152. package/src/context/AuthContext.tsx +393 -393
  153. package/src/hooks/useConnectedAccounts.ts +138 -138
  154. package/src/hooks/useConnections.ts +161 -161
  155. package/src/hooks/useCredentials.ts +174 -174
  156. package/src/hooks/useUserConnections.ts +165 -165
  157. package/src/index.js +14 -14
  158. package/src/index.ts +94 -95
  159. package/src/services/apiClient.ts +336 -336
  160. package/src/services/apiKeyService.ts +919 -919
  161. package/src/services/authService.ts +1008 -1008
  162. package/src/services/biometricPinService.ts +192 -192
  163. package/src/services/connectedAccountsService.ts +289 -289
  164. package/src/services/googleAuthService.ts +279 -279
  165. package/src/services/imageCompressionService.ts +302 -302
  166. package/src/services/jwtStorageService.ts +256 -256
  167. package/src/services/mobileTrainingService.ts +203 -203
  168. package/src/services/pinEncryptionService.ts +75 -75
  169. package/src/services/pinStorageUtils.ts +96 -96
  170. package/src/services/platformAuthService.ts +1346 -1346
  171. package/src/services/storageService.ts +451 -451
  172. package/src/services/trainingApiHelpers.ts +66 -66
  173. package/src/services/userConnectionsService.ts +556 -556
  174. package/src/services/youtubeMigrationService.ts +453 -453
  175. package/src/theme/index.ts +239 -239
  176. package/src/types/ambient.d.ts +28 -28
  177. package/src/types/index.ts +265 -265
  178. package/src/types/node-fix.d.ts +18 -18
  179. package/src/types/node-override.d.ts +23 -23
  180. package/src/types/opacity.d.ts +15 -15
  181. package/src/types/types.d.ts +17 -17
  182. package/src/utils/Portal.tsx +82 -82
  183. package/src/utils/api.js +111 -111
  184. package/src/utils/auth.js +103 -103
  185. package/src/utils/crypto.js +59 -59
  186. package/src/utils/encryption.ts +68 -68
  187. package/src/utils/eventUtils.ts +302 -302
  188. package/src/utils/haptics.ts +58 -58
  189. package/src/utils/imagePreloader.ts +2 -2
  190. package/src/utils/programmaticFlow.ts +112 -112
  191. package/src/utils/retryHelper.ts +274 -274
@@ -1,410 +1,410 @@
1
- import React, { useState } from 'react';
2
- import {
3
- View,
4
- Text,
5
- StyleSheet,
6
- TouchableOpacity,
7
- Image,
8
- } from 'react-native';
9
- import { COLORS, SPACING } from '../theme';
10
- import { triggerHaptic, HapticType } from '../utils/haptics';
11
- import {
12
- EnochE,
13
- Basicproficon,
14
- Basicprofile,
15
- Contenticon,
16
- Contentanalysis,
17
- Personalityicon,
18
- Personalityprofile,
19
- Personalitytraits,
20
- Userpreferences,
21
- Checkbox,
22
- Checkmark,
23
- } from './icons';
24
-
25
- interface PersonalizationConsentScreenProps {
26
- visible: boolean;
27
- onAccept: () => void;
28
- onDecline: () => void;
29
- }
30
-
31
- const PersonalizationConsentScreen: React.FC<PersonalizationConsentScreenProps> = ({
32
- visible,
33
- onAccept,
34
- onDecline,
35
- }) => {
36
- const [selectedOptions, setSelectedOptions] = useState({
37
- basicProfile: false,
38
- contentAnalysis: false,
39
- personalityProfile: false,
40
- });
41
-
42
- const handleOptionToggle = (option: 'basicProfile' | 'contentAnalysis' | 'personalityProfile') => {
43
- triggerHaptic(HapticType.BUTTON_PRESS);
44
- setSelectedOptions(prev => ({
45
- ...prev,
46
- [option]: !prev[option]
47
- }));
48
- };
49
-
50
- // Check if at least one option is selected
51
- const hasSelectedOptions = Object.values(selectedOptions).some(value => value);
52
-
53
- if (!visible) return null;
54
-
55
- return (
56
- <View style={styles.container}>
57
- {/* Header Icons */}
58
- <View style={styles.headerContainer}>
59
- <View style={styles.iconContainer}>
60
- <Image
61
- source={require('../assets/images/Onairoslogo.png')}
62
- style={styles.headerIcon}
63
- resizeMode="contain"
64
- />
65
- </View>
66
- <Text style={styles.arrow}>→</Text>
67
- <Image
68
- source={require('../assets/images/Enochicon1.png')}
69
- style={styles.enochAppIcon}
70
- resizeMode="contain"
71
- />
72
- </View>
73
-
74
- {/* Title and Subtitle */}
75
- <View style={styles.titleContainer}>
76
- <Text style={styles.title}>Enoch wants to personalize your experience</Text>
77
- <Text style={styles.subtitle}>Choose what to share:</Text>
78
- </View>
79
-
80
- {/* Options */}
81
- <View style={styles.optionsContainer}>
82
- {/* Basic Profile */}
83
- <TouchableOpacity
84
- style={styles.optionRow}
85
- onPress={() => handleOptionToggle('basicProfile')}
86
- >
87
- <View style={styles.optionLeft}>
88
- <Basicproficon
89
- width={32}
90
- height={32}
91
- fill={COLORS.grey700}
92
- style={styles.optionIcon}
93
- />
94
- <Basicprofile
95
- height={24}
96
- fill={COLORS.grey800}
97
- style={styles.optionText}
98
- />
99
- </View>
100
- <View style={styles.checkboxContainer}>
101
- {selectedOptions.basicProfile ? (
102
- <Checkmark
103
- width={24}
104
- height={24}
105
- fill="#4CD964"
106
- style={styles.checkbox}
107
- />
108
- ) : (
109
- <Checkbox
110
- width={24}
111
- height={24}
112
- stroke={COLORS.grey400}
113
- style={styles.checkbox}
114
- />
115
- )}
116
- </View>
117
- </TouchableOpacity>
118
-
119
- {/* Content Analysis */}
120
- <TouchableOpacity
121
- style={styles.optionRow}
122
- onPress={() => handleOptionToggle('contentAnalysis')}
123
- >
124
- <View style={styles.optionLeft}>
125
- <Contenticon
126
- width={32}
127
- height={32}
128
- fill={COLORS.grey700}
129
- style={styles.optionIcon}
130
- />
131
- <Userpreferences
132
- height={24}
133
- fill={COLORS.grey800}
134
- style={styles.optionText}
135
- />
136
- </View>
137
- <View style={styles.checkboxContainer}>
138
- {selectedOptions.contentAnalysis ? (
139
- <Checkmark
140
- width={24}
141
- height={24}
142
- fill="#4CD964"
143
- style={styles.checkbox}
144
- />
145
- ) : (
146
- <Checkbox
147
- width={24}
148
- height={24}
149
- stroke={COLORS.grey400}
150
- style={styles.checkbox}
151
- />
152
- )}
153
- </View>
154
- </TouchableOpacity>
155
-
156
- {/* Personality Profile */}
157
- <TouchableOpacity
158
- style={styles.optionRow}
159
- onPress={() => handleOptionToggle('personalityProfile')}
160
- >
161
- <View style={styles.optionLeft}>
162
- <Personalityicon
163
- width={32}
164
- height={32}
165
- fill={COLORS.grey700}
166
- style={styles.optionIcon}
167
- />
168
- <Personalitytraits
169
- height={24}
170
- fill={COLORS.grey800}
171
- style={styles.optionText}
172
- />
173
- </View>
174
- <View style={styles.checkboxContainer}>
175
- {selectedOptions.personalityProfile ? (
176
- <Checkmark
177
- width={24}
178
- height={24}
179
- fill="#4CD964"
180
- style={styles.checkbox}
181
- />
182
- ) : (
183
- <Checkbox
184
- width={24}
185
- height={24}
186
- stroke={COLORS.grey400}
187
- style={styles.checkbox}
188
- />
189
- )}
190
- </View>
191
- </TouchableOpacity>
192
- </View>
193
-
194
- {/* Buttons */}
195
- <View style={styles.buttonContainer}>
196
- <TouchableOpacity
197
- style={[
198
- styles.acceptButton,
199
- hasSelectedOptions && styles.acceptButtonActive
200
- ]}
201
- onPress={() => {
202
- triggerHaptic(HapticType.BUTTON_PRESS);
203
- onAccept();
204
- }}
205
- >
206
- <Text style={[
207
- styles.acceptButtonText,
208
- hasSelectedOptions && styles.acceptButtonTextActive
209
- ]}>Accept & Continue</Text>
210
- <Text style={[
211
- styles.buttonArrow,
212
- hasSelectedOptions && styles.buttonArrowActive
213
- ]}>→</Text>
214
- </TouchableOpacity>
215
-
216
- <TouchableOpacity
217
- style={styles.declineButton}
218
- onPress={() => {
219
- triggerHaptic(HapticType.BUTTON_PRESS);
220
- onDecline();
221
- }}
222
- >
223
- <Text style={styles.declineButtonText}>Decline</Text>
224
- </TouchableOpacity>
225
- </View>
226
- </View>
227
- );
228
- };
229
-
230
- const styles = StyleSheet.create({
231
- container: {
232
- flex: 1,
233
- backgroundColor: COLORS.surface,
234
- paddingHorizontal: 4,
235
- paddingTop: 5,
236
- paddingBottom: 10,
237
- },
238
-
239
- headerContainer: {
240
- flexDirection: 'row',
241
- alignItems: 'center',
242
- justifyContent: 'center',
243
- marginBottom: 32,
244
- },
245
-
246
- iconContainer: {
247
- width: 72,
248
- height: 72,
249
- backgroundColor: '#FFFFFF',
250
- borderRadius: 14,
251
- alignItems: 'center',
252
- justifyContent: 'center',
253
- marginHorizontal: 10,
254
- shadowColor: '#000',
255
- shadowOffset: { width: 0, height: 2 },
256
- shadowOpacity: 0.1,
257
- shadowRadius: 4,
258
- elevation: 2,
259
- },
260
-
261
- headerIcon: {
262
- width: 48,
263
- height: 48,
264
- },
265
-
266
- enochAppIcon: {
267
- width: 80,
268
- height: 80,
269
- marginHorizontal: 10,
270
- },
271
-
272
- enochLetter: {
273
- fontSize: 28,
274
- fontFamily: 'IBM Plex Sans',
275
- fontWeight: '700',
276
- color: COLORS.grey800,
277
- },
278
-
279
- arrow: {
280
- fontSize: 24,
281
- color: COLORS.grey600,
282
- marginHorizontal: 16,
283
- },
284
-
285
- titleContainer: {
286
- alignItems: 'center',
287
- marginBottom: 32,
288
- },
289
-
290
- title: {
291
- fontSize: 20,
292
- fontFamily: 'IBM Plex Sans',
293
- fontWeight: '600',
294
- color: COLORS.grey800,
295
- textAlign: 'center',
296
- marginBottom: 16,
297
- },
298
-
299
- subtitle: {
300
- fontSize: 16,
301
- fontFamily: 'Inter',
302
- fontWeight: '400',
303
- color: COLORS.grey600,
304
- textAlign: 'center',
305
- },
306
-
307
- optionsContainer: {
308
- flex: 1,
309
- marginBottom: 40,
310
- },
311
-
312
- optionRow: {
313
- flexDirection: 'row',
314
- alignItems: 'center',
315
- justifyContent: 'space-between',
316
- paddingVertical: 16,
317
- paddingHorizontal: 2,
318
- backgroundColor: '#F8F9FA',
319
- borderRadius: 12,
320
- marginBottom: 8,
321
- marginHorizontal: 0,
322
- },
323
-
324
- optionLeft: {
325
- flexDirection: 'row',
326
- alignItems: 'center',
327
- flex: 1,
328
- },
329
-
330
- optionIcon: {
331
- marginRight: 12,
332
- marginLeft: 2,
333
- marginTop: -4,
334
- },
335
-
336
- optionText: {
337
- flex: 1,
338
- marginLeft: 2,
339
- },
340
-
341
- checkboxContainer: {
342
- paddingLeft: 4,
343
- paddingRight: 2,
344
- alignItems: 'center',
345
- justifyContent: 'center',
346
- },
347
-
348
- checkbox: {
349
- // SVG components handle their own sizing
350
- },
351
-
352
- buttonContainer: {
353
- gap: 16,
354
- paddingHorizontal: 0,
355
- },
356
-
357
- acceptButton: {
358
- backgroundColor: '#E5E5E5',
359
- borderRadius: 25,
360
- paddingVertical: 16,
361
- paddingHorizontal: 24,
362
- flexDirection: 'row',
363
- alignItems: 'center',
364
- justifyContent: 'center',
365
- },
366
-
367
- acceptButtonActive: {
368
- backgroundColor: '#2D3436',
369
- },
370
-
371
- acceptButtonText: {
372
- color: '#999999',
373
- fontSize: 16,
374
- fontFamily: 'Inter',
375
- fontWeight: '600',
376
- marginRight: 8,
377
- },
378
-
379
- acceptButtonTextActive: {
380
- color: '#FFFFFF',
381
- },
382
-
383
- buttonArrow: {
384
- color: '#999999',
385
- fontSize: 16,
386
- },
387
-
388
- buttonArrowActive: {
389
- color: '#FFFFFF',
390
- },
391
-
392
- declineButton: {
393
- backgroundColor: '#E5E5E5',
394
- borderRadius: 25,
395
- paddingVertical: 16,
396
- paddingHorizontal: 24,
397
- alignItems: 'center',
398
- justifyContent: 'center',
399
- },
400
-
401
- declineButtonText: {
402
- color: COLORS.grey600,
403
- fontSize: 16,
404
- fontFamily: 'Inter',
405
- fontWeight: '500',
406
- },
407
- });
408
-
409
- export { PersonalizationConsentScreen };
410
- export default PersonalizationConsentScreen;
1
+ import React, { useState } from 'react';
2
+ import {
3
+ View,
4
+ Text,
5
+ StyleSheet,
6
+ TouchableOpacity,
7
+ Image,
8
+ } from 'react-native';
9
+ import { COLORS, SPACING } from '../theme';
10
+ import { triggerHaptic, HapticType } from '../utils/haptics';
11
+ import {
12
+ EnochE,
13
+ Basicproficon,
14
+ Basicprofile,
15
+ Contenticon,
16
+ Contentanalysis,
17
+ Personalityicon,
18
+ Personalityprofile,
19
+ Personalitytraits,
20
+ Userpreferences,
21
+ Checkbox,
22
+ Checkmark,
23
+ } from './icons';
24
+
25
+ interface PersonalizationConsentScreenProps {
26
+ visible: boolean;
27
+ onAccept: () => void;
28
+ onDecline: () => void;
29
+ }
30
+
31
+ const PersonalizationConsentScreen: React.FC<PersonalizationConsentScreenProps> = ({
32
+ visible,
33
+ onAccept,
34
+ onDecline,
35
+ }) => {
36
+ const [selectedOptions, setSelectedOptions] = useState({
37
+ basicProfile: false,
38
+ contentAnalysis: false,
39
+ personalityProfile: false,
40
+ });
41
+
42
+ const handleOptionToggle = (option: 'basicProfile' | 'contentAnalysis' | 'personalityProfile') => {
43
+ triggerHaptic(HapticType.BUTTON_PRESS);
44
+ setSelectedOptions(prev => ({
45
+ ...prev,
46
+ [option]: !prev[option]
47
+ }));
48
+ };
49
+
50
+ // Check if at least one option is selected
51
+ const hasSelectedOptions = Object.values(selectedOptions).some(value => value);
52
+
53
+ if (!visible) return null;
54
+
55
+ return (
56
+ <View style={styles.container}>
57
+ {/* Header Icons */}
58
+ <View style={styles.headerContainer}>
59
+ <View style={styles.iconContainer}>
60
+ <Image
61
+ source={require('../assets/images/Onairoslogo.png')}
62
+ style={styles.headerIcon}
63
+ resizeMode="contain"
64
+ />
65
+ </View>
66
+ <Text style={styles.arrow}>→</Text>
67
+ <Image
68
+ source={require('../assets/images/Enochicon1.png')}
69
+ style={styles.enochAppIcon}
70
+ resizeMode="contain"
71
+ />
72
+ </View>
73
+
74
+ {/* Title and Subtitle */}
75
+ <View style={styles.titleContainer}>
76
+ <Text style={styles.title}>Enoch wants to personalize your experience</Text>
77
+ <Text style={styles.subtitle}>Choose what to share:</Text>
78
+ </View>
79
+
80
+ {/* Options */}
81
+ <View style={styles.optionsContainer}>
82
+ {/* Basic Profile */}
83
+ <TouchableOpacity
84
+ style={styles.optionRow}
85
+ onPress={() => handleOptionToggle('basicProfile')}
86
+ >
87
+ <View style={styles.optionLeft}>
88
+ <Basicproficon
89
+ width={32}
90
+ height={32}
91
+ fill={COLORS.grey700}
92
+ style={styles.optionIcon}
93
+ />
94
+ <Basicprofile
95
+ height={24}
96
+ fill={COLORS.grey800}
97
+ style={styles.optionText}
98
+ />
99
+ </View>
100
+ <View style={styles.checkboxContainer}>
101
+ {selectedOptions.basicProfile ? (
102
+ <Checkmark
103
+ width={24}
104
+ height={24}
105
+ fill="#4CD964"
106
+ style={styles.checkbox}
107
+ />
108
+ ) : (
109
+ <Checkbox
110
+ width={24}
111
+ height={24}
112
+ stroke={COLORS.grey400}
113
+ style={styles.checkbox}
114
+ />
115
+ )}
116
+ </View>
117
+ </TouchableOpacity>
118
+
119
+ {/* Content Analysis */}
120
+ <TouchableOpacity
121
+ style={styles.optionRow}
122
+ onPress={() => handleOptionToggle('contentAnalysis')}
123
+ >
124
+ <View style={styles.optionLeft}>
125
+ <Contenticon
126
+ width={32}
127
+ height={32}
128
+ fill={COLORS.grey700}
129
+ style={styles.optionIcon}
130
+ />
131
+ <Userpreferences
132
+ height={24}
133
+ fill={COLORS.grey800}
134
+ style={styles.optionText}
135
+ />
136
+ </View>
137
+ <View style={styles.checkboxContainer}>
138
+ {selectedOptions.contentAnalysis ? (
139
+ <Checkmark
140
+ width={24}
141
+ height={24}
142
+ fill="#4CD964"
143
+ style={styles.checkbox}
144
+ />
145
+ ) : (
146
+ <Checkbox
147
+ width={24}
148
+ height={24}
149
+ stroke={COLORS.grey400}
150
+ style={styles.checkbox}
151
+ />
152
+ )}
153
+ </View>
154
+ </TouchableOpacity>
155
+
156
+ {/* Personality Profile */}
157
+ <TouchableOpacity
158
+ style={styles.optionRow}
159
+ onPress={() => handleOptionToggle('personalityProfile')}
160
+ >
161
+ <View style={styles.optionLeft}>
162
+ <Personalityicon
163
+ width={32}
164
+ height={32}
165
+ fill={COLORS.grey700}
166
+ style={styles.optionIcon}
167
+ />
168
+ <Personalitytraits
169
+ height={24}
170
+ fill={COLORS.grey800}
171
+ style={styles.optionText}
172
+ />
173
+ </View>
174
+ <View style={styles.checkboxContainer}>
175
+ {selectedOptions.personalityProfile ? (
176
+ <Checkmark
177
+ width={24}
178
+ height={24}
179
+ fill="#4CD964"
180
+ style={styles.checkbox}
181
+ />
182
+ ) : (
183
+ <Checkbox
184
+ width={24}
185
+ height={24}
186
+ stroke={COLORS.grey400}
187
+ style={styles.checkbox}
188
+ />
189
+ )}
190
+ </View>
191
+ </TouchableOpacity>
192
+ </View>
193
+
194
+ {/* Buttons */}
195
+ <View style={styles.buttonContainer}>
196
+ <TouchableOpacity
197
+ style={[
198
+ styles.acceptButton,
199
+ hasSelectedOptions && styles.acceptButtonActive
200
+ ]}
201
+ onPress={() => {
202
+ triggerHaptic(HapticType.BUTTON_PRESS);
203
+ onAccept();
204
+ }}
205
+ >
206
+ <Text style={[
207
+ styles.acceptButtonText,
208
+ hasSelectedOptions && styles.acceptButtonTextActive
209
+ ]}>Accept & Continue</Text>
210
+ <Text style={[
211
+ styles.buttonArrow,
212
+ hasSelectedOptions && styles.buttonArrowActive
213
+ ]}>→</Text>
214
+ </TouchableOpacity>
215
+
216
+ <TouchableOpacity
217
+ style={styles.declineButton}
218
+ onPress={() => {
219
+ triggerHaptic(HapticType.BUTTON_PRESS);
220
+ onDecline();
221
+ }}
222
+ >
223
+ <Text style={styles.declineButtonText}>Decline</Text>
224
+ </TouchableOpacity>
225
+ </View>
226
+ </View>
227
+ );
228
+ };
229
+
230
+ const styles = StyleSheet.create({
231
+ container: {
232
+ flex: 1,
233
+ backgroundColor: COLORS.surface,
234
+ paddingHorizontal: 4,
235
+ paddingTop: 5,
236
+ paddingBottom: 10,
237
+ },
238
+
239
+ headerContainer: {
240
+ flexDirection: 'row',
241
+ alignItems: 'center',
242
+ justifyContent: 'center',
243
+ marginBottom: 32,
244
+ },
245
+
246
+ iconContainer: {
247
+ width: 72,
248
+ height: 72,
249
+ backgroundColor: '#FFFFFF',
250
+ borderRadius: 14,
251
+ alignItems: 'center',
252
+ justifyContent: 'center',
253
+ marginHorizontal: 10,
254
+ shadowColor: '#000',
255
+ shadowOffset: { width: 0, height: 2 },
256
+ shadowOpacity: 0.1,
257
+ shadowRadius: 4,
258
+ elevation: 2,
259
+ },
260
+
261
+ headerIcon: {
262
+ width: 48,
263
+ height: 48,
264
+ },
265
+
266
+ enochAppIcon: {
267
+ width: 80,
268
+ height: 80,
269
+ marginHorizontal: 10,
270
+ },
271
+
272
+ enochLetter: {
273
+ fontSize: 28,
274
+ fontFamily: 'IBM Plex Sans',
275
+ fontWeight: '700',
276
+ color: COLORS.grey800,
277
+ },
278
+
279
+ arrow: {
280
+ fontSize: 24,
281
+ color: COLORS.grey600,
282
+ marginHorizontal: 16,
283
+ },
284
+
285
+ titleContainer: {
286
+ alignItems: 'center',
287
+ marginBottom: 32,
288
+ },
289
+
290
+ title: {
291
+ fontSize: 20,
292
+ fontFamily: 'IBM Plex Sans',
293
+ fontWeight: '600',
294
+ color: COLORS.grey800,
295
+ textAlign: 'center',
296
+ marginBottom: 16,
297
+ },
298
+
299
+ subtitle: {
300
+ fontSize: 16,
301
+ fontFamily: 'Inter',
302
+ fontWeight: '400',
303
+ color: COLORS.grey600,
304
+ textAlign: 'center',
305
+ },
306
+
307
+ optionsContainer: {
308
+ flex: 1,
309
+ marginBottom: 40,
310
+ },
311
+
312
+ optionRow: {
313
+ flexDirection: 'row',
314
+ alignItems: 'center',
315
+ justifyContent: 'space-between',
316
+ paddingVertical: 16,
317
+ paddingHorizontal: 2,
318
+ backgroundColor: '#F8F9FA',
319
+ borderRadius: 12,
320
+ marginBottom: 8,
321
+ marginHorizontal: 0,
322
+ },
323
+
324
+ optionLeft: {
325
+ flexDirection: 'row',
326
+ alignItems: 'center',
327
+ flex: 1,
328
+ },
329
+
330
+ optionIcon: {
331
+ marginRight: 12,
332
+ marginLeft: 2,
333
+ marginTop: -4,
334
+ },
335
+
336
+ optionText: {
337
+ flex: 1,
338
+ marginLeft: 2,
339
+ },
340
+
341
+ checkboxContainer: {
342
+ paddingLeft: 4,
343
+ paddingRight: 2,
344
+ alignItems: 'center',
345
+ justifyContent: 'center',
346
+ },
347
+
348
+ checkbox: {
349
+ // SVG components handle their own sizing
350
+ },
351
+
352
+ buttonContainer: {
353
+ gap: 16,
354
+ paddingHorizontal: 0,
355
+ },
356
+
357
+ acceptButton: {
358
+ backgroundColor: '#E5E5E5',
359
+ borderRadius: 25,
360
+ paddingVertical: 16,
361
+ paddingHorizontal: 24,
362
+ flexDirection: 'row',
363
+ alignItems: 'center',
364
+ justifyContent: 'center',
365
+ },
366
+
367
+ acceptButtonActive: {
368
+ backgroundColor: '#2D3436',
369
+ },
370
+
371
+ acceptButtonText: {
372
+ color: '#999999',
373
+ fontSize: 16,
374
+ fontFamily: 'Inter',
375
+ fontWeight: '600',
376
+ marginRight: 8,
377
+ },
378
+
379
+ acceptButtonTextActive: {
380
+ color: '#FFFFFF',
381
+ },
382
+
383
+ buttonArrow: {
384
+ color: '#999999',
385
+ fontSize: 16,
386
+ },
387
+
388
+ buttonArrowActive: {
389
+ color: '#FFFFFF',
390
+ },
391
+
392
+ declineButton: {
393
+ backgroundColor: '#E5E5E5',
394
+ borderRadius: 25,
395
+ paddingVertical: 16,
396
+ paddingHorizontal: 24,
397
+ alignItems: 'center',
398
+ justifyContent: 'center',
399
+ },
400
+
401
+ declineButtonText: {
402
+ color: COLORS.grey600,
403
+ fontSize: 16,
404
+ fontFamily: 'Inter',
405
+ fontWeight: '500',
406
+ },
407
+ });
408
+
409
+ export { PersonalizationConsentScreen };
410
+ export default PersonalizationConsentScreen;