@oxyhq/services 5.3.11 → 5.4.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 +21 -0
- package/lib/commonjs/assets/assets/icons/OxyServices.tsx +67 -0
- package/lib/commonjs/assets/assets/icons/logo_OxyServices.svg +1 -0
- package/lib/commonjs/assets/icons/OxyServices.js +53 -0
- package/lib/commonjs/assets/icons/OxyServices.js.map +1 -0
- package/lib/commonjs/assets/icons/logo_OxyServices.svg +1 -0
- package/lib/commonjs/core/index.js +119 -23
- package/lib/commonjs/core/index.js.map +1 -1
- package/lib/commonjs/index.js +2 -0
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/lib/sonner.js +15 -11
- package/lib/commonjs/lib/sonner.js.map +1 -1
- package/lib/commonjs/node/index.js +2 -0
- package/lib/commonjs/node/index.js.map +1 -1
- package/lib/commonjs/ui/components/GroupedItem.js +109 -0
- package/lib/commonjs/ui/components/GroupedItem.js.map +1 -0
- package/lib/commonjs/ui/components/GroupedSection.js +33 -0
- package/lib/commonjs/ui/components/GroupedSection.js.map +1 -0
- package/lib/commonjs/ui/components/OxyProvider.js +95 -112
- package/lib/commonjs/ui/components/OxyProvider.js.map +1 -1
- package/lib/commonjs/ui/components/ProfileCard.js +124 -0
- package/lib/commonjs/ui/components/ProfileCard.js.map +1 -0
- package/lib/commonjs/ui/components/QuickActions.js +87 -0
- package/lib/commonjs/ui/components/QuickActions.js.map +1 -0
- package/lib/commonjs/ui/components/Section.js +36 -0
- package/lib/commonjs/ui/components/Section.js.map +1 -0
- package/lib/commonjs/ui/components/SectionTitle.js +35 -0
- package/lib/commonjs/ui/components/SectionTitle.js.map +1 -0
- package/lib/commonjs/ui/components/bottomSheet/index.js +6 -6
- package/lib/commonjs/ui/components/index.js +97 -0
- package/lib/commonjs/ui/components/index.js.map +1 -0
- package/lib/commonjs/ui/navigation/OxyRouter.js +20 -3
- package/lib/commonjs/ui/navigation/OxyRouter.js.map +1 -1
- package/lib/commonjs/ui/screens/AccountCenterScreen.js +190 -207
- package/lib/commonjs/ui/screens/AccountCenterScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/AccountManagementDemo.js +299 -0
- package/lib/commonjs/ui/screens/AccountManagementDemo.js.map +1 -0
- package/lib/commonjs/ui/screens/AccountOverviewScreen.js +669 -401
- package/lib/commonjs/ui/screens/AccountOverviewScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/AccountSettingsScreen.js +695 -498
- package/lib/commonjs/ui/screens/AccountSettingsScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/AccountSwitcherScreen.js +451 -488
- package/lib/commonjs/ui/screens/AccountSwitcherScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/AppInfoScreen.js +498 -185
- package/lib/commonjs/ui/screens/AppInfoScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/BillingManagementScreen.js +636 -0
- package/lib/commonjs/ui/screens/BillingManagementScreen.js.map +1 -0
- package/lib/commonjs/ui/screens/FileManagementScreen.js +2497 -0
- package/lib/commonjs/ui/screens/FileManagementScreen.js.map +1 -0
- package/lib/commonjs/ui/screens/PremiumSubscriptionScreen.js +1620 -0
- package/lib/commonjs/ui/screens/PremiumSubscriptionScreen.js.map +1 -0
- package/lib/commonjs/ui/screens/ProfileScreen.js +117 -13
- package/lib/commonjs/ui/screens/ProfileScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/SessionManagementScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/SignInScreen.js +1 -1
- package/lib/commonjs/ui/screens/SignUpScreen.js +1 -1
- package/lib/commonjs/utils/polyfills.js +42 -0
- package/lib/commonjs/utils/polyfills.js.map +1 -0
- package/lib/module/assets/assets/icons/OxyServices.tsx +67 -0
- package/lib/module/assets/assets/icons/logo_OxyServices.svg +1 -0
- package/lib/module/assets/icons/OxyServices.js +46 -0
- package/lib/module/assets/icons/OxyServices.js.map +1 -0
- package/lib/module/assets/icons/logo_OxyServices.svg +1 -0
- package/lib/module/core/index.js +119 -23
- package/lib/module/core/index.js.map +1 -1
- package/lib/module/index.js +3 -0
- package/lib/module/index.js.map +1 -1
- package/lib/module/lib/sonner.js +13 -1
- package/lib/module/lib/sonner.js.map +1 -1
- package/lib/module/node/index.js +3 -0
- package/lib/module/node/index.js.map +1 -1
- package/lib/module/ui/components/GroupedItem.js +104 -0
- package/lib/module/ui/components/GroupedItem.js.map +1 -0
- package/lib/module/ui/components/GroupedSection.js +28 -0
- package/lib/module/ui/components/GroupedSection.js.map +1 -0
- package/lib/module/ui/components/OxyProvider.js +97 -114
- package/lib/module/ui/components/OxyProvider.js.map +1 -1
- package/lib/module/ui/components/ProfileCard.js +119 -0
- package/lib/module/ui/components/ProfileCard.js.map +1 -0
- package/lib/module/ui/components/QuickActions.js +82 -0
- package/lib/module/ui/components/QuickActions.js.map +1 -0
- package/lib/module/ui/components/Section.js +31 -0
- package/lib/module/ui/components/Section.js.map +1 -0
- package/lib/module/ui/components/SectionTitle.js +30 -0
- package/lib/module/ui/components/SectionTitle.js.map +1 -0
- package/lib/module/ui/components/bottomSheet/index.js +2 -5
- package/lib/module/ui/components/bottomSheet/index.js.map +1 -1
- package/lib/module/ui/components/index.js +18 -0
- package/lib/module/ui/components/index.js.map +1 -0
- package/lib/module/ui/navigation/OxyRouter.js +20 -3
- package/lib/module/ui/navigation/OxyRouter.js.map +1 -1
- package/lib/module/ui/screens/AccountCenterScreen.js +191 -208
- package/lib/module/ui/screens/AccountCenterScreen.js.map +1 -1
- package/lib/module/ui/screens/AccountManagementDemo.js +296 -0
- package/lib/module/ui/screens/AccountManagementDemo.js.map +1 -0
- package/lib/module/ui/screens/AccountOverviewScreen.js +671 -403
- package/lib/module/ui/screens/AccountOverviewScreen.js.map +1 -1
- package/lib/module/ui/screens/AccountSettingsScreen.js +698 -501
- package/lib/module/ui/screens/AccountSettingsScreen.js.map +1 -1
- package/lib/module/ui/screens/AccountSwitcherScreen.js +450 -488
- package/lib/module/ui/screens/AccountSwitcherScreen.js.map +1 -1
- package/lib/module/ui/screens/AppInfoScreen.js +498 -186
- package/lib/module/ui/screens/AppInfoScreen.js.map +1 -1
- package/lib/module/ui/screens/BillingManagementScreen.js +631 -0
- package/lib/module/ui/screens/BillingManagementScreen.js.map +1 -0
- package/lib/module/ui/screens/FileManagementScreen.js +2492 -0
- package/lib/module/ui/screens/FileManagementScreen.js.map +1 -0
- package/lib/module/ui/screens/PremiumSubscriptionScreen.js +1615 -0
- package/lib/module/ui/screens/PremiumSubscriptionScreen.js.map +1 -0
- package/lib/module/ui/screens/ProfileScreen.js +118 -14
- package/lib/module/ui/screens/ProfileScreen.js.map +1 -1
- package/lib/module/ui/screens/SessionManagementScreen.js.map +1 -1
- package/lib/module/ui/screens/SignInScreen.js +1 -1
- package/lib/module/ui/screens/SignInScreen.js.map +1 -1
- package/lib/module/ui/screens/SignUpScreen.js +1 -1
- package/lib/module/ui/screens/SignUpScreen.js.map +1 -1
- package/lib/module/utils/polyfills.js +36 -0
- package/lib/module/utils/polyfills.js.map +1 -0
- package/lib/typescript/assets/icons/OxyServices.d.ts +29 -0
- package/lib/typescript/assets/icons/OxyServices.d.ts.map +1 -0
- package/lib/typescript/core/index.d.ts +26 -1
- package/lib/typescript/core/index.d.ts.map +1 -1
- package/lib/typescript/index.d.ts +1 -0
- package/lib/typescript/index.d.ts.map +1 -1
- package/lib/typescript/lib/sonner.d.ts +5 -1
- package/lib/typescript/lib/sonner.d.ts.map +1 -1
- package/lib/typescript/models/interfaces.d.ts +1 -2
- package/lib/typescript/models/interfaces.d.ts.map +1 -1
- package/lib/typescript/node/index.d.ts +1 -0
- package/lib/typescript/node/index.d.ts.map +1 -1
- package/lib/typescript/ui/components/GroupedItem.d.ts +17 -0
- package/lib/typescript/ui/components/GroupedItem.d.ts.map +1 -0
- package/lib/typescript/ui/components/GroupedSection.d.ts +19 -0
- package/lib/typescript/ui/components/GroupedSection.d.ts.map +1 -0
- package/lib/typescript/ui/components/OxyProvider.d.ts.map +1 -1
- package/lib/typescript/ui/components/ProfileCard.d.ts +20 -0
- package/lib/typescript/ui/components/ProfileCard.d.ts.map +1 -0
- package/lib/typescript/ui/components/QuickActions.d.ts +15 -0
- package/lib/typescript/ui/components/QuickActions.d.ts.map +1 -0
- package/lib/typescript/ui/components/Section.d.ts +11 -0
- package/lib/typescript/ui/components/Section.d.ts.map +1 -0
- package/lib/typescript/ui/components/SectionTitle.d.ts +9 -0
- package/lib/typescript/ui/components/SectionTitle.d.ts.map +1 -0
- package/lib/typescript/ui/components/bottomSheet/index.d.ts +3 -2
- package/lib/typescript/ui/components/bottomSheet/index.d.ts.map +1 -1
- package/lib/typescript/ui/components/index.d.ts +13 -0
- package/lib/typescript/ui/components/index.d.ts.map +1 -0
- package/lib/typescript/ui/navigation/OxyRouter.d.ts.map +1 -1
- package/lib/typescript/ui/navigation/types.d.ts +8 -0
- package/lib/typescript/ui/navigation/types.d.ts.map +1 -1
- package/lib/typescript/ui/screens/AccountCenterScreen.d.ts.map +1 -1
- package/lib/typescript/ui/screens/AccountManagementDemo.d.ts +8 -0
- package/lib/typescript/ui/screens/AccountManagementDemo.d.ts.map +1 -0
- package/lib/typescript/ui/screens/AccountOverviewScreen.d.ts.map +1 -1
- package/lib/typescript/ui/screens/AccountSettingsScreen.d.ts +1 -4
- 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/BillingManagementScreen.d.ts +5 -0
- package/lib/typescript/ui/screens/BillingManagementScreen.d.ts.map +1 -0
- package/lib/typescript/ui/screens/FileManagementScreen.d.ts +8 -0
- package/lib/typescript/ui/screens/FileManagementScreen.d.ts.map +1 -0
- package/lib/typescript/ui/screens/PremiumSubscriptionScreen.d.ts +5 -0
- package/lib/typescript/ui/screens/PremiumSubscriptionScreen.d.ts.map +1 -0
- package/lib/typescript/ui/screens/ProfileScreen.d.ts.map +1 -1
- package/lib/typescript/ui/screens/SessionManagementScreen.d.ts.map +1 -1
- package/lib/typescript/utils/polyfills.d.ts +6 -0
- package/lib/typescript/utils/polyfills.d.ts.map +1 -0
- package/package.json +11 -3
- package/src/__tests__/polyfills.test.ts +30 -0
- package/src/__tests__/setup.ts +43 -0
- package/src/__tests__/ui/screens/AccountSettingsScreen.test.tsx +8 -8
- package/src/assets/icons/OxyServices.tsx +67 -0
- package/src/assets/icons/logo_OxyServices.svg +1 -0
- package/src/core/index.ts +127 -19
- package/src/index.ts +3 -0
- package/src/lib/sonner.ts +10 -1
- package/src/models/interfaces.ts +1 -2
- package/src/node/index.ts +3 -0
- package/src/ui/components/GroupedItem.tsx +118 -0
- package/src/ui/components/GroupedSection.tsx +45 -0
- package/src/ui/components/OxyProvider.tsx +95 -120
- package/src/ui/components/ProfileCard.tsx +129 -0
- package/src/ui/components/QuickActions.tsx +90 -0
- package/src/ui/components/Section.tsx +37 -0
- package/src/ui/components/SectionTitle.tsx +31 -0
- package/src/ui/components/bottomSheet/index.tsx +13 -11
- package/src/ui/components/index.ts +15 -0
- package/src/ui/navigation/OxyRouter.tsx +20 -3
- package/src/ui/navigation/types.ts +10 -1
- package/src/ui/screens/AccountCenterScreen.tsx +188 -159
- package/src/ui/screens/AccountManagementDemo.tsx +297 -0
- package/src/ui/screens/AccountOverviewScreen.tsx +474 -310
- package/src/ui/screens/AccountSettingsScreen.tsx +648 -463
- package/src/ui/screens/AccountSwitcherScreen.tsx +385 -449
- package/src/ui/screens/AppInfoScreen.tsx +571 -140
- package/src/ui/screens/BillingManagementScreen.tsx +589 -0
- package/src/ui/screens/FileManagementScreen.tsx +2513 -0
- package/src/ui/screens/PremiumSubscriptionScreen.tsx +1628 -0
- package/src/ui/screens/ProfileScreen.tsx +101 -7
- package/src/ui/screens/SessionManagementScreen.tsx +1 -0
- package/src/ui/screens/SignInScreen.tsx +1 -1
- package/src/ui/screens/SignUpScreen.tsx +1 -1
- package/src/utils/polyfills.ts +34 -0
- package/lib/commonjs/lib/sonner.web.js +0 -17
- package/lib/commonjs/lib/sonner.web.js.map +0 -1
- package/lib/module/lib/sonner.web.js +0 -4
- package/lib/module/lib/sonner.web.js.map +0 -1
- package/lib/typescript/__tests__/ui/screens/AccountSettingsScreen.test.d.ts +0 -2
- package/lib/typescript/__tests__/ui/screens/AccountSettingsScreen.test.d.ts.map +0 -1
- package/lib/typescript/lib/sonner.web.d.ts +0 -2
- package/lib/typescript/lib/sonner.web.d.ts.map +0 -1
- package/src/lib/sonner.web.ts +0 -1
|
@@ -15,15 +15,20 @@ import { BaseScreenProps } from '../navigation/types';
|
|
|
15
15
|
import { useOxy } from '../context/OxyContext';
|
|
16
16
|
import OxyLogo from '../components/OxyLogo';
|
|
17
17
|
import Avatar from '../components/Avatar';
|
|
18
|
+
import OxyIcon from '../components/icon/OxyIcon';
|
|
18
19
|
import { fontFamilies } from '../styles/fonts';
|
|
19
20
|
import { toast } from '../../lib/sonner';
|
|
21
|
+
import { Ionicons } from '@expo/vector-icons';
|
|
20
22
|
|
|
21
23
|
const AccountOverviewScreen: React.FC<BaseScreenProps> = ({
|
|
22
24
|
onClose,
|
|
23
25
|
theme,
|
|
26
|
+
navigate,
|
|
24
27
|
}) => {
|
|
25
|
-
const { user, logout, isLoading } = useOxy();
|
|
28
|
+
const { user, logout, isLoading, sessions, activeSessionId, oxyServices } = useOxy();
|
|
26
29
|
const [showMoreAccounts, setShowMoreAccounts] = useState(false);
|
|
30
|
+
const [additionalAccountsData, setAdditionalAccountsData] = useState<any[]>([]);
|
|
31
|
+
const [loadingAdditionalAccounts, setLoadingAdditionalAccounts] = useState(false);
|
|
27
32
|
|
|
28
33
|
const isDarkTheme = theme === 'dark';
|
|
29
34
|
const textColor = isDarkTheme ? '#FFFFFF' : '#000000';
|
|
@@ -34,17 +39,58 @@ const AccountOverviewScreen: React.FC<BaseScreenProps> = ({
|
|
|
34
39
|
const dangerColor = '#D32F2F';
|
|
35
40
|
const iconColor = isDarkTheme ? '#BBBBBB' : '#666666';
|
|
36
41
|
|
|
37
|
-
//
|
|
38
|
-
const additionalAccounts =
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
42
|
+
// Get additional accounts from sessions (excluding current user)
|
|
43
|
+
const additionalAccounts = sessions.filter(session =>
|
|
44
|
+
session.sessionId !== activeSessionId && session.userId !== user?.id
|
|
45
|
+
);
|
|
46
|
+
|
|
47
|
+
// Load user profiles for additional accounts
|
|
48
|
+
React.useEffect(() => {
|
|
49
|
+
const loadAdditionalAccountsData = async () => {
|
|
50
|
+
if (!oxyServices || additionalAccounts.length === 0) {
|
|
51
|
+
setAdditionalAccountsData([]);
|
|
52
|
+
return;
|
|
45
53
|
}
|
|
46
|
-
|
|
47
|
-
|
|
54
|
+
|
|
55
|
+
setLoadingAdditionalAccounts(true);
|
|
56
|
+
try {
|
|
57
|
+
const accountsData = await Promise.all(
|
|
58
|
+
additionalAccounts.map(async (session) => {
|
|
59
|
+
try {
|
|
60
|
+
const userProfile = await oxyServices.getUserBySession(session.sessionId);
|
|
61
|
+
return {
|
|
62
|
+
id: session.sessionId,
|
|
63
|
+
sessionId: session.sessionId,
|
|
64
|
+
username: userProfile.username,
|
|
65
|
+
email: userProfile.email,
|
|
66
|
+
name: userProfile.name,
|
|
67
|
+
avatar: userProfile.avatar,
|
|
68
|
+
userProfile
|
|
69
|
+
};
|
|
70
|
+
} catch (error) {
|
|
71
|
+
console.error(`Failed to load profile for session ${session.sessionId}:`, error);
|
|
72
|
+
return {
|
|
73
|
+
id: session.sessionId,
|
|
74
|
+
sessionId: session.sessionId,
|
|
75
|
+
username: session.username || 'Unknown User',
|
|
76
|
+
email: 'No email available',
|
|
77
|
+
avatar: null,
|
|
78
|
+
userProfile: null
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
})
|
|
82
|
+
);
|
|
83
|
+
setAdditionalAccountsData(accountsData);
|
|
84
|
+
} catch (error) {
|
|
85
|
+
console.error('Failed to load additional accounts:', error);
|
|
86
|
+
setAdditionalAccountsData([]);
|
|
87
|
+
} finally {
|
|
88
|
+
setLoadingAdditionalAccounts(false);
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
loadAdditionalAccountsData();
|
|
93
|
+
}, [sessions, activeSessionId, user?.id, oxyServices]);
|
|
48
94
|
|
|
49
95
|
// Feature settings (with mock values)
|
|
50
96
|
const features = {
|
|
@@ -106,28 +152,6 @@ const AccountOverviewScreen: React.FC<BaseScreenProps> = ({
|
|
|
106
152
|
);
|
|
107
153
|
};
|
|
108
154
|
|
|
109
|
-
const renderFeatureItem = (
|
|
110
|
-
icon: React.ReactNode,
|
|
111
|
-
title: string,
|
|
112
|
-
value: string | null | undefined,
|
|
113
|
-
onPress: () => void
|
|
114
|
-
) => (
|
|
115
|
-
<TouchableOpacity
|
|
116
|
-
style={[styles.featureItem, { borderColor }]}
|
|
117
|
-
onPress={onPress}
|
|
118
|
-
>
|
|
119
|
-
<View style={styles.featureItemLeft}>
|
|
120
|
-
<View style={styles.iconContainer}>
|
|
121
|
-
{icon}
|
|
122
|
-
</View>
|
|
123
|
-
<Text style={[styles.featureItemTitle, { color: textColor }]}>{title}</Text>
|
|
124
|
-
</View>
|
|
125
|
-
{value !== undefined && (
|
|
126
|
-
<Text style={[styles.featureItemValue, { color: iconColor }]}>{value}</Text>
|
|
127
|
-
)}
|
|
128
|
-
</TouchableOpacity>
|
|
129
|
-
);
|
|
130
|
-
|
|
131
155
|
if (!user) {
|
|
132
156
|
return (
|
|
133
157
|
<View style={[styles.container, { backgroundColor }]}>
|
|
@@ -145,191 +169,375 @@ const AccountOverviewScreen: React.FC<BaseScreenProps> = ({
|
|
|
145
169
|
}
|
|
146
170
|
|
|
147
171
|
return (
|
|
148
|
-
<View style={[styles.container, { backgroundColor }]}>
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
<Text style={{ fontSize: 24, color: textColor }}>×</Text>
|
|
172
|
+
<View style={[styles.container, { backgroundColor: '#f2f2f2' }]}>
|
|
173
|
+
{/* Header */}
|
|
174
|
+
<View style={styles.header}>
|
|
175
|
+
<Text style={styles.headerTitle}>Account</Text>
|
|
176
|
+
{onClose && (
|
|
177
|
+
<TouchableOpacity style={styles.closeButton} onPress={onClose}>
|
|
178
|
+
<Text style={styles.closeButtonText}>×</Text>
|
|
156
179
|
</TouchableOpacity>
|
|
157
|
-
|
|
180
|
+
)}
|
|
181
|
+
</View>
|
|
158
182
|
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
183
|
+
<ScrollView style={styles.content}>
|
|
184
|
+
{/* User Profile Section */}
|
|
185
|
+
<View style={styles.section}>
|
|
186
|
+
<Text style={styles.sectionTitle}>Profile</Text>
|
|
187
|
+
|
|
188
|
+
<View style={[styles.settingItem, styles.firstSettingItem, styles.lastSettingItem]}>
|
|
189
|
+
<View style={styles.userIcon}>
|
|
190
|
+
<Avatar
|
|
191
|
+
uri={user?.avatar?.url}
|
|
192
|
+
name={user?.name?.full}
|
|
193
|
+
size={40}
|
|
194
|
+
theme={theme}
|
|
195
|
+
/>
|
|
196
|
+
</View>
|
|
197
|
+
<View style={styles.settingInfo}>
|
|
198
|
+
<View>
|
|
199
|
+
<Text style={styles.settingLabel}>
|
|
200
|
+
{typeof user.name === 'string' ? user.name : user.name?.full || user.name?.first || user.username}
|
|
201
|
+
</Text>
|
|
202
|
+
<Text style={styles.settingDescription}>{user.email || user.username}</Text>
|
|
203
|
+
</View>
|
|
204
|
+
</View>
|
|
205
|
+
<TouchableOpacity
|
|
206
|
+
style={styles.manageButton}
|
|
207
|
+
onPress={() => toast.info('Manage your Oxy Account feature coming soon!')}
|
|
208
|
+
>
|
|
209
|
+
<Text style={styles.manageButtonText}>Manage</Text>
|
|
210
|
+
</TouchableOpacity>
|
|
167
211
|
</View>
|
|
168
|
-
|
|
212
|
+
</View>
|
|
169
213
|
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
214
|
+
{/* Account Settings */}
|
|
215
|
+
<View style={styles.section}>
|
|
216
|
+
<Text style={styles.sectionTitle}>Account Settings</Text>
|
|
217
|
+
|
|
218
|
+
<TouchableOpacity
|
|
219
|
+
style={[styles.settingItem, styles.firstSettingItem]}
|
|
220
|
+
onPress={() => navigate?.('AccountSettings', { activeTab: 'profile' })}
|
|
173
221
|
>
|
|
174
|
-
<
|
|
175
|
-
|
|
176
|
-
|
|
222
|
+
<View style={styles.settingInfo}>
|
|
223
|
+
<OxyIcon name="person-circle" size={20} color="#007AFF" style={styles.settingIcon} />
|
|
224
|
+
<View>
|
|
225
|
+
<Text style={styles.settingLabel}>Edit Profile</Text>
|
|
226
|
+
<Text style={styles.settingDescription}>Update your personal information</Text>
|
|
227
|
+
</View>
|
|
228
|
+
</View>
|
|
229
|
+
<OxyIcon name="chevron-forward" size={16} color="#ccc" />
|
|
177
230
|
</TouchableOpacity>
|
|
178
|
-
</View>
|
|
179
231
|
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
232
|
+
<TouchableOpacity
|
|
233
|
+
style={styles.settingItem}
|
|
234
|
+
onPress={() => navigate?.('AccountSettings', { activeTab: 'password' })}
|
|
235
|
+
>
|
|
236
|
+
<View style={styles.settingInfo}>
|
|
237
|
+
<OxyIcon name="shield-checkmark" size={20} color="#30D158" style={styles.settingIcon} />
|
|
238
|
+
<View>
|
|
239
|
+
<Text style={styles.settingLabel}>Security & Privacy</Text>
|
|
240
|
+
<Text style={styles.settingDescription}>Password, 2FA, and privacy settings</Text>
|
|
241
|
+
</View>
|
|
242
|
+
</View>
|
|
243
|
+
<OxyIcon name="chevron-forward" size={16} color="#ccc" />
|
|
244
|
+
</TouchableOpacity>
|
|
245
|
+
|
|
246
|
+
<TouchableOpacity
|
|
247
|
+
style={styles.settingItem}
|
|
248
|
+
onPress={() => navigate?.('AccountSettings', { activeTab: 'notifications' })}
|
|
249
|
+
>
|
|
250
|
+
<View style={styles.settingInfo}>
|
|
251
|
+
<OxyIcon name="notifications" size={20} color="#FF9500" style={styles.settingIcon} />
|
|
252
|
+
<View>
|
|
253
|
+
<Text style={styles.settingLabel}>Notifications</Text>
|
|
254
|
+
<Text style={styles.settingDescription}>Manage your notification preferences</Text>
|
|
255
|
+
</View>
|
|
256
|
+
</View>
|
|
257
|
+
<OxyIcon name="chevron-forward" size={16} color="#ccc" />
|
|
258
|
+
</TouchableOpacity>
|
|
259
|
+
|
|
260
|
+
<TouchableOpacity
|
|
261
|
+
style={[styles.settingItem]}
|
|
262
|
+
onPress={() => navigate?.('PremiumSubscription')}
|
|
263
|
+
>
|
|
264
|
+
<View style={styles.settingInfo}>
|
|
265
|
+
<OxyIcon name="star" size={20} color="#FFD700" style={styles.settingIcon} />
|
|
266
|
+
<View>
|
|
267
|
+
<Text style={styles.settingLabel}>Oxy+ Subscriptions</Text>
|
|
268
|
+
<Text style={styles.settingDescription}>{user.isPremium ? 'Manage your premium plan' : 'Upgrade to premium features'}</Text>
|
|
269
|
+
</View>
|
|
270
|
+
</View>
|
|
271
|
+
<OxyIcon name="chevron-forward" size={16} color="#ccc" />
|
|
272
|
+
</TouchableOpacity>
|
|
192
273
|
|
|
274
|
+
{user.isPremium && (
|
|
275
|
+
<TouchableOpacity
|
|
276
|
+
style={[styles.settingItem, styles.lastSettingItem]}
|
|
277
|
+
onPress={() => navigate?.('BillingManagement')}
|
|
278
|
+
>
|
|
279
|
+
<View style={styles.settingInfo}>
|
|
280
|
+
<OxyIcon name="card" size={20} color="#34C759" style={styles.settingIcon} />
|
|
281
|
+
<View>
|
|
282
|
+
<Text style={styles.settingLabel}>Billing Management</Text>
|
|
283
|
+
<Text style={styles.settingDescription}>Payment methods and invoices</Text>
|
|
284
|
+
</View>
|
|
285
|
+
</View>
|
|
286
|
+
<OxyIcon name="chevron-forward" size={16} color="#ccc" />
|
|
287
|
+
</TouchableOpacity>
|
|
288
|
+
)}
|
|
289
|
+
</View>
|
|
290
|
+
|
|
291
|
+
{/* Additional Accounts */}
|
|
193
292
|
{showMoreAccounts && (
|
|
194
|
-
<View style={
|
|
195
|
-
{
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
293
|
+
<View style={styles.section}>
|
|
294
|
+
<Text style={styles.sectionTitle}>Additional Accounts{additionalAccountsData.length > 0 ? ` (${additionalAccountsData.length})` : ''}</Text>
|
|
295
|
+
|
|
296
|
+
{loadingAdditionalAccounts ? (
|
|
297
|
+
<View style={[styles.settingItem, styles.firstSettingItem, styles.lastSettingItem]}>
|
|
298
|
+
<View style={styles.loadingContainer}>
|
|
299
|
+
<ActivityIndicator size="small" color="#007AFF" />
|
|
300
|
+
<Text style={styles.loadingText}>Loading accounts...</Text>
|
|
301
|
+
</View>
|
|
302
|
+
</View>
|
|
303
|
+
) : additionalAccountsData.length > 0 ? (
|
|
304
|
+
<>
|
|
305
|
+
{additionalAccountsData.map((account, index) => (
|
|
306
|
+
<TouchableOpacity
|
|
307
|
+
key={account.id}
|
|
308
|
+
style={[
|
|
309
|
+
styles.settingItem,
|
|
310
|
+
index === 0 && styles.firstSettingItem,
|
|
311
|
+
index === additionalAccountsData.length - 1 && styles.lastSettingItem
|
|
312
|
+
]}
|
|
313
|
+
onPress={() => {
|
|
314
|
+
toast.info(`Switch to ${account.username}?`);
|
|
315
|
+
// TODO: Implement account switching logic
|
|
316
|
+
// switchSession(account.sessionId);
|
|
317
|
+
}}
|
|
318
|
+
>
|
|
319
|
+
<View style={styles.userIcon}>
|
|
320
|
+
{account.avatar?.url ? (
|
|
321
|
+
<Image source={{ uri: account.avatar.url }} style={styles.accountAvatarImage} />
|
|
322
|
+
) : (
|
|
323
|
+
<View style={styles.accountAvatarFallback}>
|
|
324
|
+
<Text style={styles.accountAvatarText}>
|
|
325
|
+
{account.username?.charAt(0).toUpperCase() || '?'}
|
|
326
|
+
</Text>
|
|
327
|
+
</View>
|
|
328
|
+
)}
|
|
209
329
|
</View>
|
|
210
|
-
|
|
330
|
+
<View style={styles.settingInfo}>
|
|
331
|
+
<View>
|
|
332
|
+
<Text style={styles.settingLabel}>
|
|
333
|
+
{typeof account.name === 'object'
|
|
334
|
+
? account.name?.full || account.name?.first || account.username
|
|
335
|
+
: account.name || account.username
|
|
336
|
+
}
|
|
337
|
+
</Text>
|
|
338
|
+
<Text style={styles.settingDescription}>{account.email || account.username}</Text>
|
|
339
|
+
</View>
|
|
340
|
+
</View>
|
|
341
|
+
<OxyIcon name="chevron-forward" size={16} color="#ccc" />
|
|
342
|
+
</TouchableOpacity>
|
|
343
|
+
))}
|
|
344
|
+
</>
|
|
345
|
+
) : (
|
|
346
|
+
<View style={[styles.settingItem, styles.firstSettingItem, styles.lastSettingItem]}>
|
|
347
|
+
<View style={styles.settingInfo}>
|
|
348
|
+
<OxyIcon name="person-outline" size={20} color="#ccc" style={styles.settingIcon} />
|
|
211
349
|
<View>
|
|
212
|
-
<Text style={
|
|
213
|
-
|
|
214
|
-
</Text>
|
|
215
|
-
<Text style={[styles.accountEmail, { color: iconColor }]}>
|
|
216
|
-
{account.email}
|
|
217
|
-
</Text>
|
|
350
|
+
<Text style={styles.settingLabel}>No other accounts</Text>
|
|
351
|
+
<Text style={styles.settingDescription}>Add another account to switch between them</Text>
|
|
218
352
|
</View>
|
|
219
353
|
</View>
|
|
220
|
-
</
|
|
221
|
-
)
|
|
354
|
+
</View>
|
|
355
|
+
)}
|
|
356
|
+
</View>
|
|
357
|
+
)}
|
|
222
358
|
|
|
359
|
+
{/* Account Management */}
|
|
360
|
+
{showMoreAccounts && (
|
|
361
|
+
<View style={styles.section}>
|
|
362
|
+
<Text style={styles.sectionTitle}>Account Management</Text>
|
|
363
|
+
|
|
223
364
|
<TouchableOpacity
|
|
224
|
-
style={[styles.
|
|
365
|
+
style={[styles.settingItem, styles.firstSettingItem]}
|
|
225
366
|
onPress={handleAddAccount}
|
|
226
367
|
>
|
|
227
|
-
<View style={styles.
|
|
228
|
-
<
|
|
229
|
-
|
|
368
|
+
<View style={styles.settingInfo}>
|
|
369
|
+
<OxyIcon name="add" size={20} color="#007AFF" style={styles.settingIcon} />
|
|
370
|
+
<View>
|
|
371
|
+
<Text style={styles.settingLabel}>Add another account</Text>
|
|
372
|
+
<Text style={styles.settingDescription}>Sign in with a different account</Text>
|
|
230
373
|
</View>
|
|
231
|
-
<Text style={[styles.accountItemAction, { color: textColor }]}>
|
|
232
|
-
Add another account
|
|
233
|
-
</Text>
|
|
234
374
|
</View>
|
|
375
|
+
<OxyIcon name="chevron-forward" size={16} color="#ccc" />
|
|
235
376
|
</TouchableOpacity>
|
|
236
377
|
|
|
237
378
|
<TouchableOpacity
|
|
238
|
-
style={[styles.
|
|
379
|
+
style={[styles.settingItem, styles.lastSettingItem]}
|
|
239
380
|
onPress={handleSignOutAll}
|
|
240
381
|
>
|
|
241
|
-
<View style={styles.
|
|
242
|
-
<
|
|
243
|
-
|
|
382
|
+
<View style={styles.settingInfo}>
|
|
383
|
+
<OxyIcon name="log-out" size={20} color="#FF3B30" style={styles.settingIcon} />
|
|
384
|
+
<View>
|
|
385
|
+
<Text style={styles.settingLabel}>Sign out of all accounts</Text>
|
|
386
|
+
<Text style={styles.settingDescription}>Remove all accounts from this device</Text>
|
|
244
387
|
</View>
|
|
245
|
-
<Text style={[styles.accountItemAction, { color: textColor }]}>
|
|
246
|
-
Sign out of all accounts
|
|
247
|
-
</Text>
|
|
248
388
|
</View>
|
|
389
|
+
<OxyIcon name="chevron-forward" size={16} color="#ccc" />
|
|
249
390
|
</TouchableOpacity>
|
|
250
391
|
</View>
|
|
251
392
|
)}
|
|
252
393
|
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
<
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
394
|
+
{/* Quick Actions */}
|
|
395
|
+
<View style={styles.section}>
|
|
396
|
+
<Text style={styles.sectionTitle}>Quick Actions</Text>
|
|
397
|
+
|
|
398
|
+
<TouchableOpacity
|
|
399
|
+
style={[styles.settingItem, styles.firstSettingItem]}
|
|
400
|
+
onPress={() => setShowMoreAccounts(!showMoreAccounts)}
|
|
401
|
+
>
|
|
402
|
+
<View style={styles.settingInfo}>
|
|
403
|
+
<OxyIcon name="people" size={20} color="#5856D6" style={styles.settingIcon} />
|
|
404
|
+
<View>
|
|
405
|
+
<Text style={styles.settingLabel}>
|
|
406
|
+
{showMoreAccounts ? 'Hide' : 'Show'} Account Switcher
|
|
407
|
+
</Text>
|
|
408
|
+
<Text style={styles.settingDescription}>
|
|
409
|
+
{showMoreAccounts
|
|
410
|
+
? 'Hide account switcher'
|
|
411
|
+
: additionalAccountsData.length > 0
|
|
412
|
+
? `Switch between ${additionalAccountsData.length + 1} accounts`
|
|
413
|
+
: loadingAdditionalAccounts
|
|
414
|
+
? 'Loading additional accounts...'
|
|
415
|
+
: 'Manage multiple accounts'
|
|
416
|
+
}
|
|
417
|
+
</Text>
|
|
418
|
+
</View>
|
|
419
|
+
</View>
|
|
420
|
+
<OxyIcon name="chevron-forward" size={16} color="#ccc" />
|
|
421
|
+
</TouchableOpacity>
|
|
266
422
|
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
'
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
423
|
+
<TouchableOpacity
|
|
424
|
+
style={styles.settingItem}
|
|
425
|
+
onPress={() => toast.info('Download account data feature coming soon!')}
|
|
426
|
+
>
|
|
427
|
+
<View style={styles.settingInfo}>
|
|
428
|
+
<OxyIcon name="download" size={20} color="#34C759" style={styles.settingIcon} />
|
|
429
|
+
<View>
|
|
430
|
+
<Text style={styles.settingLabel}>Download My Data</Text>
|
|
431
|
+
<Text style={styles.settingDescription}>Export your account information</Text>
|
|
432
|
+
</View>
|
|
433
|
+
</View>
|
|
434
|
+
<OxyIcon name="chevron-forward" size={16} color="#ccc" />
|
|
435
|
+
</TouchableOpacity>
|
|
273
436
|
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
'
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
437
|
+
<TouchableOpacity
|
|
438
|
+
style={[styles.settingItem, styles.lastSettingItem]}
|
|
439
|
+
onPress={() => toast.info('Delete account feature coming soon!')}
|
|
440
|
+
>
|
|
441
|
+
<View style={styles.settingInfo}>
|
|
442
|
+
<OxyIcon name="trash" size={20} color="#FF3B30" style={styles.settingIcon} />
|
|
443
|
+
<View>
|
|
444
|
+
<Text style={styles.settingLabel}>Delete Account</Text>
|
|
445
|
+
<Text style={styles.settingDescription}>Permanently delete your account</Text>
|
|
446
|
+
</View>
|
|
447
|
+
</View>
|
|
448
|
+
<OxyIcon name="chevron-forward" size={16} color="#ccc" />
|
|
449
|
+
</TouchableOpacity>
|
|
450
|
+
</View>
|
|
280
451
|
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
452
|
+
{/* Support & Settings */}
|
|
453
|
+
<View style={styles.section}>
|
|
454
|
+
<Text style={styles.sectionTitle}>Support & Settings</Text>
|
|
455
|
+
|
|
456
|
+
<TouchableOpacity
|
|
457
|
+
style={[styles.settingItem, styles.firstSettingItem]}
|
|
458
|
+
onPress={() => toast.info('Account preferences coming soon!')}
|
|
459
|
+
>
|
|
460
|
+
<View style={styles.settingInfo}>
|
|
461
|
+
<OxyIcon name="settings" size={20} color="#8E8E93" style={styles.settingIcon} />
|
|
462
|
+
<View>
|
|
463
|
+
<Text style={styles.settingLabel}>Account Preferences</Text>
|
|
464
|
+
<Text style={styles.settingDescription}>Customize your account experience</Text>
|
|
465
|
+
</View>
|
|
466
|
+
</View>
|
|
467
|
+
<OxyIcon name="chevron-forward" size={16} color="#ccc" />
|
|
468
|
+
</TouchableOpacity>
|
|
287
469
|
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
'
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
470
|
+
<TouchableOpacity
|
|
471
|
+
style={styles.settingItem}
|
|
472
|
+
onPress={() => toast.info('Help & support feature coming soon!')}
|
|
473
|
+
>
|
|
474
|
+
<View style={styles.settingInfo}>
|
|
475
|
+
<OxyIcon name="help-circle" size={20} color="#007AFF" style={styles.settingIcon} />
|
|
476
|
+
<View>
|
|
477
|
+
<Text style={styles.settingLabel}>Help & Support</Text>
|
|
478
|
+
<Text style={styles.settingDescription}>Get help with your account</Text>
|
|
479
|
+
</View>
|
|
480
|
+
</View>
|
|
481
|
+
<OxyIcon name="chevron-forward" size={16} color="#ccc" />
|
|
482
|
+
</TouchableOpacity>
|
|
294
483
|
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
'
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
484
|
+
<TouchableOpacity
|
|
485
|
+
style={styles.settingItem}
|
|
486
|
+
onPress={() => toast.info('Connected apps feature coming soon!')}
|
|
487
|
+
>
|
|
488
|
+
<View style={styles.settingInfo}>
|
|
489
|
+
<OxyIcon name="link" size={20} color="#32D74B" style={styles.settingIcon} />
|
|
490
|
+
<View>
|
|
491
|
+
<Text style={styles.settingLabel}>Connected Apps</Text>
|
|
492
|
+
<Text style={styles.settingDescription}>Manage third-party app access</Text>
|
|
493
|
+
</View>
|
|
494
|
+
</View>
|
|
495
|
+
<OxyIcon name="chevron-forward" size={16} color="#ccc" />
|
|
496
|
+
</TouchableOpacity>
|
|
302
497
|
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
<
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
498
|
+
<TouchableOpacity
|
|
499
|
+
style={styles.settingItem}
|
|
500
|
+
onPress={() => toast.info('Privacy Policy feature coming soon!')}
|
|
501
|
+
>
|
|
502
|
+
<View style={styles.settingInfo}>
|
|
503
|
+
<OxyIcon name="document-lock" size={20} color="#FF9F0A" style={styles.settingIcon} />
|
|
504
|
+
<View>
|
|
505
|
+
<Text style={styles.settingLabel}>Privacy Policy</Text>
|
|
506
|
+
<Text style={styles.settingDescription}>Learn about data protection</Text>
|
|
507
|
+
</View>
|
|
508
|
+
</View>
|
|
509
|
+
<OxyIcon name="chevron-forward" size={16} color="#ccc" />
|
|
510
|
+
</TouchableOpacity>
|
|
313
511
|
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
512
|
+
<TouchableOpacity
|
|
513
|
+
style={[styles.settingItem, styles.lastSettingItem]}
|
|
514
|
+
onPress={() => toast.info('Terms of Service feature coming soon!')}
|
|
515
|
+
>
|
|
516
|
+
<View style={styles.settingInfo}>
|
|
517
|
+
<OxyIcon name="document-text" size={20} color="#5856D6" style={styles.settingIcon} />
|
|
518
|
+
<View>
|
|
519
|
+
<Text style={styles.settingLabel}>Terms of Service</Text>
|
|
520
|
+
<Text style={styles.settingDescription}>Read our terms and conditions</Text>
|
|
521
|
+
</View>
|
|
522
|
+
</View>
|
|
523
|
+
<OxyIcon name="chevron-forward" size={16} color="#ccc" />
|
|
524
|
+
</TouchableOpacity>
|
|
525
|
+
</View>
|
|
323
526
|
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
527
|
+
{/* Sign Out */}
|
|
528
|
+
<View style={styles.section}>
|
|
529
|
+
<TouchableOpacity
|
|
530
|
+
style={[styles.settingItem, styles.firstSettingItem, styles.lastSettingItem, styles.signOutButton]}
|
|
531
|
+
onPress={confirmLogout}
|
|
532
|
+
>
|
|
533
|
+
<View style={styles.settingInfo}>
|
|
534
|
+
<OxyIcon name="log-out" size={20} color="#ff4757" style={styles.settingIcon} />
|
|
535
|
+
<View>
|
|
536
|
+
<Text style={[styles.settingLabel, { color: '#ff4757' }]}>Sign Out</Text>
|
|
537
|
+
<Text style={styles.settingDescription}>Sign out of your account</Text>
|
|
538
|
+
</View>
|
|
539
|
+
</View>
|
|
540
|
+
</TouchableOpacity>
|
|
333
541
|
</View>
|
|
334
542
|
</ScrollView>
|
|
335
543
|
</View>
|
|
@@ -339,176 +547,132 @@ const AccountOverviewScreen: React.FC<BaseScreenProps> = ({
|
|
|
339
547
|
const styles = StyleSheet.create({
|
|
340
548
|
container: {
|
|
341
549
|
flex: 1,
|
|
342
|
-
|
|
343
|
-
scrollView: {
|
|
344
|
-
flex: 1,
|
|
345
|
-
},
|
|
346
|
-
scrollContainer: {
|
|
347
|
-
padding: 20,
|
|
550
|
+
backgroundColor: '#f2f2f2',
|
|
348
551
|
},
|
|
349
552
|
header: {
|
|
553
|
+
paddingHorizontal: 20,
|
|
554
|
+
paddingTop: 60,
|
|
555
|
+
paddingBottom: 16,
|
|
556
|
+
backgroundColor: '#fff',
|
|
557
|
+
borderBottomWidth: 1,
|
|
558
|
+
borderBottomColor: '#e0e0e0',
|
|
350
559
|
flexDirection: 'row',
|
|
351
560
|
justifyContent: 'space-between',
|
|
352
561
|
alignItems: 'center',
|
|
353
|
-
marginBottom: 20,
|
|
354
|
-
},
|
|
355
|
-
closeIcon: {
|
|
356
|
-
padding: 8,
|
|
357
|
-
},
|
|
358
|
-
profileContainer: {
|
|
359
|
-
padding: 20,
|
|
360
|
-
borderRadius: 15,
|
|
361
|
-
alignItems: 'center',
|
|
362
|
-
marginBottom: 20,
|
|
363
562
|
},
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
},
|
|
367
|
-
avatar: {
|
|
368
|
-
width: 70,
|
|
369
|
-
height: 70,
|
|
370
|
-
borderRadius: 35,
|
|
371
|
-
justifyContent: 'center',
|
|
372
|
-
alignItems: 'center',
|
|
373
|
-
},
|
|
374
|
-
avatarText: {
|
|
375
|
-
color: 'white',
|
|
376
|
-
fontSize: 30,
|
|
563
|
+
headerTitle: {
|
|
564
|
+
fontSize: 24,
|
|
377
565
|
fontWeight: 'bold',
|
|
566
|
+
color: '#000',
|
|
378
567
|
},
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
? 'Phudu' // Use CSS font name directly for web
|
|
382
|
-
: 'Phudu-Bold', // Use exact font name as registered with Font.loadAsync
|
|
383
|
-
fontWeight: Platform.OS === 'web' ? 'bold' : undefined, // Only apply fontWeight on web
|
|
384
|
-
fontSize: 20,
|
|
385
|
-
marginVertical: 10,
|
|
568
|
+
closeButton: {
|
|
569
|
+
padding: 8,
|
|
386
570
|
},
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
borderRadius: 20,
|
|
392
|
-
marginTop: 10,
|
|
571
|
+
closeButtonText: {
|
|
572
|
+
fontSize: 24,
|
|
573
|
+
color: '#000',
|
|
574
|
+
fontWeight: '300',
|
|
393
575
|
},
|
|
394
|
-
|
|
395
|
-
|
|
576
|
+
content: {
|
|
577
|
+
flex: 1,
|
|
578
|
+
padding: 16,
|
|
396
579
|
},
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
justifyContent: 'space-between',
|
|
400
|
-
alignItems: 'center',
|
|
401
|
-
paddingVertical: 15,
|
|
402
|
-
borderBottomWidth: 1,
|
|
403
|
-
marginBottom: 10,
|
|
580
|
+
section: {
|
|
581
|
+
marginBottom: 24,
|
|
404
582
|
},
|
|
405
|
-
|
|
406
|
-
fontFamily: Platform.OS === 'web'
|
|
407
|
-
? 'Phudu' // Use CSS font name directly for web
|
|
408
|
-
: 'Phudu-Bold', // Use exact font name as registered with Font.loadAsync
|
|
409
|
-
fontWeight: Platform.OS === 'web' ? 'bold' : undefined, // Only apply fontWeight on web
|
|
583
|
+
sectionTitle: {
|
|
410
584
|
fontSize: 16,
|
|
585
|
+
fontWeight: '600',
|
|
586
|
+
color: '#333',
|
|
587
|
+
marginBottom: 12,
|
|
411
588
|
},
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
overflow: 'hidden',
|
|
416
|
-
},
|
|
417
|
-
accountItem: {
|
|
589
|
+
settingItem: {
|
|
590
|
+
backgroundColor: '#fff',
|
|
591
|
+
padding: 16,
|
|
418
592
|
flexDirection: 'row',
|
|
419
|
-
justifyContent: 'space-between',
|
|
420
593
|
alignItems: 'center',
|
|
421
|
-
|
|
422
|
-
|
|
594
|
+
justifyContent: 'space-between',
|
|
595
|
+
marginBottom: 2,
|
|
423
596
|
},
|
|
424
|
-
|
|
597
|
+
firstSettingItem: {
|
|
598
|
+
borderTopLeftRadius: 24,
|
|
599
|
+
borderTopRightRadius: 24,
|
|
600
|
+
},
|
|
601
|
+
lastSettingItem: {
|
|
602
|
+
borderBottomLeftRadius: 24,
|
|
603
|
+
borderBottomRightRadius: 24,
|
|
604
|
+
marginBottom: 8,
|
|
605
|
+
},
|
|
606
|
+
settingInfo: {
|
|
425
607
|
flexDirection: 'row',
|
|
426
608
|
alignItems: 'center',
|
|
609
|
+
flex: 1,
|
|
427
610
|
},
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
height: 36,
|
|
431
|
-
borderRadius: 18,
|
|
432
|
-
marginRight: 15,
|
|
433
|
-
justifyContent: 'center',
|
|
434
|
-
alignItems: 'center',
|
|
611
|
+
settingIcon: {
|
|
612
|
+
marginRight: 12,
|
|
435
613
|
},
|
|
436
|
-
|
|
437
|
-
fontSize:
|
|
614
|
+
settingLabel: {
|
|
615
|
+
fontSize: 16,
|
|
438
616
|
fontWeight: '500',
|
|
617
|
+
color: '#333',
|
|
618
|
+
marginBottom: 2,
|
|
439
619
|
},
|
|
440
|
-
|
|
620
|
+
settingDescription: {
|
|
441
621
|
fontSize: 14,
|
|
622
|
+
color: '#666',
|
|
442
623
|
},
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
},
|
|
446
|
-
addAccountIcon: {
|
|
447
|
-
backgroundColor: 'transparent',
|
|
448
|
-
borderWidth: 1,
|
|
624
|
+
userIcon: {
|
|
625
|
+
marginRight: 12,
|
|
449
626
|
},
|
|
450
|
-
|
|
451
|
-
backgroundColor: '
|
|
452
|
-
|
|
627
|
+
manageButton: {
|
|
628
|
+
backgroundColor: '#007AFF',
|
|
629
|
+
paddingHorizontal: 16,
|
|
630
|
+
paddingVertical: 8,
|
|
631
|
+
borderRadius: 16,
|
|
453
632
|
},
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
633
|
+
manageButtonText: {
|
|
634
|
+
color: '#fff',
|
|
635
|
+
fontSize: 14,
|
|
636
|
+
fontWeight: '500',
|
|
458
637
|
},
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
padding: 15,
|
|
464
|
-
borderBottomWidth: 1,
|
|
638
|
+
accountAvatarImage: {
|
|
639
|
+
width: 40,
|
|
640
|
+
height: 40,
|
|
641
|
+
borderRadius: 20,
|
|
465
642
|
},
|
|
466
|
-
|
|
467
|
-
|
|
643
|
+
accountAvatarFallback: {
|
|
644
|
+
width: 40,
|
|
645
|
+
height: 40,
|
|
646
|
+
borderRadius: 20,
|
|
647
|
+
backgroundColor: '#d169e5',
|
|
468
648
|
alignItems: 'center',
|
|
469
|
-
},
|
|
470
|
-
iconContainer: {
|
|
471
|
-
width: 36,
|
|
472
|
-
height: 36,
|
|
473
649
|
justifyContent: 'center',
|
|
474
|
-
alignItems: 'center',
|
|
475
|
-
marginRight: 15,
|
|
476
650
|
},
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
651
|
+
accountAvatarText: {
|
|
652
|
+
color: 'white',
|
|
653
|
+
fontSize: 18,
|
|
654
|
+
fontWeight: 'bold',
|
|
480
655
|
},
|
|
481
|
-
|
|
482
|
-
|
|
656
|
+
signOutButton: {
|
|
657
|
+
borderWidth: 1,
|
|
658
|
+
borderColor: '#ff4757',
|
|
483
659
|
},
|
|
484
|
-
|
|
485
|
-
|
|
660
|
+
message: {
|
|
661
|
+
fontSize: 16,
|
|
662
|
+
textAlign: 'center',
|
|
663
|
+
marginTop: 24,
|
|
664
|
+
color: '#333',
|
|
486
665
|
},
|
|
487
|
-
|
|
666
|
+
loadingContainer: {
|
|
488
667
|
flexDirection: 'row',
|
|
489
|
-
justifyContent: 'space-between',
|
|
490
|
-
marginBottom: 20,
|
|
491
|
-
},
|
|
492
|
-
footerButton: {
|
|
493
|
-
flex: 1,
|
|
494
|
-
padding: 15,
|
|
495
668
|
alignItems: 'center',
|
|
496
|
-
},
|
|
497
|
-
footerButtonText: {
|
|
498
|
-
fontSize: 15,
|
|
499
|
-
},
|
|
500
|
-
footerLinksRow: {
|
|
501
|
-
flexDirection: 'row',
|
|
502
669
|
justifyContent: 'center',
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
footerLink: {
|
|
506
|
-
fontSize: 13,
|
|
670
|
+
paddingVertical: 20,
|
|
671
|
+
gap: 12,
|
|
507
672
|
},
|
|
508
|
-
|
|
673
|
+
loadingText: {
|
|
509
674
|
fontSize: 16,
|
|
510
|
-
|
|
511
|
-
marginTop: 24,
|
|
675
|
+
color: '#666',
|
|
512
676
|
},
|
|
513
677
|
});
|
|
514
678
|
|