@oxyhq/services 5.7.5 → 5.8.1
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 +76 -76
- package/lib/commonjs/core/index.js +177 -102
- package/lib/commonjs/core/index.js.map +1 -1
- package/lib/commonjs/index.js +88 -29
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/node/createAuth.js +585 -7
- package/lib/commonjs/node/createAuth.js.map +1 -1
- package/lib/commonjs/node/index.js +38 -1
- package/lib/commonjs/node/index.js.map +1 -1
- package/lib/commonjs/ui/components/Avatar.js +15 -6
- package/lib/commonjs/ui/components/Avatar.js.map +1 -1
- package/lib/commonjs/ui/components/GroupedItem.js +58 -13
- package/lib/commonjs/ui/components/GroupedItem.js.map +1 -1
- package/lib/commonjs/ui/components/GroupedSection.js +7 -1
- package/lib/commonjs/ui/components/GroupedSection.js.map +1 -1
- package/lib/commonjs/ui/components/Header.js +322 -0
- package/lib/commonjs/ui/components/Header.js.map +1 -0
- package/lib/commonjs/ui/components/OxyProvider.js +23 -7
- package/lib/commonjs/ui/components/OxyProvider.js.map +1 -1
- package/lib/commonjs/ui/components/index.js +7 -0
- package/lib/commonjs/ui/components/index.js.map +1 -1
- package/lib/commonjs/ui/components/internal/GroupedPillButtons.js +1 -1
- package/lib/commonjs/ui/components/internal/GroupedPillButtons.js.map +1 -1
- package/lib/commonjs/ui/components/internal/TextField.js +606 -546
- package/lib/commonjs/ui/components/internal/TextField.js.map +1 -1
- package/lib/commonjs/ui/components/internal/TextField.md +436 -0
- package/lib/commonjs/ui/context/OxyContext.js +122 -78
- package/lib/commonjs/ui/context/OxyContext.js.map +1 -1
- package/lib/commonjs/ui/hooks/useSessionSocket.js +5 -2
- package/lib/commonjs/ui/hooks/useSessionSocket.js.map +1 -1
- package/lib/commonjs/ui/navigation/OxyRouter.js +1 -1
- package/lib/commonjs/ui/navigation/OxyRouter.js.map +1 -1
- package/lib/commonjs/ui/screens/AccountCenterScreen.js +6 -6
- package/lib/commonjs/ui/screens/AccountCenterScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/AccountManagementDemo.js +3 -3
- package/lib/commonjs/ui/screens/AccountManagementDemo.js.map +1 -1
- package/lib/commonjs/ui/screens/AccountOverviewScreen.js +241 -598
- package/lib/commonjs/ui/screens/AccountOverviewScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/AccountSettingsScreen.js +1151 -406
- package/lib/commonjs/ui/screens/AccountSettingsScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/AccountSwitcherScreen.js +135 -237
- package/lib/commonjs/ui/screens/AccountSwitcherScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/AppInfoScreen.js +246 -463
- package/lib/commonjs/ui/screens/AppInfoScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/FeedbackScreen.js +3 -3
- package/lib/commonjs/ui/screens/FeedbackScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/PaymentGatewayScreen.js +808 -650
- package/lib/commonjs/ui/screens/PaymentGatewayScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/RecoverAccountScreen.js +51 -72
- package/lib/commonjs/ui/screens/RecoverAccountScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/SessionManagementScreen.js +11 -29
- package/lib/commonjs/ui/screens/SessionManagementScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/SignInScreen.js +30 -303
- package/lib/commonjs/ui/screens/SignInScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/SignUpScreen.js +4 -4
- package/lib/commonjs/ui/screens/SignUpScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/internal/SignInPasswordStep.js +19 -31
- package/lib/commonjs/ui/screens/internal/SignInPasswordStep.js.map +1 -1
- package/lib/commonjs/ui/screens/internal/SignInUsernameStep.js +7 -10
- package/lib/commonjs/ui/screens/internal/SignInUsernameStep.js.map +1 -1
- package/lib/commonjs/ui/screens/internal/SignUpIdentityStep.js +11 -5
- package/lib/commonjs/ui/screens/internal/SignUpIdentityStep.js.map +1 -1
- package/lib/commonjs/ui/screens/internal/SignUpSecurityStep.js +11 -4
- package/lib/commonjs/ui/screens/internal/SignUpSecurityStep.js.map +1 -1
- package/lib/commonjs/ui/stores/authStore.js +12 -0
- package/lib/commonjs/ui/stores/authStore.js.map +1 -1
- package/lib/commonjs/ui/styles/authStyles.js +337 -0
- package/lib/commonjs/ui/styles/authStyles.js.map +1 -0
- package/lib/commonjs/ui/styles/index.js +11 -0
- package/lib/commonjs/ui/styles/index.js.map +1 -1
- package/lib/module/core/index.js +177 -41
- package/lib/module/core/index.js.map +1 -1
- package/lib/module/index.js +26 -4
- package/lib/module/index.js.map +1 -1
- package/lib/module/node/createAuth.js +584 -7
- package/lib/module/node/createAuth.js.map +1 -1
- package/lib/module/node/index.js +7 -1
- package/lib/module/node/index.js.map +1 -1
- package/lib/module/ui/components/Avatar.js +15 -6
- package/lib/module/ui/components/Avatar.js.map +1 -1
- package/lib/module/ui/components/GroupedItem.js +59 -14
- package/lib/module/ui/components/GroupedItem.js.map +1 -1
- package/lib/module/ui/components/GroupedSection.js +7 -1
- package/lib/module/ui/components/GroupedSection.js.map +1 -1
- package/lib/module/ui/components/Header.js +317 -0
- package/lib/module/ui/components/Header.js.map +1 -0
- package/lib/module/ui/components/OxyProvider.js +25 -9
- package/lib/module/ui/components/OxyProvider.js.map +1 -1
- package/lib/module/ui/components/index.js +1 -0
- package/lib/module/ui/components/index.js.map +1 -1
- package/lib/module/ui/components/internal/GroupedPillButtons.js +1 -1
- package/lib/module/ui/components/internal/GroupedPillButtons.js.map +1 -1
- package/lib/module/ui/components/internal/TextField.js +607 -547
- package/lib/module/ui/components/internal/TextField.js.map +1 -1
- package/lib/module/ui/components/internal/TextField.md +436 -0
- package/lib/module/ui/context/OxyContext.js +121 -77
- package/lib/module/ui/context/OxyContext.js.map +1 -1
- package/lib/module/ui/hooks/useSessionSocket.js +5 -2
- package/lib/module/ui/hooks/useSessionSocket.js.map +1 -1
- package/lib/module/ui/navigation/OxyRouter.js +1 -1
- package/lib/module/ui/navigation/OxyRouter.js.map +1 -1
- package/lib/module/ui/screens/AccountCenterScreen.js +6 -6
- package/lib/module/ui/screens/AccountCenterScreen.js.map +1 -1
- package/lib/module/ui/screens/AccountManagementDemo.js +3 -3
- package/lib/module/ui/screens/AccountManagementDemo.js.map +1 -1
- package/lib/module/ui/screens/AccountOverviewScreen.js +242 -597
- package/lib/module/ui/screens/AccountOverviewScreen.js.map +1 -1
- package/lib/module/ui/screens/AccountSettingsScreen.js +1152 -407
- package/lib/module/ui/screens/AccountSettingsScreen.js.map +1 -1
- package/lib/module/ui/screens/AccountSwitcherScreen.js +135 -237
- package/lib/module/ui/screens/AccountSwitcherScreen.js.map +1 -1
- package/lib/module/ui/screens/AppInfoScreen.js +248 -465
- package/lib/module/ui/screens/AppInfoScreen.js.map +1 -1
- package/lib/module/ui/screens/FeedbackScreen.js +3 -3
- package/lib/module/ui/screens/FeedbackScreen.js.map +1 -1
- package/lib/module/ui/screens/PaymentGatewayScreen.js +809 -651
- package/lib/module/ui/screens/PaymentGatewayScreen.js.map +1 -1
- package/lib/module/ui/screens/RecoverAccountScreen.js +53 -74
- package/lib/module/ui/screens/RecoverAccountScreen.js.map +1 -1
- package/lib/module/ui/screens/SessionManagementScreen.js +11 -29
- package/lib/module/ui/screens/SessionManagementScreen.js.map +1 -1
- package/lib/module/ui/screens/SignInScreen.js +32 -305
- package/lib/module/ui/screens/SignInScreen.js.map +1 -1
- package/lib/module/ui/screens/SignUpScreen.js +5 -5
- package/lib/module/ui/screens/SignUpScreen.js.map +1 -1
- package/lib/module/ui/screens/internal/SignInPasswordStep.js +19 -31
- package/lib/module/ui/screens/internal/SignInPasswordStep.js.map +1 -1
- package/lib/module/ui/screens/internal/SignInUsernameStep.js +7 -10
- package/lib/module/ui/screens/internal/SignInUsernameStep.js.map +1 -1
- package/lib/module/ui/screens/internal/SignUpIdentityStep.js +11 -5
- package/lib/module/ui/screens/internal/SignUpIdentityStep.js.map +1 -1
- package/lib/module/ui/screens/internal/SignUpSecurityStep.js +11 -4
- package/lib/module/ui/screens/internal/SignUpSecurityStep.js.map +1 -1
- package/lib/module/ui/stores/authStore.js +12 -0
- package/lib/module/ui/stores/authStore.js.map +1 -1
- package/lib/module/ui/styles/authStyles.js +332 -0
- package/lib/module/ui/styles/authStyles.js.map +1 -0
- package/lib/module/ui/styles/index.js +1 -0
- package/lib/module/ui/styles/index.js.map +1 -1
- package/lib/typescript/core/index.d.ts +68 -24
- package/lib/typescript/core/index.d.ts.map +1 -1
- package/lib/typescript/index.d.ts +13 -3
- package/lib/typescript/index.d.ts.map +1 -1
- package/lib/typescript/node/createAuth.d.ts +112 -0
- package/lib/typescript/node/createAuth.d.ts.map +1 -1
- package/lib/typescript/node/index.d.ts +2 -0
- package/lib/typescript/node/index.d.ts.map +1 -1
- package/lib/typescript/ui/components/Avatar.d.ts.map +1 -1
- package/lib/typescript/ui/components/GroupedItem.d.ts +6 -0
- package/lib/typescript/ui/components/GroupedItem.d.ts.map +1 -1
- package/lib/typescript/ui/components/GroupedSection.d.ts +6 -0
- package/lib/typescript/ui/components/GroupedSection.d.ts.map +1 -1
- package/lib/typescript/ui/components/Header.d.ts +22 -0
- package/lib/typescript/ui/components/Header.d.ts.map +1 -0
- package/lib/typescript/ui/components/OxyProvider.d.ts.map +1 -1
- package/lib/typescript/ui/components/index.d.ts +1 -0
- package/lib/typescript/ui/components/index.d.ts.map +1 -1
- package/lib/typescript/ui/components/internal/TextField.d.ts +31 -16
- package/lib/typescript/ui/components/internal/TextField.d.ts.map +1 -1
- package/lib/typescript/ui/context/OxyContext.d.ts +5 -2
- package/lib/typescript/ui/context/OxyContext.d.ts.map +1 -1
- package/lib/typescript/ui/hooks/useSessionSocket.d.ts.map +1 -1
- package/lib/typescript/ui/navigation/types.d.ts +9 -2
- package/lib/typescript/ui/navigation/types.d.ts.map +1 -1
- package/lib/typescript/ui/screens/AccountOverviewScreen.d.ts.map +1 -1
- package/lib/typescript/ui/screens/AccountSettingsScreen.d.ts.map +1 -1
- package/lib/typescript/ui/screens/AccountSwitcherScreen.d.ts.map +1 -1
- package/lib/typescript/ui/screens/AppInfoScreen.d.ts.map +1 -1
- package/lib/typescript/ui/screens/PaymentGatewayScreen.d.ts.map +1 -1
- package/lib/typescript/ui/screens/RecoverAccountScreen.d.ts +5 -1
- package/lib/typescript/ui/screens/RecoverAccountScreen.d.ts.map +1 -1
- package/lib/typescript/ui/screens/SessionManagementScreen.d.ts.map +1 -1
- package/lib/typescript/ui/screens/SignInScreen.d.ts.map +1 -1
- package/lib/typescript/ui/screens/internal/SignInPasswordStep.d.ts +1 -1
- package/lib/typescript/ui/screens/internal/SignInPasswordStep.d.ts.map +1 -1
- package/lib/typescript/ui/screens/internal/SignInUsernameStep.d.ts +0 -1
- package/lib/typescript/ui/screens/internal/SignInUsernameStep.d.ts.map +1 -1
- package/lib/typescript/ui/screens/internal/SignUpIdentityStep.d.ts.map +1 -1
- package/lib/typescript/ui/screens/internal/SignUpSecurityStep.d.ts.map +1 -1
- package/lib/typescript/ui/stores/authStore.d.ts.map +1 -1
- package/lib/typescript/ui/styles/authStyles.d.ts +326 -0
- package/lib/typescript/ui/styles/authStyles.d.ts.map +1 -0
- package/lib/typescript/ui/styles/index.d.ts +1 -0
- package/lib/typescript/ui/styles/index.d.ts.map +1 -1
- package/package.json +1 -4
- package/src/core/index.ts +195 -41
- package/src/index.ts +72 -4
- package/src/node/createAuth.ts +623 -7
- package/src/node/index.ts +19 -1
- package/src/ui/components/Avatar.tsx +11 -5
- package/src/ui/components/GroupedItem.tsx +57 -9
- package/src/ui/components/GroupedSection.tsx +12 -0
- package/src/ui/components/Header.tsx +364 -0
- package/src/ui/components/OxyProvider.tsx +31 -15
- package/src/ui/components/index.ts +1 -0
- package/src/ui/components/internal/GroupedPillButtons.tsx +1 -1
- package/src/ui/components/internal/TextField.md +436 -0
- package/src/ui/components/internal/TextField.tsx +720 -620
- package/src/ui/context/OxyContext.tsx +150 -63
- package/src/ui/hooks/useSessionSocket.ts +5 -2
- package/src/ui/navigation/OxyRouter.tsx +1 -1
- package/src/ui/navigation/types.ts +10 -2
- package/src/ui/screens/AccountCenterScreen.tsx +5 -5
- package/src/ui/screens/AccountManagementDemo.tsx +9 -9
- package/src/ui/screens/AccountOverviewScreen.tsx +265 -414
- package/src/ui/screens/AccountSettingsScreen.tsx +1165 -403
- package/src/ui/screens/AccountSwitcherScreen.tsx +158 -202
- package/src/ui/screens/AppInfoScreen.tsx +270 -497
- package/src/ui/screens/FeedbackScreen.tsx +3 -3
- package/src/ui/screens/PaymentGatewayScreen.tsx +668 -365
- package/src/ui/screens/ProfileScreen.tsx +5 -5
- package/src/ui/screens/RecoverAccountScreen.tsx +46 -74
- package/src/ui/screens/SessionManagementScreen.tsx +14 -22
- package/src/ui/screens/SignInScreen.tsx +27 -294
- package/src/ui/screens/SignUpScreen.tsx +5 -5
- package/src/ui/screens/internal/SignInPasswordStep.tsx +11 -22
- package/src/ui/screens/internal/SignInUsernameStep.tsx +3 -10
- package/src/ui/screens/internal/SignUpIdentityStep.tsx +2 -5
- package/src/ui/screens/internal/SignUpSecurityStep.tsx +3 -4
- package/src/ui/stores/authStore.ts +12 -0
- package/src/ui/styles/authStyles.ts +352 -0
- package/src/ui/styles/index.ts +1 -0
- package/lib/commonjs/core/auth-manager.js +0 -440
- package/lib/commonjs/core/auth-manager.js.map +0 -1
- package/lib/commonjs/core/use-auth.js +0 -244
- package/lib/commonjs/core/use-auth.js.map +0 -1
- package/lib/module/core/auth-manager.js +0 -432
- package/lib/module/core/auth-manager.js.map +0 -1
- package/lib/module/core/use-auth.js +0 -235
- package/lib/module/core/use-auth.js.map +0 -1
- package/lib/typescript/core/auth-manager.d.ts +0 -136
- package/lib/typescript/core/auth-manager.d.ts.map +0 -1
- package/lib/typescript/core/use-auth.d.ts +0 -79
- package/lib/typescript/core/use-auth.d.ts.map +0 -1
- package/src/__tests__/middleware.test.ts +0 -105
- package/src/__tests__/setup.ts +0 -10
- package/src/__tests__/zero-config-auth.test.ts +0 -607
- package/src/core/auth-manager.ts +0 -500
- package/src/core/use-auth.tsx +0 -245
|
@@ -20,6 +20,7 @@ import { fontFamilies } from '../styles/fonts';
|
|
|
20
20
|
import { toast } from '../../lib/sonner';
|
|
21
21
|
import { confirmAction } from '../utils/confirmAction';
|
|
22
22
|
import { Ionicons } from '@expo/vector-icons';
|
|
23
|
+
import { Header, Section, GroupedSection, GroupedItem } from '../components';
|
|
23
24
|
|
|
24
25
|
/**
|
|
25
26
|
* AccountOverviewScreen - Optimized for performance
|
|
@@ -29,6 +30,7 @@ import { Ionicons } from '@expo/vector-icons';
|
|
|
29
30
|
* - useMemo for additional accounts filtering (only recalculates when dependencies change)
|
|
30
31
|
* - useCallback for event handlers to prevent unnecessary re-renders
|
|
31
32
|
* - React.memo wrapper to prevent re-renders when props haven't changed
|
|
33
|
+
* - GroupedSection components for better organization and cleaner code
|
|
32
34
|
*/
|
|
33
35
|
const AccountOverviewScreen: React.FC<BaseScreenProps> = ({
|
|
34
36
|
onClose,
|
|
@@ -166,373 +168,293 @@ const AccountOverviewScreen: React.FC<BaseScreenProps> = ({
|
|
|
166
168
|
return (
|
|
167
169
|
<View style={[styles.container, { backgroundColor: '#f2f2f2' }]}>
|
|
168
170
|
{/* Header */}
|
|
169
|
-
<
|
|
170
|
-
|
|
171
|
-
{
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
</View>
|
|
171
|
+
<Header
|
|
172
|
+
title="Account"
|
|
173
|
+
theme={theme}
|
|
174
|
+
onBack={onClose}
|
|
175
|
+
variant="minimal"
|
|
176
|
+
elevation="subtle"
|
|
177
|
+
/>
|
|
177
178
|
|
|
178
179
|
<ScrollView style={styles.content}>
|
|
179
180
|
{/* User Profile Section */}
|
|
180
|
-
<
|
|
181
|
-
<
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
name
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
181
|
+
<Section title="Profile" theme={theme} isFirst={true}>
|
|
182
|
+
<GroupedSection
|
|
183
|
+
items={[
|
|
184
|
+
{
|
|
185
|
+
id: 'profile-info',
|
|
186
|
+
icon: 'person',
|
|
187
|
+
iconColor: '#007AFF',
|
|
188
|
+
title: user ? (typeof user.name === 'string' ? user.name : user.name?.full || user.name?.first || user.username) : 'Loading...',
|
|
189
|
+
subtitle: user ? (user.email || user.username) : 'Loading...',
|
|
190
|
+
onPress: () => toast.info('Manage your Oxy Account feature coming soon!'),
|
|
191
|
+
customContent: (
|
|
192
|
+
<>
|
|
193
|
+
<View style={styles.userIcon}>
|
|
194
|
+
<Avatar
|
|
195
|
+
uri={user?.avatar?.url}
|
|
196
|
+
name={user?.name?.full}
|
|
197
|
+
size={40}
|
|
198
|
+
theme={theme}
|
|
199
|
+
/>
|
|
200
|
+
</View>
|
|
201
|
+
<TouchableOpacity
|
|
202
|
+
style={styles.manageButton}
|
|
203
|
+
onPress={() => toast.info('Manage your Oxy Account feature coming soon!')}
|
|
204
|
+
>
|
|
205
|
+
<Text style={styles.manageButtonText}>Manage</Text>
|
|
206
|
+
</TouchableOpacity>
|
|
207
|
+
</>
|
|
208
|
+
),
|
|
209
|
+
},
|
|
210
|
+
]}
|
|
211
|
+
theme={theme}
|
|
212
|
+
/>
|
|
213
|
+
</Section>
|
|
208
214
|
|
|
209
215
|
{/* Account Settings */}
|
|
210
|
-
<
|
|
211
|
-
<
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
onPress={() => navigate?.('PremiumSubscription')}
|
|
258
|
-
>
|
|
259
|
-
<View style={styles.settingInfo}>
|
|
260
|
-
<OxyIcon name="star" size={20} color="#FFD700" style={styles.settingIcon} />
|
|
261
|
-
<View>
|
|
262
|
-
<Text style={styles.settingLabel}>Oxy+ Subscriptions</Text>
|
|
263
|
-
<Text style={styles.settingDescription}>{user?.isPremium ? 'Manage your premium plan' : 'Upgrade to premium features'}</Text>
|
|
264
|
-
</View>
|
|
265
|
-
</View>
|
|
266
|
-
<OxyIcon name="chevron-forward" size={16} color="#ccc" />
|
|
267
|
-
</TouchableOpacity>
|
|
268
|
-
|
|
269
|
-
{user?.isPremium && (
|
|
270
|
-
<TouchableOpacity
|
|
271
|
-
style={[styles.settingItem, styles.lastSettingItem]}
|
|
272
|
-
>
|
|
273
|
-
<View style={styles.settingInfo}>
|
|
274
|
-
<OxyIcon name="card" size={20} color="#34C759" style={styles.settingIcon} />
|
|
275
|
-
<View>
|
|
276
|
-
<Text style={styles.settingLabel}>Billing Management</Text>
|
|
277
|
-
<Text style={styles.settingDescription}>Payment methods and invoices</Text>
|
|
278
|
-
</View>
|
|
279
|
-
</View>
|
|
280
|
-
<OxyIcon name="chevron-forward" size={16} color="#ccc" />
|
|
281
|
-
</TouchableOpacity>
|
|
282
|
-
)}
|
|
283
|
-
</View>
|
|
216
|
+
<Section title="Account Settings" theme={theme}>
|
|
217
|
+
<GroupedSection
|
|
218
|
+
items={[
|
|
219
|
+
{
|
|
220
|
+
id: 'edit-profile',
|
|
221
|
+
icon: 'person-circle',
|
|
222
|
+
iconColor: '#007AFF',
|
|
223
|
+
title: 'Edit Profile',
|
|
224
|
+
subtitle: 'Update your personal information',
|
|
225
|
+
onPress: () => navigate?.('EditProfile', { activeTab: 'profile' }),
|
|
226
|
+
},
|
|
227
|
+
{
|
|
228
|
+
id: 'security-privacy',
|
|
229
|
+
icon: 'shield-checkmark',
|
|
230
|
+
iconColor: '#30D158',
|
|
231
|
+
title: 'Security & Privacy',
|
|
232
|
+
subtitle: 'Password, 2FA, and privacy settings',
|
|
233
|
+
onPress: () => navigate?.('EditProfile', { activeTab: 'password' }),
|
|
234
|
+
},
|
|
235
|
+
{
|
|
236
|
+
id: 'notifications',
|
|
237
|
+
icon: 'notifications',
|
|
238
|
+
iconColor: '#FF9500',
|
|
239
|
+
title: 'Notifications',
|
|
240
|
+
subtitle: 'Manage your notification preferences',
|
|
241
|
+
onPress: () => navigate?.('EditProfile', { activeTab: 'notifications' }),
|
|
242
|
+
},
|
|
243
|
+
{
|
|
244
|
+
id: 'premium-subscription',
|
|
245
|
+
icon: 'star',
|
|
246
|
+
iconColor: '#FFD700',
|
|
247
|
+
title: 'Oxy+ Subscriptions',
|
|
248
|
+
subtitle: user?.isPremium ? 'Manage your premium plan' : 'Upgrade to premium features',
|
|
249
|
+
onPress: () => navigate?.('PremiumSubscription'),
|
|
250
|
+
},
|
|
251
|
+
...(user?.isPremium ? [{
|
|
252
|
+
id: 'billing-management',
|
|
253
|
+
icon: 'card',
|
|
254
|
+
iconColor: '#34C759',
|
|
255
|
+
title: 'Billing Management',
|
|
256
|
+
subtitle: 'Payment methods and invoices',
|
|
257
|
+
onPress: () => toast.info('Billing management feature coming soon!'),
|
|
258
|
+
}] : []),
|
|
259
|
+
]}
|
|
260
|
+
theme={theme}
|
|
261
|
+
/>
|
|
262
|
+
</Section>
|
|
284
263
|
|
|
285
264
|
{/* Additional Accounts */}
|
|
286
265
|
{showMoreAccounts && (
|
|
287
|
-
<
|
|
288
|
-
<Text style={styles.sectionTitle}>Additional Accounts{additionalAccountsData.length > 0 ? ` (${additionalAccountsData.length})` : ''}</Text>
|
|
289
|
-
|
|
266
|
+
<Section title={`Additional Accounts${additionalAccountsData.length > 0 ? ` (${additionalAccountsData.length})` : ''}`} theme={theme}>
|
|
290
267
|
{loadingAdditionalAccounts ? (
|
|
291
|
-
<
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
268
|
+
<GroupedSection
|
|
269
|
+
items={[
|
|
270
|
+
{
|
|
271
|
+
id: 'loading-accounts',
|
|
272
|
+
icon: 'sync',
|
|
273
|
+
iconColor: '#007AFF',
|
|
274
|
+
title: 'Loading accounts...',
|
|
275
|
+
subtitle: 'Please wait while we load your additional accounts',
|
|
276
|
+
customContent: (
|
|
277
|
+
<View style={styles.loadingContainer}>
|
|
278
|
+
<ActivityIndicator size="small" color="#007AFF" />
|
|
279
|
+
<Text style={styles.loadingText}>Loading accounts...</Text>
|
|
280
|
+
</View>
|
|
281
|
+
),
|
|
282
|
+
},
|
|
283
|
+
]}
|
|
284
|
+
theme={theme}
|
|
285
|
+
/>
|
|
297
286
|
) : additionalAccountsData.length > 0 ? (
|
|
298
|
-
|
|
299
|
-
{additionalAccountsData.map((account, index) => (
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
{
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
<
|
|
319
|
-
{
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
<View style={styles.settingInfo}>
|
|
325
|
-
<View>
|
|
326
|
-
<Text style={styles.settingLabel}>
|
|
327
|
-
{typeof account.name === 'object'
|
|
328
|
-
? account.name?.full || account.name?.first || account.username
|
|
329
|
-
: account.name || account.username
|
|
330
|
-
}
|
|
331
|
-
</Text>
|
|
332
|
-
<Text style={styles.settingDescription}>{account.email || account.username}</Text>
|
|
287
|
+
<GroupedSection
|
|
288
|
+
items={additionalAccountsData.map((account, index) => ({
|
|
289
|
+
id: `account-${account.id}`,
|
|
290
|
+
icon: 'person',
|
|
291
|
+
iconColor: '#5856D6',
|
|
292
|
+
title: typeof account.name === 'object'
|
|
293
|
+
? account.name?.full || account.name?.first || account.username
|
|
294
|
+
: account.name || account.username,
|
|
295
|
+
subtitle: account.email || account.username,
|
|
296
|
+
onPress: () => {
|
|
297
|
+
toast.info(`Switch to ${account.username}?`);
|
|
298
|
+
// TODO: Implement account switching logic
|
|
299
|
+
// switchSession(account.sessionId);
|
|
300
|
+
},
|
|
301
|
+
customContent: (
|
|
302
|
+
<>
|
|
303
|
+
<View style={styles.userIcon}>
|
|
304
|
+
{account.avatar?.url ? (
|
|
305
|
+
<Image source={{ uri: account.avatar.url }} style={styles.accountAvatarImage} />
|
|
306
|
+
) : (
|
|
307
|
+
<View style={styles.accountAvatarFallback}>
|
|
308
|
+
<Text style={styles.accountAvatarText}>
|
|
309
|
+
{account.username?.charAt(0).toUpperCase() || '?'}
|
|
310
|
+
</Text>
|
|
311
|
+
</View>
|
|
312
|
+
)}
|
|
333
313
|
</View>
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
))}
|
|
338
|
-
|
|
314
|
+
<OxyIcon name="chevron-forward" size={16} color="#ccc" />
|
|
315
|
+
</>
|
|
316
|
+
),
|
|
317
|
+
}))}
|
|
318
|
+
theme={theme}
|
|
319
|
+
/>
|
|
339
320
|
) : (
|
|
340
|
-
<
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
321
|
+
<GroupedSection
|
|
322
|
+
items={[
|
|
323
|
+
{
|
|
324
|
+
id: 'no-accounts',
|
|
325
|
+
icon: 'person-outline',
|
|
326
|
+
iconColor: '#ccc',
|
|
327
|
+
title: 'No other accounts',
|
|
328
|
+
subtitle: 'Add another account to switch between them',
|
|
329
|
+
},
|
|
330
|
+
]}
|
|
331
|
+
theme={theme}
|
|
332
|
+
/>
|
|
349
333
|
)}
|
|
350
|
-
</
|
|
334
|
+
</Section>
|
|
351
335
|
)}
|
|
352
336
|
|
|
353
337
|
{/* Account Management */}
|
|
354
338
|
{showMoreAccounts && (
|
|
355
|
-
<
|
|
356
|
-
<
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
<View>
|
|
379
|
-
<Text style={styles.settingLabel}>Sign out of all accounts</Text>
|
|
380
|
-
<Text style={styles.settingDescription}>Remove all accounts from this device</Text>
|
|
381
|
-
</View>
|
|
382
|
-
</View>
|
|
383
|
-
<OxyIcon name="chevron-forward" size={16} color="#ccc" />
|
|
384
|
-
</TouchableOpacity>
|
|
385
|
-
</View>
|
|
339
|
+
<Section title="Account Management" theme={theme}>
|
|
340
|
+
<GroupedSection
|
|
341
|
+
items={[
|
|
342
|
+
{
|
|
343
|
+
id: 'add-account',
|
|
344
|
+
icon: 'add',
|
|
345
|
+
iconColor: '#007AFF',
|
|
346
|
+
title: 'Add another account',
|
|
347
|
+
subtitle: 'Sign in with a different account',
|
|
348
|
+
onPress: handleAddAccount,
|
|
349
|
+
},
|
|
350
|
+
{
|
|
351
|
+
id: 'sign-out-all',
|
|
352
|
+
icon: 'log-out',
|
|
353
|
+
iconColor: '#FF3B30',
|
|
354
|
+
title: 'Sign out of all accounts',
|
|
355
|
+
subtitle: 'Remove all accounts from this device',
|
|
356
|
+
onPress: handleSignOutAll,
|
|
357
|
+
},
|
|
358
|
+
]}
|
|
359
|
+
theme={theme}
|
|
360
|
+
/>
|
|
361
|
+
</Section>
|
|
386
362
|
)}
|
|
387
363
|
|
|
388
364
|
{/* Quick Actions */}
|
|
389
|
-
<
|
|
390
|
-
<
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
</View>
|
|
427
|
-
</View>
|
|
428
|
-
<OxyIcon name="chevron-forward" size={16} color="#ccc" />
|
|
429
|
-
</TouchableOpacity>
|
|
430
|
-
|
|
431
|
-
<TouchableOpacity
|
|
432
|
-
style={[styles.settingItem, styles.lastSettingItem]}
|
|
433
|
-
onPress={() => toast.info('Delete account feature coming soon!')}
|
|
434
|
-
>
|
|
435
|
-
<View style={styles.settingInfo}>
|
|
436
|
-
<OxyIcon name="trash" size={20} color="#FF3B30" style={styles.settingIcon} />
|
|
437
|
-
<View>
|
|
438
|
-
<Text style={styles.settingLabel}>Delete Account</Text>
|
|
439
|
-
<Text style={styles.settingDescription}>Permanently delete your account</Text>
|
|
440
|
-
</View>
|
|
441
|
-
</View>
|
|
442
|
-
<OxyIcon name="chevron-forward" size={16} color="#ccc" />
|
|
443
|
-
</TouchableOpacity>
|
|
444
|
-
</View>
|
|
365
|
+
<Section title="Quick Actions" theme={theme}>
|
|
366
|
+
<GroupedSection
|
|
367
|
+
items={[
|
|
368
|
+
{
|
|
369
|
+
id: 'account-switcher',
|
|
370
|
+
icon: 'people',
|
|
371
|
+
iconColor: '#5856D6',
|
|
372
|
+
title: `${showMoreAccounts ? 'Hide' : 'Show'} Account Switcher`,
|
|
373
|
+
subtitle: showMoreAccounts
|
|
374
|
+
? 'Hide account switcher'
|
|
375
|
+
: additionalAccountsData.length > 0
|
|
376
|
+
? `Switch between ${additionalAccountsData.length + 1} accounts`
|
|
377
|
+
: loadingAdditionalAccounts
|
|
378
|
+
? 'Loading additional accounts...'
|
|
379
|
+
: 'Manage multiple accounts',
|
|
380
|
+
onPress: () => setShowMoreAccounts(!showMoreAccounts),
|
|
381
|
+
},
|
|
382
|
+
{
|
|
383
|
+
id: 'download-data',
|
|
384
|
+
icon: 'download',
|
|
385
|
+
iconColor: '#34C759',
|
|
386
|
+
title: 'Download My Data',
|
|
387
|
+
subtitle: 'Export your account information',
|
|
388
|
+
onPress: () => toast.info('Download account data feature coming soon!'),
|
|
389
|
+
},
|
|
390
|
+
{
|
|
391
|
+
id: 'delete-account',
|
|
392
|
+
icon: 'trash',
|
|
393
|
+
iconColor: '#FF3B30',
|
|
394
|
+
title: 'Delete Account',
|
|
395
|
+
subtitle: 'Permanently delete your account',
|
|
396
|
+
onPress: () => toast.info('Delete account feature coming soon!'),
|
|
397
|
+
},
|
|
398
|
+
]}
|
|
399
|
+
theme={theme}
|
|
400
|
+
/>
|
|
401
|
+
</Section>
|
|
445
402
|
|
|
446
403
|
{/* Support & Settings */}
|
|
447
|
-
<
|
|
448
|
-
<
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
<Text style={styles.settingDescription}>Manage third-party app access</Text>
|
|
487
|
-
</View>
|
|
488
|
-
</View>
|
|
489
|
-
<OxyIcon name="chevron-forward" size={16} color="#ccc" />
|
|
490
|
-
</TouchableOpacity>
|
|
491
|
-
|
|
492
|
-
<TouchableOpacity
|
|
493
|
-
style={styles.settingItem}
|
|
494
|
-
onPress={() => toast.info('Privacy Policy feature coming soon!')}
|
|
495
|
-
>
|
|
496
|
-
<View style={styles.settingInfo}>
|
|
497
|
-
<OxyIcon name="document-lock" size={20} color="#FF9F0A" style={styles.settingIcon} />
|
|
498
|
-
<View>
|
|
499
|
-
<Text style={styles.settingLabel}>Privacy Policy</Text>
|
|
500
|
-
<Text style={styles.settingDescription}>Learn about data protection</Text>
|
|
501
|
-
</View>
|
|
502
|
-
</View>
|
|
503
|
-
<OxyIcon name="chevron-forward" size={16} color="#ccc" />
|
|
504
|
-
</TouchableOpacity>
|
|
505
|
-
|
|
506
|
-
<TouchableOpacity
|
|
507
|
-
style={[styles.settingItem, styles.lastSettingItem]}
|
|
508
|
-
onPress={() => toast.info('Terms of Service feature coming soon!')}
|
|
509
|
-
>
|
|
510
|
-
<View style={styles.settingInfo}>
|
|
511
|
-
<OxyIcon name="document-text" size={20} color="#5856D6" style={styles.settingIcon} />
|
|
512
|
-
<View>
|
|
513
|
-
<Text style={styles.settingLabel}>Terms of Service</Text>
|
|
514
|
-
<Text style={styles.settingDescription}>Read our terms and conditions</Text>
|
|
515
|
-
</View>
|
|
516
|
-
</View>
|
|
517
|
-
<OxyIcon name="chevron-forward" size={16} color="#ccc" />
|
|
518
|
-
</TouchableOpacity>
|
|
519
|
-
</View>
|
|
404
|
+
<Section title="Support & Settings" theme={theme}>
|
|
405
|
+
<GroupedSection
|
|
406
|
+
items={[
|
|
407
|
+
{
|
|
408
|
+
id: 'account-preferences',
|
|
409
|
+
icon: 'settings',
|
|
410
|
+
iconColor: '#8E8E93',
|
|
411
|
+
title: 'Account Preferences',
|
|
412
|
+
subtitle: 'Customize your account experience',
|
|
413
|
+
onPress: () => toast.info('Account preferences coming soon!'),
|
|
414
|
+
},
|
|
415
|
+
{
|
|
416
|
+
id: 'help-support',
|
|
417
|
+
icon: 'help-circle',
|
|
418
|
+
iconColor: '#007AFF',
|
|
419
|
+
title: 'Help & Support',
|
|
420
|
+
subtitle: 'Get help with your account',
|
|
421
|
+
onPress: () => toast.info('Help & support feature coming soon!'),
|
|
422
|
+
},
|
|
423
|
+
{
|
|
424
|
+
id: 'connected-apps',
|
|
425
|
+
icon: 'link',
|
|
426
|
+
iconColor: '#32D74B',
|
|
427
|
+
title: 'Connected Apps',
|
|
428
|
+
subtitle: 'Manage third-party app access',
|
|
429
|
+
onPress: () => toast.info('Connected apps feature coming soon!'),
|
|
430
|
+
},
|
|
431
|
+
{
|
|
432
|
+
id: 'about',
|
|
433
|
+
icon: 'information-circle',
|
|
434
|
+
iconColor: '#8E8E93',
|
|
435
|
+
title: 'About',
|
|
436
|
+
subtitle: 'App version and information',
|
|
437
|
+
onPress: () => navigate?.('AppInfo'),
|
|
438
|
+
},
|
|
439
|
+
]}
|
|
440
|
+
theme={theme}
|
|
441
|
+
/>
|
|
442
|
+
</Section>
|
|
520
443
|
|
|
521
444
|
{/* Sign Out */}
|
|
522
|
-
<
|
|
523
|
-
<
|
|
524
|
-
|
|
445
|
+
<Section title="Account Actions" theme={theme}>
|
|
446
|
+
<GroupedItem
|
|
447
|
+
icon="log-out"
|
|
448
|
+
iconColor="#FF3B30"
|
|
449
|
+
title="Sign Out"
|
|
450
|
+
subtitle="Sign out of your current account"
|
|
451
|
+
theme={theme}
|
|
525
452
|
onPress={confirmLogout}
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
<Text style={styles.settingDescription}>Sign out of your account</Text>
|
|
532
|
-
</View>
|
|
533
|
-
</View>
|
|
534
|
-
</TouchableOpacity>
|
|
535
|
-
</View>
|
|
453
|
+
isFirst={true}
|
|
454
|
+
isLast={true}
|
|
455
|
+
showChevron={false}
|
|
456
|
+
/>
|
|
457
|
+
</Section>
|
|
536
458
|
</ScrollView>
|
|
537
459
|
</View>
|
|
538
460
|
);
|
|
@@ -543,78 +465,11 @@ const styles = StyleSheet.create({
|
|
|
543
465
|
flex: 1,
|
|
544
466
|
backgroundColor: '#f2f2f2',
|
|
545
467
|
},
|
|
546
|
-
header: {
|
|
547
|
-
paddingHorizontal: 20,
|
|
548
|
-
paddingTop: 60,
|
|
549
|
-
paddingBottom: 16,
|
|
550
|
-
backgroundColor: '#fff',
|
|
551
|
-
borderBottomWidth: 1,
|
|
552
|
-
borderBottomColor: '#e0e0e0',
|
|
553
|
-
flexDirection: 'row',
|
|
554
|
-
justifyContent: 'space-between',
|
|
555
|
-
alignItems: 'center',
|
|
556
|
-
},
|
|
557
|
-
headerTitle: {
|
|
558
|
-
fontSize: 24,
|
|
559
|
-
fontWeight: 'bold',
|
|
560
|
-
color: '#000',
|
|
561
|
-
},
|
|
562
|
-
closeButton: {
|
|
563
|
-
padding: 8,
|
|
564
|
-
},
|
|
565
|
-
closeButtonText: {
|
|
566
|
-
fontSize: 24,
|
|
567
|
-
color: '#000',
|
|
568
|
-
fontWeight: '300',
|
|
569
|
-
},
|
|
570
468
|
content: {
|
|
571
469
|
flex: 1,
|
|
572
470
|
padding: 16,
|
|
573
471
|
},
|
|
574
|
-
|
|
575
|
-
marginBottom: 24,
|
|
576
|
-
},
|
|
577
|
-
sectionTitle: {
|
|
578
|
-
fontSize: 16,
|
|
579
|
-
fontWeight: '600',
|
|
580
|
-
color: '#333',
|
|
581
|
-
marginBottom: 12,
|
|
582
|
-
},
|
|
583
|
-
settingItem: {
|
|
584
|
-
backgroundColor: '#fff',
|
|
585
|
-
padding: 16,
|
|
586
|
-
flexDirection: 'row',
|
|
587
|
-
alignItems: 'center',
|
|
588
|
-
justifyContent: 'space-between',
|
|
589
|
-
marginBottom: 2,
|
|
590
|
-
},
|
|
591
|
-
firstSettingItem: {
|
|
592
|
-
borderTopLeftRadius: 24,
|
|
593
|
-
borderTopRightRadius: 24,
|
|
594
|
-
},
|
|
595
|
-
lastSettingItem: {
|
|
596
|
-
borderBottomLeftRadius: 24,
|
|
597
|
-
borderBottomRightRadius: 24,
|
|
598
|
-
marginBottom: 8,
|
|
599
|
-
},
|
|
600
|
-
settingInfo: {
|
|
601
|
-
flexDirection: 'row',
|
|
602
|
-
alignItems: 'center',
|
|
603
|
-
flex: 1,
|
|
604
|
-
},
|
|
605
|
-
settingIcon: {
|
|
606
|
-
marginRight: 12,
|
|
607
|
-
},
|
|
608
|
-
settingLabel: {
|
|
609
|
-
fontSize: 16,
|
|
610
|
-
fontWeight: '500',
|
|
611
|
-
color: '#333',
|
|
612
|
-
marginBottom: 2,
|
|
613
|
-
},
|
|
614
|
-
settingDescription: {
|
|
615
|
-
fontSize: 14,
|
|
616
|
-
color: '#666',
|
|
617
|
-
},
|
|
472
|
+
|
|
618
473
|
userIcon: {
|
|
619
474
|
marginRight: 12,
|
|
620
475
|
},
|
|
@@ -647,10 +502,6 @@ const styles = StyleSheet.create({
|
|
|
647
502
|
fontSize: 18,
|
|
648
503
|
fontWeight: 'bold',
|
|
649
504
|
},
|
|
650
|
-
signOutButton: {
|
|
651
|
-
borderWidth: 1,
|
|
652
|
-
borderColor: '#ff4757',
|
|
653
|
-
},
|
|
654
505
|
message: {
|
|
655
506
|
fontSize: 16,
|
|
656
507
|
textAlign: 'center',
|