@oxyhq/services 5.17.18 → 5.18.0

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 (238) hide show
  1. package/lib/commonjs/core/mixins/OxyServices.features.js +372 -0
  2. package/lib/commonjs/core/mixins/OxyServices.features.js.map +1 -0
  3. package/lib/commonjs/core/mixins/index.js +3 -2
  4. package/lib/commonjs/core/mixins/index.js.map +1 -1
  5. package/lib/commonjs/ui/components/GroupedItem.js +11 -1
  6. package/lib/commonjs/ui/components/GroupedItem.js.map +1 -1
  7. package/lib/commonjs/ui/components/SettingRow.js +17 -4
  8. package/lib/commonjs/ui/components/SettingRow.js.map +1 -1
  9. package/lib/commonjs/ui/components/feedback/FormInput.js +72 -0
  10. package/lib/commonjs/ui/components/feedback/FormInput.js.map +1 -0
  11. package/lib/commonjs/ui/components/feedback/ProgressIndicator.js +33 -0
  12. package/lib/commonjs/ui/components/feedback/ProgressIndicator.js.map +1 -0
  13. package/lib/commonjs/ui/components/feedback/constants.js +59 -0
  14. package/lib/commonjs/ui/components/feedback/constants.js.map +1 -0
  15. package/lib/commonjs/ui/components/feedback/feedbackStyles.js +262 -0
  16. package/lib/commonjs/ui/components/feedback/feedbackStyles.js.map +1 -0
  17. package/lib/commonjs/ui/components/feedback/index.js +54 -0
  18. package/lib/commonjs/ui/components/feedback/index.js.map +1 -0
  19. package/lib/commonjs/ui/components/feedback/types.js +6 -0
  20. package/lib/commonjs/ui/components/feedback/types.js.map +1 -0
  21. package/lib/commonjs/ui/components/feedback/useFeedbackForm.js +52 -0
  22. package/lib/commonjs/ui/components/feedback/useFeedbackForm.js.map +1 -0
  23. package/lib/commonjs/ui/components/modals/DeleteAccountModal.js +282 -0
  24. package/lib/commonjs/ui/components/modals/DeleteAccountModal.js.map +1 -0
  25. package/lib/commonjs/ui/components/modals/index.js +14 -0
  26. package/lib/commonjs/ui/components/modals/index.js.map +1 -0
  27. package/lib/commonjs/ui/components/payment/PaymentDetailsStep.js +309 -0
  28. package/lib/commonjs/ui/components/payment/PaymentDetailsStep.js.map +1 -0
  29. package/lib/commonjs/ui/components/payment/PaymentMethodStep.js +79 -0
  30. package/lib/commonjs/ui/components/payment/PaymentMethodStep.js.map +1 -0
  31. package/lib/commonjs/ui/components/payment/PaymentReviewStep.js +108 -0
  32. package/lib/commonjs/ui/components/payment/PaymentReviewStep.js.map +1 -0
  33. package/lib/commonjs/ui/components/payment/PaymentSuccessStep.js +79 -0
  34. package/lib/commonjs/ui/components/payment/PaymentSuccessStep.js.map +1 -0
  35. package/lib/commonjs/ui/components/payment/PaymentSummaryStep.js +176 -0
  36. package/lib/commonjs/ui/components/payment/PaymentSummaryStep.js.map +1 -0
  37. package/lib/commonjs/ui/components/payment/constants.js +53 -0
  38. package/lib/commonjs/ui/components/payment/constants.js.map +1 -0
  39. package/lib/commonjs/ui/components/payment/index.js +80 -0
  40. package/lib/commonjs/ui/components/payment/index.js.map +1 -0
  41. package/lib/commonjs/ui/components/payment/paymentStyles.js +409 -0
  42. package/lib/commonjs/ui/components/payment/paymentStyles.js.map +1 -0
  43. package/lib/commonjs/ui/components/payment/types.js +6 -0
  44. package/lib/commonjs/ui/components/payment/types.js.map +1 -0
  45. package/lib/commonjs/ui/hooks/index.js +26 -0
  46. package/lib/commonjs/ui/hooks/index.js.map +1 -1
  47. package/lib/commonjs/ui/hooks/useAsyncAction.js +95 -0
  48. package/lib/commonjs/ui/hooks/useAsyncAction.js.map +1 -0
  49. package/lib/commonjs/ui/hooks/useSettingToggle.js +126 -0
  50. package/lib/commonjs/ui/hooks/useSettingToggle.js.map +1 -0
  51. package/lib/commonjs/ui/navigation/routes.js +1 -0
  52. package/lib/commonjs/ui/navigation/routes.js.map +1 -1
  53. package/lib/commonjs/ui/screens/AccountCenterScreen.js +4 -2
  54. package/lib/commonjs/ui/screens/AccountCenterScreen.js.map +1 -1
  55. package/lib/commonjs/ui/screens/AccountOverviewScreen.js +33 -30
  56. package/lib/commonjs/ui/screens/AccountOverviewScreen.js.map +1 -1
  57. package/lib/commonjs/ui/screens/FAQScreen.js +315 -0
  58. package/lib/commonjs/ui/screens/FAQScreen.js.map +1 -0
  59. package/lib/commonjs/ui/screens/FeedbackScreen.js +73 -590
  60. package/lib/commonjs/ui/screens/FeedbackScreen.js.map +1 -1
  61. package/lib/commonjs/ui/screens/HelpSupportScreen.js +8 -7
  62. package/lib/commonjs/ui/screens/HelpSupportScreen.js.map +1 -1
  63. package/lib/commonjs/ui/screens/PaymentGatewayScreen.js +67 -1395
  64. package/lib/commonjs/ui/screens/PaymentGatewayScreen.js.map +1 -1
  65. package/lib/commonjs/ui/screens/ProfileScreen.js +13 -5
  66. package/lib/commonjs/ui/screens/ProfileScreen.js.map +1 -1
  67. package/lib/commonjs/ui/screens/SavesCollectionsScreen.js +16 -10
  68. package/lib/commonjs/ui/screens/SavesCollectionsScreen.js.map +1 -1
  69. package/lib/commonjs/ui/screens/karma/KarmaCenterScreen.js +23 -11
  70. package/lib/commonjs/ui/screens/karma/KarmaCenterScreen.js.map +1 -1
  71. package/lib/module/core/mixins/OxyServices.features.js +369 -0
  72. package/lib/module/core/mixins/OxyServices.features.js.map +1 -0
  73. package/lib/module/core/mixins/index.js +3 -2
  74. package/lib/module/core/mixins/index.js.map +1 -1
  75. package/lib/module/ui/components/GroupedItem.js +11 -1
  76. package/lib/module/ui/components/GroupedItem.js.map +1 -1
  77. package/lib/module/ui/components/SettingRow.js +17 -4
  78. package/lib/module/ui/components/SettingRow.js.map +1 -1
  79. package/lib/module/ui/components/feedback/FormInput.js +67 -0
  80. package/lib/module/ui/components/feedback/FormInput.js.map +1 -0
  81. package/lib/module/ui/components/feedback/ProgressIndicator.js +28 -0
  82. package/lib/module/ui/components/feedback/ProgressIndicator.js.map +1 -0
  83. package/lib/module/ui/components/feedback/constants.js +55 -0
  84. package/lib/module/ui/components/feedback/constants.js.map +1 -0
  85. package/lib/module/ui/components/feedback/feedbackStyles.js +257 -0
  86. package/lib/module/ui/components/feedback/feedbackStyles.js.map +1 -0
  87. package/lib/module/ui/components/feedback/index.js +8 -0
  88. package/lib/module/ui/components/feedback/index.js.map +1 -0
  89. package/lib/module/ui/components/feedback/types.js +4 -0
  90. package/lib/module/ui/components/feedback/types.js.map +1 -0
  91. package/lib/module/ui/components/feedback/useFeedbackForm.js +47 -0
  92. package/lib/module/ui/components/feedback/useFeedbackForm.js.map +1 -0
  93. package/lib/module/ui/components/modals/DeleteAccountModal.js +276 -0
  94. package/lib/module/ui/components/modals/DeleteAccountModal.js.map +1 -0
  95. package/lib/module/ui/components/modals/index.js +4 -0
  96. package/lib/module/ui/components/modals/index.js.map +1 -0
  97. package/lib/module/ui/components/payment/PaymentDetailsStep.js +303 -0
  98. package/lib/module/ui/components/payment/PaymentDetailsStep.js.map +1 -0
  99. package/lib/module/ui/components/payment/PaymentMethodStep.js +73 -0
  100. package/lib/module/ui/components/payment/PaymentMethodStep.js.map +1 -0
  101. package/lib/module/ui/components/payment/PaymentReviewStep.js +102 -0
  102. package/lib/module/ui/components/payment/PaymentReviewStep.js.map +1 -0
  103. package/lib/module/ui/components/payment/PaymentSuccessStep.js +73 -0
  104. package/lib/module/ui/components/payment/PaymentSuccessStep.js.map +1 -0
  105. package/lib/module/ui/components/payment/PaymentSummaryStep.js +170 -0
  106. package/lib/module/ui/components/payment/PaymentSummaryStep.js.map +1 -0
  107. package/lib/module/ui/components/payment/constants.js +47 -0
  108. package/lib/module/ui/components/payment/constants.js.map +1 -0
  109. package/lib/module/ui/components/payment/index.js +10 -0
  110. package/lib/module/ui/components/payment/index.js.map +1 -0
  111. package/lib/module/ui/components/payment/paymentStyles.js +404 -0
  112. package/lib/module/ui/components/payment/paymentStyles.js.map +1 -0
  113. package/lib/module/ui/components/payment/types.js +4 -0
  114. package/lib/module/ui/components/payment/types.js.map +1 -0
  115. package/lib/module/ui/hooks/index.js +2 -0
  116. package/lib/module/ui/hooks/index.js.map +1 -1
  117. package/lib/module/ui/hooks/useAsyncAction.js +89 -0
  118. package/lib/module/ui/hooks/useAsyncAction.js.map +1 -0
  119. package/lib/module/ui/hooks/useSettingToggle.js +120 -0
  120. package/lib/module/ui/hooks/useSettingToggle.js.map +1 -0
  121. package/lib/module/ui/navigation/routes.js +1 -0
  122. package/lib/module/ui/navigation/routes.js.map +1 -1
  123. package/lib/module/ui/screens/AccountCenterScreen.js +4 -2
  124. package/lib/module/ui/screens/AccountCenterScreen.js.map +1 -1
  125. package/lib/module/ui/screens/AccountOverviewScreen.js +33 -30
  126. package/lib/module/ui/screens/AccountOverviewScreen.js.map +1 -1
  127. package/lib/module/ui/screens/FAQScreen.js +310 -0
  128. package/lib/module/ui/screens/FAQScreen.js.map +1 -0
  129. package/lib/module/ui/screens/FeedbackScreen.js +64 -581
  130. package/lib/module/ui/screens/FeedbackScreen.js.map +1 -1
  131. package/lib/module/ui/screens/HelpSupportScreen.js +8 -7
  132. package/lib/module/ui/screens/HelpSupportScreen.js.map +1 -1
  133. package/lib/module/ui/screens/PaymentGatewayScreen.js +67 -1397
  134. package/lib/module/ui/screens/PaymentGatewayScreen.js.map +1 -1
  135. package/lib/module/ui/screens/ProfileScreen.js +13 -5
  136. package/lib/module/ui/screens/ProfileScreen.js.map +1 -1
  137. package/lib/module/ui/screens/SavesCollectionsScreen.js +16 -10
  138. package/lib/module/ui/screens/SavesCollectionsScreen.js.map +1 -1
  139. package/lib/module/ui/screens/karma/KarmaCenterScreen.js +23 -11
  140. package/lib/module/ui/screens/karma/KarmaCenterScreen.js.map +1 -1
  141. package/lib/typescript/core/mixins/OxyServices.features.d.ts +229 -0
  142. package/lib/typescript/core/mixins/OxyServices.features.d.ts.map +1 -0
  143. package/lib/typescript/core/mixins/index.d.ts +71 -1
  144. package/lib/typescript/core/mixins/index.d.ts.map +1 -1
  145. package/lib/typescript/ui/components/GroupedItem.d.ts +5 -1
  146. package/lib/typescript/ui/components/GroupedItem.d.ts.map +1 -1
  147. package/lib/typescript/ui/components/SettingRow.d.ts +6 -0
  148. package/lib/typescript/ui/components/SettingRow.d.ts.map +1 -1
  149. package/lib/typescript/ui/components/feedback/FormInput.d.ts +20 -0
  150. package/lib/typescript/ui/components/feedback/FormInput.d.ts.map +1 -0
  151. package/lib/typescript/ui/components/feedback/ProgressIndicator.d.ts +11 -0
  152. package/lib/typescript/ui/components/feedback/ProgressIndicator.d.ts.map +1 -0
  153. package/lib/typescript/ui/components/feedback/constants.d.ts +5 -0
  154. package/lib/typescript/ui/components/feedback/constants.d.ts.map +1 -0
  155. package/lib/typescript/ui/components/feedback/feedbackStyles.d.ts +280 -0
  156. package/lib/typescript/ui/components/feedback/feedbackStyles.d.ts.map +1 -0
  157. package/lib/typescript/ui/components/feedback/index.d.ts +7 -0
  158. package/lib/typescript/ui/components/feedback/index.d.ts.map +1 -0
  159. package/lib/typescript/ui/components/feedback/types.d.ts +46 -0
  160. package/lib/typescript/ui/components/feedback/types.d.ts.map +1 -0
  161. package/lib/typescript/ui/components/feedback/useFeedbackForm.d.ts +9 -0
  162. package/lib/typescript/ui/components/feedback/useFeedbackForm.d.ts.map +1 -0
  163. package/lib/typescript/ui/components/modals/DeleteAccountModal.d.ts +19 -0
  164. package/lib/typescript/ui/components/modals/DeleteAccountModal.d.ts.map +1 -0
  165. package/lib/typescript/ui/components/modals/index.d.ts +2 -0
  166. package/lib/typescript/ui/components/modals/index.d.ts.map +1 -0
  167. package/lib/typescript/ui/components/payment/PaymentDetailsStep.d.ts +21 -0
  168. package/lib/typescript/ui/components/payment/PaymentDetailsStep.d.ts.map +1 -0
  169. package/lib/typescript/ui/components/payment/PaymentMethodStep.d.ts +14 -0
  170. package/lib/typescript/ui/components/payment/PaymentMethodStep.d.ts.map +1 -0
  171. package/lib/typescript/ui/components/payment/PaymentReviewStep.d.ts +16 -0
  172. package/lib/typescript/ui/components/payment/PaymentReviewStep.d.ts.map +1 -0
  173. package/lib/typescript/ui/components/payment/PaymentSuccessStep.d.ts +10 -0
  174. package/lib/typescript/ui/components/payment/PaymentSuccessStep.d.ts.map +1 -0
  175. package/lib/typescript/ui/components/payment/PaymentSummaryStep.d.ts +15 -0
  176. package/lib/typescript/ui/components/payment/PaymentSummaryStep.d.ts.map +1 -0
  177. package/lib/typescript/ui/components/payment/constants.d.ts +7 -0
  178. package/lib/typescript/ui/components/payment/constants.d.ts.map +1 -0
  179. package/lib/typescript/ui/components/payment/index.d.ts +9 -0
  180. package/lib/typescript/ui/components/payment/index.d.ts.map +1 -0
  181. package/lib/typescript/ui/components/payment/paymentStyles.d.ts +396 -0
  182. package/lib/typescript/ui/components/payment/paymentStyles.d.ts.map +1 -0
  183. package/lib/typescript/ui/components/payment/types.d.ts +40 -0
  184. package/lib/typescript/ui/components/payment/types.d.ts.map +1 -0
  185. package/lib/typescript/ui/hooks/index.d.ts +2 -0
  186. package/lib/typescript/ui/hooks/index.d.ts.map +1 -1
  187. package/lib/typescript/ui/hooks/useAsyncAction.d.ts +51 -0
  188. package/lib/typescript/ui/hooks/useAsyncAction.d.ts.map +1 -0
  189. package/lib/typescript/ui/hooks/useSettingToggle.d.ts +55 -0
  190. package/lib/typescript/ui/hooks/useSettingToggle.d.ts.map +1 -0
  191. package/lib/typescript/ui/navigation/routes.d.ts +1 -1
  192. package/lib/typescript/ui/navigation/routes.d.ts.map +1 -1
  193. package/lib/typescript/ui/screens/AccountOverviewScreen.d.ts.map +1 -1
  194. package/lib/typescript/ui/screens/FAQScreen.d.ts +5 -0
  195. package/lib/typescript/ui/screens/FAQScreen.d.ts.map +1 -0
  196. package/lib/typescript/ui/screens/FeedbackScreen.d.ts.map +1 -1
  197. package/lib/typescript/ui/screens/HelpSupportScreen.d.ts.map +1 -1
  198. package/lib/typescript/ui/screens/PaymentGatewayScreen.d.ts +3 -15
  199. package/lib/typescript/ui/screens/PaymentGatewayScreen.d.ts.map +1 -1
  200. package/lib/typescript/ui/screens/ProfileScreen.d.ts.map +1 -1
  201. package/lib/typescript/ui/screens/SavesCollectionsScreen.d.ts.map +1 -1
  202. package/lib/typescript/ui/screens/karma/KarmaCenterScreen.d.ts.map +1 -1
  203. package/package.json +1 -1
  204. package/src/core/mixins/OxyServices.features.ts +428 -0
  205. package/src/core/mixins/index.ts +20 -17
  206. package/src/ui/components/GroupedItem.tsx +19 -1
  207. package/src/ui/components/SettingRow.tsx +26 -4
  208. package/src/ui/components/feedback/FormInput.tsx +84 -0
  209. package/src/ui/components/feedback/ProgressIndicator.tsx +35 -0
  210. package/src/ui/components/feedback/constants.ts +22 -0
  211. package/src/ui/components/feedback/feedbackStyles.ts +247 -0
  212. package/src/ui/components/feedback/index.ts +6 -0
  213. package/src/ui/components/feedback/types.ts +52 -0
  214. package/src/ui/components/feedback/useFeedbackForm.ts +44 -0
  215. package/src/ui/components/modals/DeleteAccountModal.tsx +294 -0
  216. package/src/ui/components/modals/index.ts +1 -0
  217. package/src/ui/components/payment/PaymentDetailsStep.tsx +222 -0
  218. package/src/ui/components/payment/PaymentMethodStep.tsx +89 -0
  219. package/src/ui/components/payment/PaymentReviewStep.tsx +126 -0
  220. package/src/ui/components/payment/PaymentSuccessStep.tsx +71 -0
  221. package/src/ui/components/payment/PaymentSummaryStep.tsx +159 -0
  222. package/src/ui/components/payment/constants.ts +39 -0
  223. package/src/ui/components/payment/index.ts +9 -0
  224. package/src/ui/components/payment/paymentStyles.ts +397 -0
  225. package/src/ui/components/payment/types.ts +45 -0
  226. package/src/ui/hooks/index.ts +3 -1
  227. package/src/ui/hooks/useAsyncAction.ts +129 -0
  228. package/src/ui/hooks/useSettingToggle.ts +147 -0
  229. package/src/ui/navigation/routes.ts +2 -0
  230. package/src/ui/screens/AccountCenterScreen.tsx +2 -2
  231. package/src/ui/screens/AccountOverviewScreen.tsx +35 -37
  232. package/src/ui/screens/FAQScreen.tsx +332 -0
  233. package/src/ui/screens/FeedbackScreen.tsx +91 -626
  234. package/src/ui/screens/HelpSupportScreen.tsx +7 -5
  235. package/src/ui/screens/PaymentGatewayScreen.tsx +96 -1275
  236. package/src/ui/screens/ProfileScreen.tsx +11 -6
  237. package/src/ui/screens/SavesCollectionsScreen.tsx +19 -10
  238. package/src/ui/screens/karma/KarmaCenterScreen.tsx +10 -10
@@ -0,0 +1,35 @@
1
+ import React from 'react';
2
+ import { View } from 'react-native';
3
+ import type { FeedbackColors } from './types';
4
+
5
+ interface ProgressIndicatorProps {
6
+ currentStep: number;
7
+ totalSteps: number;
8
+ colors: FeedbackColors;
9
+ styles: any;
10
+ }
11
+
12
+ const ProgressIndicator: React.FC<ProgressIndicatorProps> = React.memo(({
13
+ currentStep,
14
+ totalSteps,
15
+ colors,
16
+ styles,
17
+ }) => (
18
+ <View style={styles.progressContainer} accessibilityRole="progressbar" accessibilityLabel={`Step ${currentStep + 1} of ${totalSteps}`}>
19
+ {Array.from({ length: totalSteps }, (_, index) => (
20
+ <View
21
+ key={index}
22
+ style={[
23
+ styles.progressDot,
24
+ currentStep === index ?
25
+ { backgroundColor: colors.primary, width: 24 } :
26
+ { backgroundColor: colors.border }
27
+ ]}
28
+ />
29
+ ))}
30
+ </View>
31
+ ));
32
+
33
+ ProgressIndicator.displayName = 'ProgressIndicator';
34
+
35
+ export default ProgressIndicator;
@@ -0,0 +1,22 @@
1
+ import type { FeedbackType, PriorityLevel } from './types';
2
+
3
+ export const FEEDBACK_TYPES: FeedbackType[] = [
4
+ { id: 'bug', label: 'Bug Report', icon: 'bug', color: '#FF3B30', description: 'Report a problem or issue' },
5
+ { id: 'feature', label: 'Feature Request', icon: 'bulb', color: '#007AFF', description: 'Suggest a new feature' },
6
+ { id: 'general', label: 'General Feedback', icon: 'chatbubble', color: '#34C759', description: 'Share your thoughts' },
7
+ { id: 'support', label: 'Support Request', icon: 'help-circle', color: '#FF9500', description: 'Get help with something' },
8
+ ];
9
+
10
+ export const PRIORITY_LEVELS: PriorityLevel[] = [
11
+ { id: 'low', label: 'Low', icon: 'arrow-down', color: '#34C759' },
12
+ { id: 'medium', label: 'Medium', icon: 'remove', color: '#FF9500' },
13
+ { id: 'high', label: 'High', icon: 'arrow-up', color: '#FF3B30' },
14
+ { id: 'critical', label: 'Critical', icon: 'warning', color: '#FF0000' },
15
+ ];
16
+
17
+ export const CATEGORIES: Record<string, string[]> = {
18
+ bug: ['UI/UX', 'Performance', 'Authentication', 'File Management', 'Billing', 'Other'],
19
+ feature: ['User Interface', 'File Management', 'Security', 'Performance', 'Integration', 'Other'],
20
+ general: ['User Experience', 'Design', 'Performance', 'Documentation', 'Other'],
21
+ support: ['Account Issues', 'Billing', 'Technical Problems', 'Feature Questions', 'Other'],
22
+ };
@@ -0,0 +1,247 @@
1
+ import { StyleSheet, Platform, Dimensions } from 'react-native';
2
+ import { screenContentStyle } from '../../constants/spacing';
3
+ import type { FeedbackColors } from './types';
4
+
5
+ export const createFeedbackStyles = (colors: FeedbackColors) => StyleSheet.create({
6
+ container: {
7
+ flex: 1,
8
+ },
9
+ fullBleed: {
10
+ width: '100%',
11
+ alignSelf: 'stretch',
12
+ },
13
+ scrollContent: {
14
+ flexGrow: 1,
15
+ ...screenContentStyle,
16
+ },
17
+ stepContainer: {
18
+ flex: 1,
19
+ justifyContent: 'flex-start',
20
+ alignItems: 'flex-start',
21
+ },
22
+ modernHeader: {
23
+ alignItems: 'flex-start',
24
+ width: '100%',
25
+ marginBottom: 24,
26
+ },
27
+ stepTitle: {
28
+ fontFamily: Platform.OS === 'web' ? 'Phudu' : 'Phudu-Bold',
29
+ fontWeight: Platform.OS === 'web' ? 'bold' : undefined,
30
+ fontSize: 42,
31
+ lineHeight: 48,
32
+ marginBottom: 12,
33
+ textAlign: 'left',
34
+ letterSpacing: -1,
35
+ },
36
+ modernSubtitle: {
37
+ fontSize: 18,
38
+ lineHeight: 24,
39
+ textAlign: 'left',
40
+ opacity: 0.8,
41
+ marginBottom: 24,
42
+ },
43
+ inputContainer: {
44
+ width: '100%',
45
+ marginBottom: 24,
46
+ },
47
+ premiumInputWrapper: {
48
+ flexDirection: 'row',
49
+ alignItems: 'center',
50
+ height: 56,
51
+ borderRadius: 16,
52
+ paddingHorizontal: 20,
53
+ borderWidth: 2,
54
+ backgroundColor: colors.inputBackground,
55
+ },
56
+ textAreaWrapper: {
57
+ flexDirection: 'column',
58
+ alignItems: 'flex-start',
59
+ minHeight: 120,
60
+ borderRadius: 16,
61
+ paddingHorizontal: 20,
62
+ paddingVertical: 16,
63
+ borderWidth: 2,
64
+ backgroundColor: colors.inputBackground,
65
+ },
66
+ inputIcon: {
67
+ marginRight: 12,
68
+ },
69
+ inputContent: {
70
+ flex: 1,
71
+ },
72
+ modernLabel: {
73
+ fontSize: 12,
74
+ fontWeight: '500',
75
+ marginBottom: 2,
76
+ },
77
+ modernInput: {
78
+ flex: 1,
79
+ fontSize: 16,
80
+ height: '100%',
81
+ },
82
+ textArea: {
83
+ flex: 1,
84
+ fontSize: 16,
85
+ textAlignVertical: 'top',
86
+ minHeight: 80,
87
+ },
88
+ categoryContainer: {
89
+ marginBottom: 24,
90
+ },
91
+ checkboxContainer: {
92
+ flexDirection: 'row',
93
+ alignItems: 'center',
94
+ marginBottom: 24,
95
+ },
96
+ checkbox: {
97
+ width: 24,
98
+ height: 24,
99
+ borderRadius: 6,
100
+ borderWidth: 2,
101
+ marginRight: 12,
102
+ alignItems: 'center',
103
+ justifyContent: 'center',
104
+ },
105
+ checkboxText: {
106
+ fontSize: 16,
107
+ flex: 1,
108
+ },
109
+ button: {
110
+ flexDirection: 'row',
111
+ alignItems: 'center',
112
+ justifyContent: 'center',
113
+ paddingVertical: 18,
114
+ paddingHorizontal: 32,
115
+ borderRadius: 16,
116
+ marginVertical: 8,
117
+ gap: 8,
118
+ width: '100%',
119
+ ...Platform.select({
120
+ web: {
121
+ boxShadow: '0 4px 8px rgba(0,0,0,0.3)',
122
+ },
123
+ default: {
124
+ shadowOffset: { width: 0, height: 4 },
125
+ shadowOpacity: 0.3,
126
+ shadowRadius: 8,
127
+ elevation: 6,
128
+ }
129
+ }),
130
+ },
131
+ buttonText: {
132
+ color: '#FFFFFF',
133
+ fontSize: 16,
134
+ fontWeight: '600',
135
+ letterSpacing: 0.5,
136
+ },
137
+ navigationButtons: {
138
+ flexDirection: 'row',
139
+ justifyContent: 'center',
140
+ marginTop: 16,
141
+ marginBottom: 8,
142
+ width: '100%',
143
+ gap: 8,
144
+ },
145
+ navButton: {
146
+ flexDirection: 'row',
147
+ alignItems: 'center',
148
+ paddingVertical: 6,
149
+ paddingHorizontal: 12,
150
+ gap: 6,
151
+ minWidth: 70,
152
+ borderWidth: 1,
153
+ ...Platform.select({
154
+ web: {
155
+ boxShadow: '0 2px 4px rgba(0,0,0,0.1)',
156
+ },
157
+ default: {
158
+ shadowOffset: { width: 0, height: 2 },
159
+ shadowOpacity: 0.1,
160
+ shadowRadius: 4,
161
+ elevation: 2,
162
+ }
163
+ }),
164
+ },
165
+ backButton: {
166
+ backgroundColor: 'transparent',
167
+ borderTopLeftRadius: 35,
168
+ borderBottomLeftRadius: 35,
169
+ borderTopRightRadius: 12,
170
+ borderBottomRightRadius: 12,
171
+ },
172
+ nextButton: {
173
+ backgroundColor: 'transparent',
174
+ borderTopRightRadius: 35,
175
+ borderBottomRightRadius: 35,
176
+ borderTopLeftRadius: 12,
177
+ borderBottomLeftRadius: 12,
178
+ },
179
+ navButtonText: {
180
+ fontSize: 13,
181
+ fontWeight: '500',
182
+ },
183
+ progressContainer: {
184
+ flexDirection: 'row',
185
+ justifyContent: 'center',
186
+ marginBottom: 20,
187
+ marginTop: 8,
188
+ },
189
+ progressDot: {
190
+ height: 10,
191
+ width: 10,
192
+ borderRadius: 5,
193
+ marginHorizontal: 6,
194
+ borderWidth: 2,
195
+ borderColor: '#fff',
196
+ ...Platform.select({
197
+ web: {
198
+ boxShadow: '0 1px 2px rgba(0,0,0,0.08)',
199
+ },
200
+ default: {
201
+ shadowColor: colors.primary,
202
+ shadowOpacity: 0.08,
203
+ shadowOffset: { width: 0, height: 1 },
204
+ shadowRadius: 2,
205
+ elevation: 1,
206
+ }
207
+ }),
208
+ },
209
+ summaryContainer: {
210
+ padding: 0,
211
+ marginBottom: 24,
212
+ width: '100%',
213
+ },
214
+ summaryRow: {
215
+ flexDirection: 'row',
216
+ marginBottom: 10,
217
+ },
218
+ summaryLabel: {
219
+ fontSize: 15,
220
+ width: 90,
221
+ },
222
+ summaryValue: {
223
+ fontSize: 15,
224
+ fontWeight: '600',
225
+ flex: 1,
226
+ },
227
+ successContainer: {
228
+ alignItems: 'center',
229
+ justifyContent: 'center',
230
+ padding: 40,
231
+ },
232
+ successIcon: {
233
+ marginBottom: 24,
234
+ },
235
+ successTitle: {
236
+ fontSize: 24,
237
+ fontWeight: 'bold',
238
+ marginBottom: 12,
239
+ textAlign: 'center',
240
+ },
241
+ successMessage: {
242
+ fontSize: 16,
243
+ textAlign: 'center',
244
+ opacity: 0.8,
245
+ marginBottom: 24,
246
+ },
247
+ });
@@ -0,0 +1,6 @@
1
+ export { default as FormInput } from './FormInput';
2
+ export { default as ProgressIndicator } from './ProgressIndicator';
3
+ export { useFeedbackForm } from './useFeedbackForm';
4
+ export { createFeedbackStyles } from './feedbackStyles';
5
+ export { FEEDBACK_TYPES, PRIORITY_LEVELS, CATEGORIES } from './constants';
6
+ export type { FeedbackData, FeedbackState, FeedbackColors, FeedbackStepAnimations, FeedbackType, PriorityLevel, User } from './types';
@@ -0,0 +1,52 @@
1
+ import type { Animated } from 'react-native';
2
+
3
+ export interface FeedbackData {
4
+ type: 'bug' | 'feature' | 'general' | 'support';
5
+ title: string;
6
+ description: string;
7
+ priority: 'low' | 'medium' | 'high' | 'critical';
8
+ category: string;
9
+ contactEmail: string;
10
+ systemInfo: boolean;
11
+ }
12
+
13
+ export interface FeedbackState {
14
+ status: 'idle' | 'submitting' | 'success' | 'error';
15
+ message: string;
16
+ }
17
+
18
+ export interface FeedbackType {
19
+ id: string;
20
+ label: string;
21
+ icon: string;
22
+ color: string;
23
+ description: string;
24
+ }
25
+
26
+ export interface PriorityLevel {
27
+ id: string;
28
+ label: string;
29
+ icon: string;
30
+ color: string;
31
+ }
32
+
33
+ export interface FeedbackColors {
34
+ primary: string;
35
+ text: string;
36
+ secondaryText: string;
37
+ border: string;
38
+ background: string;
39
+ inputBackground: string;
40
+ success?: string;
41
+ }
42
+
43
+ export interface FeedbackStepAnimations {
44
+ fadeAnim: Animated.Value;
45
+ slideAnim: Animated.Value;
46
+ }
47
+
48
+ export interface User {
49
+ id?: string;
50
+ email?: string;
51
+ username?: string;
52
+ }
@@ -0,0 +1,44 @@
1
+ import { useState, useCallback } from 'react';
2
+ import type { FeedbackData, FeedbackState } from './types';
3
+
4
+ export const useFeedbackForm = () => {
5
+ const [feedbackData, setFeedbackData] = useState<FeedbackData>({
6
+ type: 'general',
7
+ title: '',
8
+ description: '',
9
+ priority: 'medium',
10
+ category: '',
11
+ contactEmail: '',
12
+ systemInfo: true,
13
+ });
14
+
15
+ const [feedbackState, setFeedbackState] = useState<FeedbackState>({
16
+ status: 'idle',
17
+ message: ''
18
+ });
19
+
20
+ const updateField = useCallback(<K extends keyof FeedbackData>(field: K, value: FeedbackData[K]) => {
21
+ setFeedbackData(prev => ({ ...prev, [field]: value }));
22
+ }, []);
23
+
24
+ const resetForm = useCallback(() => {
25
+ setFeedbackData({
26
+ type: 'general',
27
+ title: '',
28
+ description: '',
29
+ priority: 'medium',
30
+ category: '',
31
+ contactEmail: '',
32
+ systemInfo: true,
33
+ });
34
+ setFeedbackState({ status: 'idle', message: '' });
35
+ }, []);
36
+
37
+ return {
38
+ feedbackData,
39
+ feedbackState,
40
+ setFeedbackState,
41
+ updateField,
42
+ resetForm
43
+ };
44
+ };
@@ -0,0 +1,294 @@
1
+ import React, { useState, useCallback } from 'react';
2
+ import {
3
+ View,
4
+ Text,
5
+ TextInput,
6
+ TouchableOpacity,
7
+ StyleSheet,
8
+ Modal,
9
+ ActivityIndicator,
10
+ KeyboardAvoidingView,
11
+ Platform,
12
+ } from 'react-native';
13
+ import OxyIcon from '../icon/OxyIcon';
14
+
15
+ interface DeleteAccountModalProps {
16
+ visible: boolean;
17
+ username: string;
18
+ onClose: () => void;
19
+ onDelete: (password: string) => Promise<void>;
20
+ colors: {
21
+ background: string;
22
+ text: string;
23
+ secondaryText: string;
24
+ border: string;
25
+ danger: string;
26
+ inputBackground: string;
27
+ };
28
+ t: (key: string, params?: Record<string, string>) => string | undefined;
29
+ }
30
+
31
+ const DeleteAccountModal: React.FC<DeleteAccountModalProps> = ({
32
+ visible,
33
+ username,
34
+ onClose,
35
+ onDelete,
36
+ colors,
37
+ t,
38
+ }) => {
39
+ const [password, setPassword] = useState('');
40
+ const [confirmUsername, setConfirmUsername] = useState('');
41
+ const [isDeleting, setIsDeleting] = useState(false);
42
+ const [error, setError] = useState<string | null>(null);
43
+ const [showPassword, setShowPassword] = useState(false);
44
+
45
+ const isValid = password.length > 0 && confirmUsername === username;
46
+
47
+ const handleDelete = useCallback(async () => {
48
+ if (!isValid) return;
49
+
50
+ setError(null);
51
+ setIsDeleting(true);
52
+
53
+ try {
54
+ await onDelete(password);
55
+ // Modal will be closed by parent on success
56
+ } catch (err: any) {
57
+ setError(err?.message || t('deleteAccount.error') || 'Failed to delete account');
58
+ } finally {
59
+ setIsDeleting(false);
60
+ }
61
+ }, [isValid, password, onDelete, t]);
62
+
63
+ const handleClose = useCallback(() => {
64
+ if (isDeleting) return;
65
+ setPassword('');
66
+ setConfirmUsername('');
67
+ setError(null);
68
+ onClose();
69
+ }, [isDeleting, onClose]);
70
+
71
+ return (
72
+ <Modal
73
+ visible={visible}
74
+ transparent
75
+ animationType="fade"
76
+ onRequestClose={handleClose}
77
+ >
78
+ <KeyboardAvoidingView
79
+ behavior={Platform.OS === 'ios' ? 'padding' : 'height'}
80
+ style={styles.overlay}
81
+ >
82
+ <TouchableOpacity
83
+ style={styles.backdrop}
84
+ activeOpacity={1}
85
+ onPress={handleClose}
86
+ />
87
+ <View style={[styles.modal, { backgroundColor: colors.background }]}>
88
+ <View style={styles.header}>
89
+ <OxyIcon name="alert" size={32} color={colors.danger} />
90
+ <Text style={[styles.title, { color: colors.danger }]}>
91
+ {t('deleteAccount.title') || 'Delete Account'}
92
+ </Text>
93
+ </View>
94
+
95
+ <Text style={[styles.warning, { color: colors.text }]}>
96
+ {t('deleteAccount.warning') || 'This action cannot be undone. Your account and all associated data will be permanently deleted.'}
97
+ </Text>
98
+
99
+ {error && (
100
+ <View style={[styles.errorContainer, { backgroundColor: colors.danger + '20' }]}>
101
+ <Text style={[styles.errorText, { color: colors.danger }]}>
102
+ {error}
103
+ </Text>
104
+ </View>
105
+ )}
106
+
107
+ <View style={styles.inputGroup}>
108
+ <Text style={[styles.label, { color: colors.secondaryText }]}>
109
+ {t('deleteAccount.passwordLabel') || 'Enter your password'}
110
+ </Text>
111
+ <View style={[styles.inputContainer, { borderColor: colors.border, backgroundColor: colors.inputBackground }]}>
112
+ <TextInput
113
+ style={[styles.input, { color: colors.text }]}
114
+ value={password}
115
+ onChangeText={setPassword}
116
+ placeholder={t('deleteAccount.passwordPlaceholder') || 'Password'}
117
+ placeholderTextColor={colors.secondaryText}
118
+ secureTextEntry={!showPassword}
119
+ autoCapitalize="none"
120
+ editable={!isDeleting}
121
+ />
122
+ <TouchableOpacity
123
+ onPress={() => setShowPassword(!showPassword)}
124
+ style={styles.eyeButton}
125
+ >
126
+ <OxyIcon
127
+ name={showPassword ? 'eye-off' : 'eye'}
128
+ size={20}
129
+ color={colors.secondaryText}
130
+ />
131
+ </TouchableOpacity>
132
+ </View>
133
+ </View>
134
+
135
+ <View style={styles.inputGroup}>
136
+ <Text style={[styles.label, { color: colors.secondaryText }]}>
137
+ {t('deleteAccount.confirmLabel', { username }) || `Type "${username}" to confirm`}
138
+ </Text>
139
+ <TextInput
140
+ style={[
141
+ styles.input,
142
+ styles.confirmInput,
143
+ {
144
+ borderColor: confirmUsername === username ? '#34C759' : colors.border,
145
+ backgroundColor: colors.inputBackground,
146
+ color: colors.text,
147
+ },
148
+ ]}
149
+ value={confirmUsername}
150
+ onChangeText={setConfirmUsername}
151
+ placeholder={username}
152
+ placeholderTextColor={colors.secondaryText}
153
+ autoCapitalize="none"
154
+ autoCorrect={false}
155
+ editable={!isDeleting}
156
+ />
157
+ </View>
158
+
159
+ <View style={styles.buttons}>
160
+ <TouchableOpacity
161
+ style={[styles.button, styles.cancelButton, { borderColor: colors.border }]}
162
+ onPress={handleClose}
163
+ disabled={isDeleting}
164
+ >
165
+ <Text style={[styles.buttonText, { color: colors.text }]}>
166
+ {t('common.cancel') || 'Cancel'}
167
+ </Text>
168
+ </TouchableOpacity>
169
+
170
+ <TouchableOpacity
171
+ style={[
172
+ styles.button,
173
+ styles.deleteButton,
174
+ { backgroundColor: isValid ? colors.danger : colors.danger + '50' },
175
+ ]}
176
+ onPress={handleDelete}
177
+ disabled={!isValid || isDeleting}
178
+ >
179
+ {isDeleting ? (
180
+ <ActivityIndicator color="#fff" size="small" />
181
+ ) : (
182
+ <Text style={styles.deleteButtonText}>
183
+ {t('deleteAccount.confirm') || 'Delete Forever'}
184
+ </Text>
185
+ )}
186
+ </TouchableOpacity>
187
+ </View>
188
+ </View>
189
+ </KeyboardAvoidingView>
190
+ </Modal>
191
+ );
192
+ };
193
+
194
+ const styles = StyleSheet.create({
195
+ overlay: {
196
+ flex: 1,
197
+ justifyContent: 'center',
198
+ alignItems: 'center',
199
+ },
200
+ backdrop: {
201
+ ...StyleSheet.absoluteFillObject,
202
+ backgroundColor: 'rgba(0, 0, 0, 0.5)',
203
+ },
204
+ modal: {
205
+ width: '90%',
206
+ maxWidth: 400,
207
+ borderRadius: 16,
208
+ padding: 24,
209
+ shadowColor: '#000',
210
+ shadowOffset: { width: 0, height: 4 },
211
+ shadowOpacity: 0.3,
212
+ shadowRadius: 8,
213
+ elevation: 8,
214
+ },
215
+ header: {
216
+ flexDirection: 'row',
217
+ alignItems: 'center',
218
+ marginBottom: 16,
219
+ gap: 12,
220
+ },
221
+ title: {
222
+ fontSize: 20,
223
+ fontWeight: '700',
224
+ },
225
+ warning: {
226
+ fontSize: 14,
227
+ lineHeight: 20,
228
+ marginBottom: 20,
229
+ },
230
+ errorContainer: {
231
+ padding: 12,
232
+ borderRadius: 8,
233
+ marginBottom: 16,
234
+ },
235
+ errorText: {
236
+ fontSize: 14,
237
+ textAlign: 'center',
238
+ },
239
+ inputGroup: {
240
+ marginBottom: 16,
241
+ },
242
+ label: {
243
+ fontSize: 13,
244
+ marginBottom: 8,
245
+ },
246
+ inputContainer: {
247
+ flexDirection: 'row',
248
+ alignItems: 'center',
249
+ borderWidth: 1,
250
+ borderRadius: 8,
251
+ },
252
+ input: {
253
+ flex: 1,
254
+ fontSize: 16,
255
+ paddingVertical: 12,
256
+ paddingHorizontal: 16,
257
+ },
258
+ confirmInput: {
259
+ borderWidth: 1,
260
+ borderRadius: 8,
261
+ },
262
+ eyeButton: {
263
+ padding: 12,
264
+ },
265
+ buttons: {
266
+ flexDirection: 'row',
267
+ gap: 12,
268
+ marginTop: 8,
269
+ },
270
+ button: {
271
+ flex: 1,
272
+ paddingVertical: 14,
273
+ borderRadius: 8,
274
+ alignItems: 'center',
275
+ justifyContent: 'center',
276
+ },
277
+ cancelButton: {
278
+ borderWidth: 1,
279
+ },
280
+ deleteButton: {
281
+ minHeight: 48,
282
+ },
283
+ buttonText: {
284
+ fontSize: 16,
285
+ fontWeight: '600',
286
+ },
287
+ deleteButtonText: {
288
+ fontSize: 16,
289
+ fontWeight: '600',
290
+ color: '#fff',
291
+ },
292
+ });
293
+
294
+ export default DeleteAccountModal;
@@ -0,0 +1 @@
1
+ export { default as DeleteAccountModal } from './DeleteAccountModal';