@oxyhq/services 6.9.44 → 6.9.45

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 (160) hide show
  1. package/lib/commonjs/ui/components/OxyPayButton.js +4 -2
  2. package/lib/commonjs/ui/components/OxyPayButton.js.map +1 -1
  3. package/lib/commonjs/ui/components/OxySignInButton.js +83 -82
  4. package/lib/commonjs/ui/components/OxySignInButton.js.map +1 -1
  5. package/lib/commonjs/ui/components/SettingRow.js +11 -5
  6. package/lib/commonjs/ui/components/SettingRow.js.map +1 -1
  7. package/lib/commonjs/ui/components/fileManagement/FileDetailsModal.js +76 -121
  8. package/lib/commonjs/ui/components/fileManagement/FileDetailsModal.js.map +1 -1
  9. package/lib/commonjs/ui/components/fileManagement/UploadPreview.js +32 -18
  10. package/lib/commonjs/ui/components/fileManagement/UploadPreview.js.map +1 -1
  11. package/lib/commonjs/ui/components/icon/OxyIcon.js +5 -4
  12. package/lib/commonjs/ui/components/icon/OxyIcon.js.map +1 -1
  13. package/lib/commonjs/ui/components/internal/GroupedPillButtons.js +11 -9
  14. package/lib/commonjs/ui/components/internal/GroupedPillButtons.js.map +1 -1
  15. package/lib/commonjs/ui/components/internal/PinInput.js +3 -2
  16. package/lib/commonjs/ui/components/internal/PinInput.js.map +1 -1
  17. package/lib/commonjs/ui/components/modals/DeleteAccountModal.js +83 -219
  18. package/lib/commonjs/ui/components/modals/DeleteAccountModal.js.map +1 -1
  19. package/lib/commonjs/ui/constants/theme.js +2 -2
  20. package/lib/commonjs/ui/constants/theme.js.map +1 -1
  21. package/lib/commonjs/ui/screens/AccountCenterScreen.js +12 -10
  22. package/lib/commonjs/ui/screens/AccountCenterScreen.js.map +1 -1
  23. package/lib/commonjs/ui/screens/AccountOverviewScreen.js +70 -79
  24. package/lib/commonjs/ui/screens/AccountOverviewScreen.js.map +1 -1
  25. package/lib/commonjs/ui/screens/AccountSettingsScreen.js +22 -10
  26. package/lib/commonjs/ui/screens/AccountSettingsScreen.js.map +1 -1
  27. package/lib/commonjs/ui/screens/AccountSwitcherScreen.js +141 -81
  28. package/lib/commonjs/ui/screens/AccountSwitcherScreen.js.map +1 -1
  29. package/lib/commonjs/ui/screens/AccountVerificationScreen.js +21 -9
  30. package/lib/commonjs/ui/screens/AccountVerificationScreen.js.map +1 -1
  31. package/lib/commonjs/ui/screens/FileManagementScreen.js +83 -50
  32. package/lib/commonjs/ui/screens/FileManagementScreen.js.map +1 -1
  33. package/lib/commonjs/ui/screens/HistoryViewScreen.js +80 -101
  34. package/lib/commonjs/ui/screens/HistoryViewScreen.js.map +1 -1
  35. package/lib/commonjs/ui/screens/PremiumSubscriptionScreen.js +66 -93
  36. package/lib/commonjs/ui/screens/PremiumSubscriptionScreen.js.map +1 -1
  37. package/lib/commonjs/ui/screens/SessionManagementScreen.js +101 -66
  38. package/lib/commonjs/ui/screens/SessionManagementScreen.js.map +1 -1
  39. package/lib/commonjs/ui/utils/fileManagement.js +0 -21
  40. package/lib/commonjs/ui/utils/fileManagement.js.map +1 -1
  41. package/lib/module/ui/components/OxyPayButton.js +4 -2
  42. package/lib/module/ui/components/OxyPayButton.js.map +1 -1
  43. package/lib/module/ui/components/OxySignInButton.js +84 -83
  44. package/lib/module/ui/components/OxySignInButton.js.map +1 -1
  45. package/lib/module/ui/components/SettingRow.js +11 -5
  46. package/lib/module/ui/components/SettingRow.js.map +1 -1
  47. package/lib/module/ui/components/fileManagement/FileDetailsModal.js +76 -122
  48. package/lib/module/ui/components/fileManagement/FileDetailsModal.js.map +1 -1
  49. package/lib/module/ui/components/fileManagement/UploadPreview.js +32 -19
  50. package/lib/module/ui/components/fileManagement/UploadPreview.js.map +1 -1
  51. package/lib/module/ui/components/icon/OxyIcon.js +5 -4
  52. package/lib/module/ui/components/icon/OxyIcon.js.map +1 -1
  53. package/lib/module/ui/components/internal/GroupedPillButtons.js +11 -9
  54. package/lib/module/ui/components/internal/GroupedPillButtons.js.map +1 -1
  55. package/lib/module/ui/components/internal/PinInput.js +3 -2
  56. package/lib/module/ui/components/internal/PinInput.js.map +1 -1
  57. package/lib/module/ui/components/modals/DeleteAccountModal.js +83 -220
  58. package/lib/module/ui/components/modals/DeleteAccountModal.js.map +1 -1
  59. package/lib/module/ui/constants/theme.js +2 -2
  60. package/lib/module/ui/constants/theme.js.map +1 -1
  61. package/lib/module/ui/screens/AccountCenterScreen.js +11 -10
  62. package/lib/module/ui/screens/AccountCenterScreen.js.map +1 -1
  63. package/lib/module/ui/screens/AccountOverviewScreen.js +71 -80
  64. package/lib/module/ui/screens/AccountOverviewScreen.js.map +1 -1
  65. package/lib/module/ui/screens/AccountSettingsScreen.js +22 -10
  66. package/lib/module/ui/screens/AccountSettingsScreen.js.map +1 -1
  67. package/lib/module/ui/screens/AccountSwitcherScreen.js +140 -81
  68. package/lib/module/ui/screens/AccountSwitcherScreen.js.map +1 -1
  69. package/lib/module/ui/screens/AccountVerificationScreen.js +22 -10
  70. package/lib/module/ui/screens/AccountVerificationScreen.js.map +1 -1
  71. package/lib/module/ui/screens/FileManagementScreen.js +85 -52
  72. package/lib/module/ui/screens/FileManagementScreen.js.map +1 -1
  73. package/lib/module/ui/screens/HistoryViewScreen.js +80 -101
  74. package/lib/module/ui/screens/HistoryViewScreen.js.map +1 -1
  75. package/lib/module/ui/screens/PremiumSubscriptionScreen.js +66 -94
  76. package/lib/module/ui/screens/PremiumSubscriptionScreen.js.map +1 -1
  77. package/lib/module/ui/screens/SessionManagementScreen.js +101 -67
  78. package/lib/module/ui/screens/SessionManagementScreen.js.map +1 -1
  79. package/lib/module/ui/utils/fileManagement.js +0 -20
  80. package/lib/module/ui/utils/fileManagement.js.map +1 -1
  81. package/lib/typescript/commonjs/ui/components/OxyPayButton.d.ts.map +1 -1
  82. package/lib/typescript/commonjs/ui/components/OxySignInButton.d.ts +0 -1
  83. package/lib/typescript/commonjs/ui/components/OxySignInButton.d.ts.map +1 -1
  84. package/lib/typescript/commonjs/ui/components/SettingRow.d.ts +2 -2
  85. package/lib/typescript/commonjs/ui/components/SettingRow.d.ts.map +1 -1
  86. package/lib/typescript/commonjs/ui/components/fileManagement/FileDetailsModal.d.ts +3 -4
  87. package/lib/typescript/commonjs/ui/components/fileManagement/FileDetailsModal.d.ts.map +1 -1
  88. package/lib/typescript/commonjs/ui/components/fileManagement/UploadPreview.d.ts +2 -3
  89. package/lib/typescript/commonjs/ui/components/fileManagement/UploadPreview.d.ts.map +1 -1
  90. package/lib/typescript/commonjs/ui/components/icon/OxyIcon.d.ts.map +1 -1
  91. package/lib/typescript/commonjs/ui/components/internal/GroupedPillButtons.d.ts.map +1 -1
  92. package/lib/typescript/commonjs/ui/components/internal/PinInput.d.ts.map +1 -1
  93. package/lib/typescript/commonjs/ui/components/modals/DeleteAccountModal.d.ts +2 -2
  94. package/lib/typescript/commonjs/ui/components/modals/DeleteAccountModal.d.ts.map +1 -1
  95. package/lib/typescript/commonjs/ui/screens/AccountCenterScreen.d.ts.map +1 -1
  96. package/lib/typescript/commonjs/ui/screens/AccountOverviewScreen.d.ts.map +1 -1
  97. package/lib/typescript/commonjs/ui/screens/AccountSettingsScreen.d.ts.map +1 -1
  98. package/lib/typescript/commonjs/ui/screens/AccountSwitcherScreen.d.ts.map +1 -1
  99. package/lib/typescript/commonjs/ui/screens/AccountVerificationScreen.d.ts.map +1 -1
  100. package/lib/typescript/commonjs/ui/screens/FileManagementScreen.d.ts.map +1 -1
  101. package/lib/typescript/commonjs/ui/screens/HistoryViewScreen.d.ts.map +1 -1
  102. package/lib/typescript/commonjs/ui/screens/PremiumSubscriptionScreen.d.ts.map +1 -1
  103. package/lib/typescript/commonjs/ui/screens/SessionManagementScreen.d.ts.map +1 -1
  104. package/lib/typescript/commonjs/ui/utils/fileManagement.d.ts +0 -4
  105. package/lib/typescript/commonjs/ui/utils/fileManagement.d.ts.map +1 -1
  106. package/lib/typescript/module/ui/components/OxyPayButton.d.ts.map +1 -1
  107. package/lib/typescript/module/ui/components/OxySignInButton.d.ts +0 -1
  108. package/lib/typescript/module/ui/components/OxySignInButton.d.ts.map +1 -1
  109. package/lib/typescript/module/ui/components/SettingRow.d.ts +2 -2
  110. package/lib/typescript/module/ui/components/SettingRow.d.ts.map +1 -1
  111. package/lib/typescript/module/ui/components/fileManagement/FileDetailsModal.d.ts +3 -4
  112. package/lib/typescript/module/ui/components/fileManagement/FileDetailsModal.d.ts.map +1 -1
  113. package/lib/typescript/module/ui/components/fileManagement/UploadPreview.d.ts +2 -3
  114. package/lib/typescript/module/ui/components/fileManagement/UploadPreview.d.ts.map +1 -1
  115. package/lib/typescript/module/ui/components/icon/OxyIcon.d.ts.map +1 -1
  116. package/lib/typescript/module/ui/components/internal/GroupedPillButtons.d.ts.map +1 -1
  117. package/lib/typescript/module/ui/components/internal/PinInput.d.ts.map +1 -1
  118. package/lib/typescript/module/ui/components/modals/DeleteAccountModal.d.ts +2 -2
  119. package/lib/typescript/module/ui/components/modals/DeleteAccountModal.d.ts.map +1 -1
  120. package/lib/typescript/module/ui/screens/AccountCenterScreen.d.ts.map +1 -1
  121. package/lib/typescript/module/ui/screens/AccountOverviewScreen.d.ts.map +1 -1
  122. package/lib/typescript/module/ui/screens/AccountSettingsScreen.d.ts.map +1 -1
  123. package/lib/typescript/module/ui/screens/AccountSwitcherScreen.d.ts.map +1 -1
  124. package/lib/typescript/module/ui/screens/AccountVerificationScreen.d.ts.map +1 -1
  125. package/lib/typescript/module/ui/screens/FileManagementScreen.d.ts.map +1 -1
  126. package/lib/typescript/module/ui/screens/HistoryViewScreen.d.ts.map +1 -1
  127. package/lib/typescript/module/ui/screens/PremiumSubscriptionScreen.d.ts.map +1 -1
  128. package/lib/typescript/module/ui/screens/SessionManagementScreen.d.ts.map +1 -1
  129. package/lib/typescript/module/ui/utils/fileManagement.d.ts +0 -4
  130. package/lib/typescript/module/ui/utils/fileManagement.d.ts.map +1 -1
  131. package/package.json +2 -2
  132. package/src/ui/components/OxyPayButton.tsx +5 -3
  133. package/src/ui/components/OxySignInButton.tsx +82 -81
  134. package/src/ui/components/SettingRow.tsx +14 -7
  135. package/src/ui/components/fileManagement/FileDetailsModal.tsx +69 -99
  136. package/src/ui/components/fileManagement/UploadPreview.tsx +58 -46
  137. package/src/ui/components/icon/OxyIcon.tsx +5 -4
  138. package/src/ui/components/internal/GroupedPillButtons.tsx +15 -12
  139. package/src/ui/components/internal/PinInput.tsx +4 -3
  140. package/src/ui/components/modals/DeleteAccountModal.tsx +79 -221
  141. package/src/ui/constants/theme.ts +2 -2
  142. package/src/ui/screens/AccountCenterScreen.tsx +34 -136
  143. package/src/ui/screens/AccountOverviewScreen.tsx +63 -98
  144. package/src/ui/screens/AccountSettingsScreen.tsx +21 -7
  145. package/src/ui/screens/AccountSwitcherScreen.tsx +135 -87
  146. package/src/ui/screens/AccountVerificationScreen.tsx +24 -16
  147. package/src/ui/screens/FileManagementScreen.tsx +62 -54
  148. package/src/ui/screens/HistoryViewScreen.tsx +57 -204
  149. package/src/ui/screens/PremiumSubscriptionScreen.tsx +73 -93
  150. package/src/ui/screens/SessionManagementScreen.tsx +101 -73
  151. package/src/ui/utils/fileManagement.ts +0 -30
  152. package/lib/commonjs/ui/utils/confirmAction.js +0 -28
  153. package/lib/commonjs/ui/utils/confirmAction.js.map +0 -1
  154. package/lib/module/ui/utils/confirmAction.js +0 -25
  155. package/lib/module/ui/utils/confirmAction.js.map +0 -1
  156. package/lib/typescript/commonjs/ui/utils/confirmAction.d.ts +0 -7
  157. package/lib/typescript/commonjs/ui/utils/confirmAction.d.ts.map +0 -1
  158. package/lib/typescript/module/ui/utils/confirmAction.d.ts +0 -7
  159. package/lib/typescript/module/ui/utils/confirmAction.d.ts.map +0 -1
  160. package/src/ui/utils/confirmAction.ts +0 -23
@@ -1,6 +1,6 @@
1
1
  import type React from 'react';
2
- import { Platform, type StyleProp, type TextStyle } from 'react-native';
3
2
  import { Ionicons } from '@expo/vector-icons';
3
+ import { useTheme } from '@oxyhq/bloom/theme';
4
4
 
5
5
  export interface IconProps {
6
6
  name: string;
@@ -12,16 +12,17 @@ export interface IconProps {
12
12
  const OxyIcon: React.FC<IconProps> = ({
13
13
  name,
14
14
  size = 24,
15
- color = '#000',
15
+ color,
16
16
  style
17
17
  }) => {
18
- // Icon name is already properly typed as IoniconsGlyphs
18
+ const theme = useTheme();
19
+ const resolvedColor = color ?? theme.colors.icon;
19
20
 
20
21
  return (
21
22
  <Ionicons
22
23
  name={name as React.ComponentProps<typeof Ionicons>['name']}
23
24
  size={size}
24
- color={color}
25
+ color={resolvedColor}
25
26
  style={style}
26
27
  />
27
28
  );
@@ -1,6 +1,7 @@
1
1
  import type React from 'react';
2
2
  import { View, TouchableOpacity, Text, ActivityIndicator, StyleSheet, Platform } from 'react-native';
3
3
  import { Ionicons } from '@expo/vector-icons';
4
+ import { useTheme } from '@oxyhq/bloom/theme';
4
5
 
5
6
  type IoniconsName = React.ComponentProps<typeof Ionicons>['name'];
6
7
 
@@ -32,6 +33,8 @@ const GroupedPillButtons: React.FC<GroupedPillButtonsProps> = ({
32
33
  colors,
33
34
  gap = 8,
34
35
  }) => {
36
+ const theme = useTheme();
37
+
35
38
  const getButtonStyle = (button: ButtonConfig, index: number, totalButtons: number) => {
36
39
  const baseStyle = {
37
40
  flexDirection: 'row' as const,
@@ -87,16 +90,16 @@ const GroupedPillButtons: React.FC<GroupedPillButtonsProps> = ({
87
90
 
88
91
  switch (button.variant) {
89
92
  case 'primary':
90
- backgroundColor = isDisabled ? '#CCCCCC' : colors.primary;
91
- borderColor = isDisabled ? '#CCCCCC' : colors.primary;
93
+ backgroundColor = isDisabled ? theme.colors.borderLight : colors.primary;
94
+ borderColor = isDisabled ? theme.colors.borderLight : colors.primary;
92
95
  break;
93
96
  case 'secondary':
94
- backgroundColor = isDisabled ? '#CCCCCC' : (colors.secondary || colors.primary);
95
- borderColor = isDisabled ? '#CCCCCC' : (colors.secondary || colors.primary);
97
+ backgroundColor = isDisabled ? theme.colors.borderLight : (colors.secondary || colors.primary);
98
+ borderColor = isDisabled ? theme.colors.borderLight : (colors.secondary || colors.primary);
96
99
  break;
97
100
  default:
98
101
  backgroundColor = 'transparent';
99
- borderColor = isDisabled ? '#CCCCCC' : colors.border;
102
+ borderColor = isDisabled ? theme.colors.borderLight : colors.border;
100
103
  break;
101
104
  }
102
105
 
@@ -119,14 +122,14 @@ const GroupedPillButtons: React.FC<GroupedPillButtonsProps> = ({
119
122
 
120
123
  const isDisabled = button.disabled || button.loading;
121
124
  let textColor = colors.text;
122
-
125
+
123
126
  switch (button.variant) {
124
127
  case 'primary':
125
128
  case 'secondary':
126
- textColor = isDisabled ? '#999999' : '#FFFFFF';
129
+ textColor = isDisabled ? theme.colors.textTertiary : '#FFFFFF';
127
130
  break;
128
131
  default:
129
- textColor = isDisabled ? '#999999' : colors.text;
132
+ textColor = isDisabled ? theme.colors.textTertiary : colors.text;
130
133
  break;
131
134
  }
132
135
 
@@ -139,13 +142,13 @@ const GroupedPillButtons: React.FC<GroupedPillButtonsProps> = ({
139
142
 
140
143
  const getIconColor = (button: ButtonConfig, colors: GroupedPillButtonColors) => {
141
144
  const isDisabled = button.disabled || button.loading;
142
-
145
+
143
146
  switch (button.variant) {
144
147
  case 'primary':
145
148
  case 'secondary':
146
- return isDisabled ? '#999999' : '#FFFFFF';
149
+ return isDisabled ? theme.colors.textTertiary : '#FFFFFF';
147
150
  default:
148
- return isDisabled ? '#999999' : colors.text;
151
+ return isDisabled ? theme.colors.textTertiary : colors.text;
149
152
  }
150
153
  };
151
154
 
@@ -247,4 +250,4 @@ const styles = StyleSheet.create({
247
250
  },
248
251
  });
249
252
 
250
- export default GroupedPillButtons;
253
+ export default GroupedPillButtons;
@@ -1,5 +1,6 @@
1
1
  import React, { useRef, forwardRef, useImperativeHandle } from 'react';
2
2
  import { View, TextInput, StyleSheet, Platform, type NativeSyntheticEvent, type TextInputKeyPressEventData } from 'react-native';
3
+ import { useTheme } from '@oxyhq/bloom/theme';
3
4
 
4
5
  interface PinInputColors {
5
6
  primary: string;
@@ -24,6 +25,7 @@ export interface PinInputHandle {
24
25
  }
25
26
 
26
27
  const PinInput = forwardRef<PinInputHandle, PinInputProps>(({ value, onChange, length = 6, disabled, autoFocus, colors }, ref) => {
28
+ const theme = useTheme();
27
29
  const inputs = useRef<Array<TextInput | null>>([]);
28
30
 
29
31
  useImperativeHandle(ref, () => ({
@@ -66,7 +68,7 @@ const PinInput = forwardRef<PinInputHandle, PinInputProps>(({ value, onChange, l
66
68
  ref={(ref) => { inputs.current[idx] = ref; }}
67
69
  style={[
68
70
  styles.pinInput,
69
- { borderColor: colors.primary, color: colors.text, backgroundColor: colors.inputBackground },
71
+ { borderColor: colors.primary, color: colors.text, backgroundColor: colors.inputBackground || theme.colors.backgroundSecondary },
70
72
  value[idx] ? { borderWidth: 2 } : { borderWidth: 1 },
71
73
  ]}
72
74
  value={value[idx] || ''}
@@ -100,7 +102,6 @@ const styles = StyleSheet.create({
100
102
  borderWidth: 1,
101
103
  fontSize: 28,
102
104
  fontWeight: '600',
103
- backgroundColor: '#F5F5F5',
104
105
  textAlign: 'center',
105
106
  marginHorizontal: 2,
106
107
  ...Platform.select({
@@ -118,4 +119,4 @@ const styles = StyleSheet.create({
118
119
  },
119
120
  });
120
121
 
121
- export default PinInput;
122
+ export default PinInput;
@@ -1,31 +1,23 @@
1
1
  import type React from 'react';
2
2
  import { useState, useCallback } from 'react';
3
- import {
4
- View,
5
- Text,
6
- TextInput,
7
- TouchableOpacity,
8
- StyleSheet,
9
- Modal,
10
- KeyboardAvoidingView,
11
- Platform,
12
- } from 'react-native';
3
+ import { View, Text, TextInput, TouchableOpacity } from 'react-native';
4
+ import * as Dialog from '@oxyhq/bloom/dialog';
5
+ import type { DialogControlProps } from '@oxyhq/bloom/dialog';
6
+ import * as Prompt from '@oxyhq/bloom/prompt';
13
7
  import OxyIcon from '../icon/OxyIcon';
14
8
  import { useTheme } from '@oxyhq/bloom/theme';
15
9
  import { Loading } from '@oxyhq/bloom/loading';
16
10
 
17
11
  interface DeleteAccountModalProps {
18
- visible: boolean;
12
+ control: DialogControlProps;
19
13
  username: string;
20
- onClose: () => void;
21
14
  onDelete: (password: string) => Promise<void>;
22
15
  t: (key: string, params?: Record<string, string>) => string | undefined;
23
16
  }
24
17
 
25
18
  const DeleteAccountModal: React.FC<DeleteAccountModalProps> = ({
26
- visible,
19
+ control,
27
20
  username,
28
- onClose,
29
21
  onDelete,
30
22
  t,
31
23
  }) => {
@@ -46,7 +38,7 @@ const DeleteAccountModal: React.FC<DeleteAccountModalProps> = ({
46
38
 
47
39
  try {
48
40
  await onDelete(password);
49
- // Modal will be closed by parent on success
41
+ // Dialog will be closed by parent on success
50
42
  } catch (err: unknown) {
51
43
  setError((err instanceof Error ? err.message : null) || t('deleteAccount.error') || 'Failed to delete account');
52
44
  } finally {
@@ -54,234 +46,100 @@ const DeleteAccountModal: React.FC<DeleteAccountModalProps> = ({
54
46
  }
55
47
  }, [isValid, password, onDelete, t]);
56
48
 
57
- const handleClose = useCallback(() => {
49
+ const handleCleanup = useCallback(() => {
58
50
  if (isDeleting) return;
59
51
  setPassword('');
60
52
  setConfirmUsername('');
61
53
  setError(null);
62
- onClose();
63
- }, [isDeleting, onClose]);
54
+ setShowPassword(false);
55
+ }, [isDeleting]);
64
56
 
65
57
  return (
66
- <Modal
67
- visible={visible}
68
- transparent
69
- animationType="fade"
70
- onRequestClose={handleClose}
71
- >
72
- <KeyboardAvoidingView
73
- behavior={Platform.OS === 'ios' ? 'padding' : 'height'}
74
- style={styles.overlay}
75
- >
76
- <TouchableOpacity
77
- style={[styles.backdrop, { backgroundColor: theme.colors.overlay }]}
78
- activeOpacity={1}
79
- onPress={handleClose}
80
- />
81
- <View style={[styles.modal, { backgroundColor: theme.colors.background }]}>
82
- <View style={styles.header}>
83
- <OxyIcon name="alert" size={32} color={theme.colors.error} />
84
- <Text className="text-destructive" style={styles.title}>
85
- {t('deleteAccount.title') || 'Delete Account'}
86
- </Text>
87
- </View>
88
-
89
- <Text className="text-foreground" style={styles.warning}>
90
- {t('deleteAccount.warning') || 'This action cannot be undone. Your account and all associated data will be permanently deleted.'}
58
+ <Dialog.Outer control={control} onClose={handleCleanup}>
59
+ <Dialog.Handle />
60
+ <Dialog.ScrollableInner label="Delete Account">
61
+ <View className="flex-row items-center mb-4 gap-3">
62
+ <OxyIcon name="alert" size={32} color={theme.colors.error} />
63
+ <Text className="text-destructive text-xl font-bold">
64
+ {t('deleteAccount.title') || 'Delete Account'}
91
65
  </Text>
66
+ </View>
92
67
 
93
- {error && (
94
- <View style={[styles.errorContainer, { backgroundColor: `${theme.colors.error}20` }]}>
95
- <Text className="text-destructive" style={styles.errorText}>
96
- {error}
97
- </Text>
98
- </View>
99
- )}
100
-
101
- <View style={styles.inputGroup}>
102
- <Text className="text-muted-foreground" style={styles.label}>
103
- {t('deleteAccount.passwordLabel') || 'Enter your password'}
68
+ <Text className="text-foreground text-sm leading-5 mb-5">
69
+ {t('deleteAccount.warning') || 'This action cannot be undone. Your account and all associated data will be permanently deleted.'}
70
+ </Text>
71
+
72
+ {error && (
73
+ <View
74
+ className="p-3 rounded-lg mb-4"
75
+ style={{ backgroundColor: `${theme.colors.error}20` }}
76
+ >
77
+ <Text className="text-destructive text-sm text-center">
78
+ {error}
104
79
  </Text>
105
- <View className="border-border bg-background" style={styles.inputContainer}>
106
- <TextInput
107
- className="text-foreground"
108
- style={styles.input}
109
- value={password}
110
- onChangeText={setPassword}
111
- placeholder={t('deleteAccount.passwordPlaceholder') || 'Password'}
112
- placeholderTextColor={theme.colors.textSecondary}
113
- secureTextEntry={!showPassword}
114
- autoCapitalize="none"
115
- editable={!isDeleting}
116
- />
117
- <TouchableOpacity
118
- onPress={() => setShowPassword(!showPassword)}
119
- style={styles.eyeButton}
120
- >
121
- <OxyIcon
122
- name={showPassword ? 'eye-off' : 'eye'}
123
- size={20}
124
- color={theme.colors.textSecondary}
125
- />
126
- </TouchableOpacity>
127
- </View>
128
80
  </View>
81
+ )}
129
82
 
130
- <View style={styles.inputGroup}>
131
- <Text className="text-muted-foreground" style={styles.label}>
132
- {t('deleteAccount.confirmLabel', { username }) || `Type "${username}" to confirm`}
133
- </Text>
83
+ <View className="mb-4">
84
+ <Text className="text-muted-foreground text-[13px] mb-2">
85
+ {t('deleteAccount.passwordLabel') || 'Enter your password'}
86
+ </Text>
87
+ <View className="flex-row items-center border border-border bg-background rounded-lg">
134
88
  <TextInput
135
- className="text-foreground bg-background"
136
- style={[
137
- styles.input,
138
- styles.confirmInput,
139
- {
140
- borderColor: confirmUsername === username ? theme.colors.success : theme.colors.border,
141
- },
142
- ]}
143
- value={confirmUsername}
144
- onChangeText={setConfirmUsername}
145
- placeholder={username}
89
+ className="text-foreground flex-1 text-base py-3 px-4"
90
+ value={password}
91
+ onChangeText={setPassword}
92
+ placeholder={t('deleteAccount.passwordPlaceholder') || 'Password'}
146
93
  placeholderTextColor={theme.colors.textSecondary}
94
+ secureTextEntry={!showPassword}
147
95
  autoCapitalize="none"
148
- autoCorrect={false}
149
96
  editable={!isDeleting}
150
97
  />
151
- </View>
152
-
153
- <View style={styles.buttons}>
154
98
  <TouchableOpacity
155
- className="border-border"
156
- style={[styles.button, styles.cancelButton]}
157
- onPress={handleClose}
158
- disabled={isDeleting}
99
+ onPress={() => setShowPassword(!showPassword)}
100
+ className="p-3"
159
101
  >
160
- <Text className="text-foreground" style={styles.buttonText}>
161
- {t('common.cancel') || 'Cancel'}
162
- </Text>
163
- </TouchableOpacity>
164
-
165
- <TouchableOpacity
166
- style={[
167
- styles.button,
168
- styles.deleteButton,
169
- { backgroundColor: isValid ? theme.colors.error : `${theme.colors.error}50` },
170
- ]}
171
- onPress={handleDelete}
172
- disabled={!isValid || isDeleting}
173
- >
174
- {isDeleting ? (
175
- <Loading size="small" />
176
- ) : (
177
- <Text style={[styles.deleteButtonText, { color: theme.colors.card }]}>
178
- {t('deleteAccount.confirm') || 'Delete Forever'}
179
- </Text>
180
- )}
102
+ <OxyIcon
103
+ name={showPassword ? 'eye-off' : 'eye'}
104
+ size={20}
105
+ color={theme.colors.textSecondary}
106
+ />
181
107
  </TouchableOpacity>
182
108
  </View>
183
109
  </View>
184
- </KeyboardAvoidingView>
185
- </Modal>
110
+
111
+ <View className="mb-4">
112
+ <Text className="text-muted-foreground text-[13px] mb-2">
113
+ {t('deleteAccount.confirmLabel', { username }) || `Type "${username}" to confirm`}
114
+ </Text>
115
+ <TextInput
116
+ className="text-foreground bg-background text-base py-3 px-4 border rounded-lg"
117
+ style={{
118
+ borderColor: confirmUsername === username ? theme.colors.success : theme.colors.border,
119
+ }}
120
+ value={confirmUsername}
121
+ onChangeText={setConfirmUsername}
122
+ placeholder={username}
123
+ placeholderTextColor={theme.colors.textSecondary}
124
+ autoCapitalize="none"
125
+ autoCorrect={false}
126
+ editable={!isDeleting}
127
+ />
128
+ </View>
129
+
130
+ <Prompt.Actions>
131
+ <Prompt.Action
132
+ onPress={handleDelete}
133
+ color="negative"
134
+ cta={isDeleting ? undefined : (t('deleteAccount.confirm') || 'Delete Forever')}
135
+ disabled={!isValid || isDeleting}
136
+ shouldCloseOnPress={false}
137
+ />
138
+ <Prompt.Cancel cta={t('common.cancel') || 'Cancel'} />
139
+ </Prompt.Actions>
140
+ </Dialog.ScrollableInner>
141
+ </Dialog.Outer>
186
142
  );
187
143
  };
188
144
 
189
- const styles = StyleSheet.create({
190
- overlay: {
191
- flex: 1,
192
- justifyContent: 'center',
193
- alignItems: 'center',
194
- },
195
- backdrop: {
196
- ...StyleSheet.absoluteFillObject,
197
- },
198
- modal: {
199
- width: '90%',
200
- maxWidth: 400,
201
- borderRadius: 16,
202
- padding: 24,
203
- shadowColor: '#000',
204
- shadowOffset: { width: 0, height: 4 },
205
- shadowOpacity: 0.3,
206
- shadowRadius: 8,
207
- elevation: 8,
208
- },
209
- header: {
210
- flexDirection: 'row',
211
- alignItems: 'center',
212
- marginBottom: 16,
213
- gap: 12,
214
- },
215
- title: {
216
- fontSize: 20,
217
- fontWeight: '700',
218
- },
219
- warning: {
220
- fontSize: 14,
221
- lineHeight: 20,
222
- marginBottom: 20,
223
- },
224
- errorContainer: {
225
- padding: 12,
226
- borderRadius: 8,
227
- marginBottom: 16,
228
- },
229
- errorText: {
230
- fontSize: 14,
231
- textAlign: 'center',
232
- },
233
- inputGroup: {
234
- marginBottom: 16,
235
- },
236
- label: {
237
- fontSize: 13,
238
- marginBottom: 8,
239
- },
240
- inputContainer: {
241
- flexDirection: 'row',
242
- alignItems: 'center',
243
- borderWidth: 1,
244
- borderRadius: 8,
245
- },
246
- input: {
247
- flex: 1,
248
- fontSize: 16,
249
- paddingVertical: 12,
250
- paddingHorizontal: 16,
251
- },
252
- confirmInput: {
253
- borderWidth: 1,
254
- borderRadius: 8,
255
- },
256
- eyeButton: {
257
- padding: 12,
258
- },
259
- buttons: {
260
- flexDirection: 'row',
261
- gap: 12,
262
- marginTop: 8,
263
- },
264
- button: {
265
- flex: 1,
266
- paddingVertical: 14,
267
- borderRadius: 8,
268
- alignItems: 'center',
269
- justifyContent: 'center',
270
- },
271
- cancelButton: {
272
- borderWidth: 1,
273
- },
274
- deleteButton: {
275
- minHeight: 48,
276
- },
277
- buttonText: {
278
- fontSize: 16,
279
- fontWeight: '600',
280
- },
281
- deleteButtonText: {
282
- fontSize: 16,
283
- fontWeight: '600',
284
- },
285
- });
286
-
287
145
  export default DeleteAccountModal;
@@ -6,8 +6,8 @@
6
6
 
7
7
  import { Platform } from 'react-native';
8
8
 
9
- const tintColorLight = '#0a7ea4';
10
- const tintColorDark = '#fff';
9
+ const tintColorLight = '#c46ede';
10
+ const tintColorDark = '#d69ae8';
11
11
 
12
12
  export const Colors = {
13
13
  light: {