@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.
- package/lib/commonjs/core/mixins/OxyServices.features.js +372 -0
- package/lib/commonjs/core/mixins/OxyServices.features.js.map +1 -0
- package/lib/commonjs/core/mixins/index.js +3 -2
- package/lib/commonjs/core/mixins/index.js.map +1 -1
- package/lib/commonjs/ui/components/GroupedItem.js +11 -1
- package/lib/commonjs/ui/components/GroupedItem.js.map +1 -1
- package/lib/commonjs/ui/components/SettingRow.js +17 -4
- package/lib/commonjs/ui/components/SettingRow.js.map +1 -1
- package/lib/commonjs/ui/components/feedback/FormInput.js +72 -0
- package/lib/commonjs/ui/components/feedback/FormInput.js.map +1 -0
- package/lib/commonjs/ui/components/feedback/ProgressIndicator.js +33 -0
- package/lib/commonjs/ui/components/feedback/ProgressIndicator.js.map +1 -0
- package/lib/commonjs/ui/components/feedback/constants.js +59 -0
- package/lib/commonjs/ui/components/feedback/constants.js.map +1 -0
- package/lib/commonjs/ui/components/feedback/feedbackStyles.js +262 -0
- package/lib/commonjs/ui/components/feedback/feedbackStyles.js.map +1 -0
- package/lib/commonjs/ui/components/feedback/index.js +54 -0
- package/lib/commonjs/ui/components/feedback/index.js.map +1 -0
- package/lib/commonjs/ui/components/feedback/types.js +6 -0
- package/lib/commonjs/ui/components/feedback/types.js.map +1 -0
- package/lib/commonjs/ui/components/feedback/useFeedbackForm.js +52 -0
- package/lib/commonjs/ui/components/feedback/useFeedbackForm.js.map +1 -0
- package/lib/commonjs/ui/components/modals/DeleteAccountModal.js +282 -0
- package/lib/commonjs/ui/components/modals/DeleteAccountModal.js.map +1 -0
- package/lib/commonjs/ui/components/modals/index.js +14 -0
- package/lib/commonjs/ui/components/modals/index.js.map +1 -0
- package/lib/commonjs/ui/components/payment/PaymentDetailsStep.js +309 -0
- package/lib/commonjs/ui/components/payment/PaymentDetailsStep.js.map +1 -0
- package/lib/commonjs/ui/components/payment/PaymentMethodStep.js +79 -0
- package/lib/commonjs/ui/components/payment/PaymentMethodStep.js.map +1 -0
- package/lib/commonjs/ui/components/payment/PaymentReviewStep.js +108 -0
- package/lib/commonjs/ui/components/payment/PaymentReviewStep.js.map +1 -0
- package/lib/commonjs/ui/components/payment/PaymentSuccessStep.js +79 -0
- package/lib/commonjs/ui/components/payment/PaymentSuccessStep.js.map +1 -0
- package/lib/commonjs/ui/components/payment/PaymentSummaryStep.js +176 -0
- package/lib/commonjs/ui/components/payment/PaymentSummaryStep.js.map +1 -0
- package/lib/commonjs/ui/components/payment/constants.js +53 -0
- package/lib/commonjs/ui/components/payment/constants.js.map +1 -0
- package/lib/commonjs/ui/components/payment/index.js +80 -0
- package/lib/commonjs/ui/components/payment/index.js.map +1 -0
- package/lib/commonjs/ui/components/payment/paymentStyles.js +409 -0
- package/lib/commonjs/ui/components/payment/paymentStyles.js.map +1 -0
- package/lib/commonjs/ui/components/payment/types.js +6 -0
- package/lib/commonjs/ui/components/payment/types.js.map +1 -0
- package/lib/commonjs/ui/hooks/index.js +26 -0
- package/lib/commonjs/ui/hooks/index.js.map +1 -1
- package/lib/commonjs/ui/hooks/useAsyncAction.js +95 -0
- package/lib/commonjs/ui/hooks/useAsyncAction.js.map +1 -0
- package/lib/commonjs/ui/hooks/useSettingToggle.js +126 -0
- package/lib/commonjs/ui/hooks/useSettingToggle.js.map +1 -0
- package/lib/commonjs/ui/navigation/routes.js +1 -0
- package/lib/commonjs/ui/navigation/routes.js.map +1 -1
- package/lib/commonjs/ui/screens/AccountCenterScreen.js +4 -2
- package/lib/commonjs/ui/screens/AccountCenterScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/AccountOverviewScreen.js +33 -30
- package/lib/commonjs/ui/screens/AccountOverviewScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/FAQScreen.js +315 -0
- package/lib/commonjs/ui/screens/FAQScreen.js.map +1 -0
- package/lib/commonjs/ui/screens/FeedbackScreen.js +73 -590
- package/lib/commonjs/ui/screens/FeedbackScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/HelpSupportScreen.js +8 -7
- package/lib/commonjs/ui/screens/HelpSupportScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/PaymentGatewayScreen.js +67 -1395
- package/lib/commonjs/ui/screens/PaymentGatewayScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/ProfileScreen.js +13 -5
- package/lib/commonjs/ui/screens/ProfileScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/SavesCollectionsScreen.js +16 -10
- package/lib/commonjs/ui/screens/SavesCollectionsScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/karma/KarmaCenterScreen.js +23 -11
- package/lib/commonjs/ui/screens/karma/KarmaCenterScreen.js.map +1 -1
- package/lib/module/core/mixins/OxyServices.features.js +369 -0
- package/lib/module/core/mixins/OxyServices.features.js.map +1 -0
- package/lib/module/core/mixins/index.js +3 -2
- package/lib/module/core/mixins/index.js.map +1 -1
- package/lib/module/ui/components/GroupedItem.js +11 -1
- package/lib/module/ui/components/GroupedItem.js.map +1 -1
- package/lib/module/ui/components/SettingRow.js +17 -4
- package/lib/module/ui/components/SettingRow.js.map +1 -1
- package/lib/module/ui/components/feedback/FormInput.js +67 -0
- package/lib/module/ui/components/feedback/FormInput.js.map +1 -0
- package/lib/module/ui/components/feedback/ProgressIndicator.js +28 -0
- package/lib/module/ui/components/feedback/ProgressIndicator.js.map +1 -0
- package/lib/module/ui/components/feedback/constants.js +55 -0
- package/lib/module/ui/components/feedback/constants.js.map +1 -0
- package/lib/module/ui/components/feedback/feedbackStyles.js +257 -0
- package/lib/module/ui/components/feedback/feedbackStyles.js.map +1 -0
- package/lib/module/ui/components/feedback/index.js +8 -0
- package/lib/module/ui/components/feedback/index.js.map +1 -0
- package/lib/module/ui/components/feedback/types.js +4 -0
- package/lib/module/ui/components/feedback/types.js.map +1 -0
- package/lib/module/ui/components/feedback/useFeedbackForm.js +47 -0
- package/lib/module/ui/components/feedback/useFeedbackForm.js.map +1 -0
- package/lib/module/ui/components/modals/DeleteAccountModal.js +276 -0
- package/lib/module/ui/components/modals/DeleteAccountModal.js.map +1 -0
- package/lib/module/ui/components/modals/index.js +4 -0
- package/lib/module/ui/components/modals/index.js.map +1 -0
- package/lib/module/ui/components/payment/PaymentDetailsStep.js +303 -0
- package/lib/module/ui/components/payment/PaymentDetailsStep.js.map +1 -0
- package/lib/module/ui/components/payment/PaymentMethodStep.js +73 -0
- package/lib/module/ui/components/payment/PaymentMethodStep.js.map +1 -0
- package/lib/module/ui/components/payment/PaymentReviewStep.js +102 -0
- package/lib/module/ui/components/payment/PaymentReviewStep.js.map +1 -0
- package/lib/module/ui/components/payment/PaymentSuccessStep.js +73 -0
- package/lib/module/ui/components/payment/PaymentSuccessStep.js.map +1 -0
- package/lib/module/ui/components/payment/PaymentSummaryStep.js +170 -0
- package/lib/module/ui/components/payment/PaymentSummaryStep.js.map +1 -0
- package/lib/module/ui/components/payment/constants.js +47 -0
- package/lib/module/ui/components/payment/constants.js.map +1 -0
- package/lib/module/ui/components/payment/index.js +10 -0
- package/lib/module/ui/components/payment/index.js.map +1 -0
- package/lib/module/ui/components/payment/paymentStyles.js +404 -0
- package/lib/module/ui/components/payment/paymentStyles.js.map +1 -0
- package/lib/module/ui/components/payment/types.js +4 -0
- package/lib/module/ui/components/payment/types.js.map +1 -0
- package/lib/module/ui/hooks/index.js +2 -0
- package/lib/module/ui/hooks/index.js.map +1 -1
- package/lib/module/ui/hooks/useAsyncAction.js +89 -0
- package/lib/module/ui/hooks/useAsyncAction.js.map +1 -0
- package/lib/module/ui/hooks/useSettingToggle.js +120 -0
- package/lib/module/ui/hooks/useSettingToggle.js.map +1 -0
- package/lib/module/ui/navigation/routes.js +1 -0
- package/lib/module/ui/navigation/routes.js.map +1 -1
- package/lib/module/ui/screens/AccountCenterScreen.js +4 -2
- package/lib/module/ui/screens/AccountCenterScreen.js.map +1 -1
- package/lib/module/ui/screens/AccountOverviewScreen.js +33 -30
- package/lib/module/ui/screens/AccountOverviewScreen.js.map +1 -1
- package/lib/module/ui/screens/FAQScreen.js +310 -0
- package/lib/module/ui/screens/FAQScreen.js.map +1 -0
- package/lib/module/ui/screens/FeedbackScreen.js +64 -581
- package/lib/module/ui/screens/FeedbackScreen.js.map +1 -1
- package/lib/module/ui/screens/HelpSupportScreen.js +8 -7
- package/lib/module/ui/screens/HelpSupportScreen.js.map +1 -1
- package/lib/module/ui/screens/PaymentGatewayScreen.js +67 -1397
- package/lib/module/ui/screens/PaymentGatewayScreen.js.map +1 -1
- package/lib/module/ui/screens/ProfileScreen.js +13 -5
- package/lib/module/ui/screens/ProfileScreen.js.map +1 -1
- package/lib/module/ui/screens/SavesCollectionsScreen.js +16 -10
- package/lib/module/ui/screens/SavesCollectionsScreen.js.map +1 -1
- package/lib/module/ui/screens/karma/KarmaCenterScreen.js +23 -11
- package/lib/module/ui/screens/karma/KarmaCenterScreen.js.map +1 -1
- package/lib/typescript/core/mixins/OxyServices.features.d.ts +229 -0
- package/lib/typescript/core/mixins/OxyServices.features.d.ts.map +1 -0
- package/lib/typescript/core/mixins/index.d.ts +71 -1
- package/lib/typescript/core/mixins/index.d.ts.map +1 -1
- package/lib/typescript/ui/components/GroupedItem.d.ts +5 -1
- package/lib/typescript/ui/components/GroupedItem.d.ts.map +1 -1
- package/lib/typescript/ui/components/SettingRow.d.ts +6 -0
- package/lib/typescript/ui/components/SettingRow.d.ts.map +1 -1
- package/lib/typescript/ui/components/feedback/FormInput.d.ts +20 -0
- package/lib/typescript/ui/components/feedback/FormInput.d.ts.map +1 -0
- package/lib/typescript/ui/components/feedback/ProgressIndicator.d.ts +11 -0
- package/lib/typescript/ui/components/feedback/ProgressIndicator.d.ts.map +1 -0
- package/lib/typescript/ui/components/feedback/constants.d.ts +5 -0
- package/lib/typescript/ui/components/feedback/constants.d.ts.map +1 -0
- package/lib/typescript/ui/components/feedback/feedbackStyles.d.ts +280 -0
- package/lib/typescript/ui/components/feedback/feedbackStyles.d.ts.map +1 -0
- package/lib/typescript/ui/components/feedback/index.d.ts +7 -0
- package/lib/typescript/ui/components/feedback/index.d.ts.map +1 -0
- package/lib/typescript/ui/components/feedback/types.d.ts +46 -0
- package/lib/typescript/ui/components/feedback/types.d.ts.map +1 -0
- package/lib/typescript/ui/components/feedback/useFeedbackForm.d.ts +9 -0
- package/lib/typescript/ui/components/feedback/useFeedbackForm.d.ts.map +1 -0
- package/lib/typescript/ui/components/modals/DeleteAccountModal.d.ts +19 -0
- package/lib/typescript/ui/components/modals/DeleteAccountModal.d.ts.map +1 -0
- package/lib/typescript/ui/components/modals/index.d.ts +2 -0
- package/lib/typescript/ui/components/modals/index.d.ts.map +1 -0
- package/lib/typescript/ui/components/payment/PaymentDetailsStep.d.ts +21 -0
- package/lib/typescript/ui/components/payment/PaymentDetailsStep.d.ts.map +1 -0
- package/lib/typescript/ui/components/payment/PaymentMethodStep.d.ts +14 -0
- package/lib/typescript/ui/components/payment/PaymentMethodStep.d.ts.map +1 -0
- package/lib/typescript/ui/components/payment/PaymentReviewStep.d.ts +16 -0
- package/lib/typescript/ui/components/payment/PaymentReviewStep.d.ts.map +1 -0
- package/lib/typescript/ui/components/payment/PaymentSuccessStep.d.ts +10 -0
- package/lib/typescript/ui/components/payment/PaymentSuccessStep.d.ts.map +1 -0
- package/lib/typescript/ui/components/payment/PaymentSummaryStep.d.ts +15 -0
- package/lib/typescript/ui/components/payment/PaymentSummaryStep.d.ts.map +1 -0
- package/lib/typescript/ui/components/payment/constants.d.ts +7 -0
- package/lib/typescript/ui/components/payment/constants.d.ts.map +1 -0
- package/lib/typescript/ui/components/payment/index.d.ts +9 -0
- package/lib/typescript/ui/components/payment/index.d.ts.map +1 -0
- package/lib/typescript/ui/components/payment/paymentStyles.d.ts +396 -0
- package/lib/typescript/ui/components/payment/paymentStyles.d.ts.map +1 -0
- package/lib/typescript/ui/components/payment/types.d.ts +40 -0
- package/lib/typescript/ui/components/payment/types.d.ts.map +1 -0
- package/lib/typescript/ui/hooks/index.d.ts +2 -0
- package/lib/typescript/ui/hooks/index.d.ts.map +1 -1
- package/lib/typescript/ui/hooks/useAsyncAction.d.ts +51 -0
- package/lib/typescript/ui/hooks/useAsyncAction.d.ts.map +1 -0
- package/lib/typescript/ui/hooks/useSettingToggle.d.ts +55 -0
- package/lib/typescript/ui/hooks/useSettingToggle.d.ts.map +1 -0
- package/lib/typescript/ui/navigation/routes.d.ts +1 -1
- package/lib/typescript/ui/navigation/routes.d.ts.map +1 -1
- package/lib/typescript/ui/screens/AccountOverviewScreen.d.ts.map +1 -1
- package/lib/typescript/ui/screens/FAQScreen.d.ts +5 -0
- package/lib/typescript/ui/screens/FAQScreen.d.ts.map +1 -0
- package/lib/typescript/ui/screens/FeedbackScreen.d.ts.map +1 -1
- package/lib/typescript/ui/screens/HelpSupportScreen.d.ts.map +1 -1
- package/lib/typescript/ui/screens/PaymentGatewayScreen.d.ts +3 -15
- package/lib/typescript/ui/screens/PaymentGatewayScreen.d.ts.map +1 -1
- package/lib/typescript/ui/screens/ProfileScreen.d.ts.map +1 -1
- package/lib/typescript/ui/screens/SavesCollectionsScreen.d.ts.map +1 -1
- package/lib/typescript/ui/screens/karma/KarmaCenterScreen.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/core/mixins/OxyServices.features.ts +428 -0
- package/src/core/mixins/index.ts +20 -17
- package/src/ui/components/GroupedItem.tsx +19 -1
- package/src/ui/components/SettingRow.tsx +26 -4
- package/src/ui/components/feedback/FormInput.tsx +84 -0
- package/src/ui/components/feedback/ProgressIndicator.tsx +35 -0
- package/src/ui/components/feedback/constants.ts +22 -0
- package/src/ui/components/feedback/feedbackStyles.ts +247 -0
- package/src/ui/components/feedback/index.ts +6 -0
- package/src/ui/components/feedback/types.ts +52 -0
- package/src/ui/components/feedback/useFeedbackForm.ts +44 -0
- package/src/ui/components/modals/DeleteAccountModal.tsx +294 -0
- package/src/ui/components/modals/index.ts +1 -0
- package/src/ui/components/payment/PaymentDetailsStep.tsx +222 -0
- package/src/ui/components/payment/PaymentMethodStep.tsx +89 -0
- package/src/ui/components/payment/PaymentReviewStep.tsx +126 -0
- package/src/ui/components/payment/PaymentSuccessStep.tsx +71 -0
- package/src/ui/components/payment/PaymentSummaryStep.tsx +159 -0
- package/src/ui/components/payment/constants.ts +39 -0
- package/src/ui/components/payment/index.ts +9 -0
- package/src/ui/components/payment/paymentStyles.ts +397 -0
- package/src/ui/components/payment/types.ts +45 -0
- package/src/ui/hooks/index.ts +3 -1
- package/src/ui/hooks/useAsyncAction.ts +129 -0
- package/src/ui/hooks/useSettingToggle.ts +147 -0
- package/src/ui/navigation/routes.ts +2 -0
- package/src/ui/screens/AccountCenterScreen.tsx +2 -2
- package/src/ui/screens/AccountOverviewScreen.tsx +35 -37
- package/src/ui/screens/FAQScreen.tsx +332 -0
- package/src/ui/screens/FeedbackScreen.tsx +91 -626
- package/src/ui/screens/HelpSupportScreen.tsx +7 -5
- package/src/ui/screens/PaymentGatewayScreen.tsx +96 -1275
- package/src/ui/screens/ProfileScreen.tsx +11 -6
- package/src/ui/screens/SavesCollectionsScreen.tsx +19 -10
- package/src/ui/screens/karma/KarmaCenterScreen.tsx +10 -10
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
import React, { useState, useRef, useCallback, useMemo } from 'react';
|
|
4
|
-
import { View, Text,
|
|
4
|
+
import { View, Text, TouchableOpacity, ActivityIndicator, Platform, KeyboardAvoidingView, ScrollView, Animated, StatusBar } from 'react-native';
|
|
5
5
|
import { useThemeColors } from '../styles';
|
|
6
6
|
import { normalizeTheme } from '../utils/themeUtils';
|
|
7
7
|
import { Ionicons } from '@expo/vector-icons';
|
|
@@ -10,514 +10,14 @@ import { packageInfo } from '../../constants/version';
|
|
|
10
10
|
import { GroupedSection } from '../components';
|
|
11
11
|
import { useI18n } from '../hooks/useI18n';
|
|
12
12
|
import { useOxy } from '../context/OxyContext';
|
|
13
|
-
import {
|
|
14
|
-
|
|
15
|
-
// Types for better type safety
|
|
13
|
+
import { FormInput, ProgressIndicator, useFeedbackForm, createFeedbackStyles, FEEDBACK_TYPES, PRIORITY_LEVELS, CATEGORIES } from '../components/feedback';
|
|
16
14
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
17
|
-
// Constants
|
|
18
|
-
const FEEDBACK_TYPES = [{
|
|
19
|
-
id: 'bug',
|
|
20
|
-
label: 'Bug Report',
|
|
21
|
-
icon: 'bug',
|
|
22
|
-
color: '#FF3B30',
|
|
23
|
-
description: 'Report a problem or issue'
|
|
24
|
-
}, {
|
|
25
|
-
id: 'feature',
|
|
26
|
-
label: 'Feature Request',
|
|
27
|
-
icon: 'bulb',
|
|
28
|
-
color: '#007AFF',
|
|
29
|
-
description: 'Suggest a new feature'
|
|
30
|
-
}, {
|
|
31
|
-
id: 'general',
|
|
32
|
-
label: 'General Feedback',
|
|
33
|
-
icon: 'chatbubble',
|
|
34
|
-
color: '#34C759',
|
|
35
|
-
description: 'Share your thoughts'
|
|
36
|
-
}, {
|
|
37
|
-
id: 'support',
|
|
38
|
-
label: 'Support Request',
|
|
39
|
-
icon: 'help-circle',
|
|
40
|
-
color: '#FF9500',
|
|
41
|
-
description: 'Get help with something'
|
|
42
|
-
}];
|
|
43
|
-
const PRIORITY_LEVELS = [{
|
|
44
|
-
id: 'low',
|
|
45
|
-
label: 'Low',
|
|
46
|
-
icon: 'arrow-down',
|
|
47
|
-
color: '#34C759'
|
|
48
|
-
}, {
|
|
49
|
-
id: 'medium',
|
|
50
|
-
label: 'Medium',
|
|
51
|
-
icon: 'remove',
|
|
52
|
-
color: '#FF9500'
|
|
53
|
-
}, {
|
|
54
|
-
id: 'high',
|
|
55
|
-
label: 'High',
|
|
56
|
-
icon: 'arrow-up',
|
|
57
|
-
color: '#FF3B30'
|
|
58
|
-
}, {
|
|
59
|
-
id: 'critical',
|
|
60
|
-
label: 'Critical',
|
|
61
|
-
icon: 'warning',
|
|
62
|
-
color: '#FF0000'
|
|
63
|
-
}];
|
|
64
|
-
const CATEGORIES = {
|
|
65
|
-
bug: ['UI/UX', 'Performance', 'Authentication', 'File Management', 'Billing', 'Other'],
|
|
66
|
-
feature: ['User Interface', 'File Management', 'Security', 'Performance', 'Integration', 'Other'],
|
|
67
|
-
general: ['User Experience', 'Design', 'Performance', 'Documentation', 'Other'],
|
|
68
|
-
support: ['Account Issues', 'Billing', 'Technical Problems', 'Feature Questions', 'Other']
|
|
69
|
-
};
|
|
70
|
-
|
|
71
|
-
// Styles factory function
|
|
72
|
-
const createStyles = (colors, theme) => StyleSheet.create({
|
|
73
|
-
container: {
|
|
74
|
-
flex: 1
|
|
75
|
-
},
|
|
76
|
-
fullBleed: {
|
|
77
|
-
width: '100%',
|
|
78
|
-
alignSelf: 'stretch'
|
|
79
|
-
},
|
|
80
|
-
scrollContent: {
|
|
81
|
-
flexGrow: 1,
|
|
82
|
-
...screenContentStyle
|
|
83
|
-
},
|
|
84
|
-
stepContainer: {
|
|
85
|
-
flex: 1,
|
|
86
|
-
justifyContent: 'flex-start',
|
|
87
|
-
alignItems: 'flex-start'
|
|
88
|
-
},
|
|
89
|
-
modernHeader: {
|
|
90
|
-
alignItems: 'flex-start',
|
|
91
|
-
width: '100%',
|
|
92
|
-
marginBottom: 24
|
|
93
|
-
},
|
|
94
|
-
modernTitle: {
|
|
95
|
-
fontFamily: Platform.OS === 'web' ? 'Phudu' : 'Phudu-Bold',
|
|
96
|
-
fontWeight: Platform.OS === 'web' ? 'bold' : undefined,
|
|
97
|
-
fontSize: 42,
|
|
98
|
-
lineHeight: 48,
|
|
99
|
-
marginBottom: 12,
|
|
100
|
-
textAlign: 'left',
|
|
101
|
-
letterSpacing: -1
|
|
102
|
-
},
|
|
103
|
-
modernSubtitle: {
|
|
104
|
-
fontSize: 18,
|
|
105
|
-
lineHeight: 24,
|
|
106
|
-
textAlign: 'left',
|
|
107
|
-
opacity: 0.8,
|
|
108
|
-
marginBottom: 24
|
|
109
|
-
},
|
|
110
|
-
stepTitle: {
|
|
111
|
-
fontFamily: Platform.OS === 'web' ? 'Phudu' : 'Phudu-Bold',
|
|
112
|
-
fontWeight: Platform.OS === 'web' ? 'bold' : undefined,
|
|
113
|
-
fontSize: 42,
|
|
114
|
-
lineHeight: 48,
|
|
115
|
-
marginBottom: 12,
|
|
116
|
-
textAlign: 'left',
|
|
117
|
-
letterSpacing: -1
|
|
118
|
-
},
|
|
119
|
-
inputContainer: {
|
|
120
|
-
width: '100%',
|
|
121
|
-
marginBottom: 24
|
|
122
|
-
},
|
|
123
|
-
premiumInputWrapper: {
|
|
124
|
-
flexDirection: 'row',
|
|
125
|
-
alignItems: 'center',
|
|
126
|
-
height: 56,
|
|
127
|
-
borderRadius: 16,
|
|
128
|
-
paddingHorizontal: 20,
|
|
129
|
-
borderWidth: 2,
|
|
130
|
-
backgroundColor: colors.inputBackground
|
|
131
|
-
},
|
|
132
|
-
textAreaWrapper: {
|
|
133
|
-
flexDirection: 'column',
|
|
134
|
-
alignItems: 'flex-start',
|
|
135
|
-
minHeight: 120,
|
|
136
|
-
borderRadius: 16,
|
|
137
|
-
paddingHorizontal: 20,
|
|
138
|
-
paddingVertical: 16,
|
|
139
|
-
borderWidth: 2,
|
|
140
|
-
backgroundColor: colors.inputBackground
|
|
141
|
-
},
|
|
142
|
-
inputIcon: {
|
|
143
|
-
marginRight: 12
|
|
144
|
-
},
|
|
145
|
-
inputContent: {
|
|
146
|
-
flex: 1
|
|
147
|
-
},
|
|
148
|
-
modernLabel: {
|
|
149
|
-
fontSize: 12,
|
|
150
|
-
fontWeight: '500',
|
|
151
|
-
marginBottom: 2
|
|
152
|
-
},
|
|
153
|
-
modernInput: {
|
|
154
|
-
flex: 1,
|
|
155
|
-
fontSize: 16,
|
|
156
|
-
height: '100%'
|
|
157
|
-
},
|
|
158
|
-
textArea: {
|
|
159
|
-
flex: 1,
|
|
160
|
-
fontSize: 16,
|
|
161
|
-
textAlignVertical: 'top',
|
|
162
|
-
minHeight: 80
|
|
163
|
-
},
|
|
164
|
-
typeGrid: {
|
|
165
|
-
flexDirection: 'row',
|
|
166
|
-
flexWrap: 'wrap',
|
|
167
|
-
gap: 12,
|
|
168
|
-
marginBottom: 24
|
|
169
|
-
},
|
|
170
|
-
typeCard: {
|
|
171
|
-
width: (Dimensions.get('window').width - 72) / 2,
|
|
172
|
-
padding: 20,
|
|
173
|
-
borderRadius: 16,
|
|
174
|
-
borderWidth: 2,
|
|
175
|
-
alignItems: 'center',
|
|
176
|
-
justifyContent: 'center',
|
|
177
|
-
minHeight: 120
|
|
178
|
-
},
|
|
179
|
-
typeIcon: {
|
|
180
|
-
marginBottom: 12
|
|
181
|
-
},
|
|
182
|
-
typeLabel: {
|
|
183
|
-
fontSize: 16,
|
|
184
|
-
fontWeight: '600',
|
|
185
|
-
textAlign: 'center',
|
|
186
|
-
marginBottom: 4
|
|
187
|
-
},
|
|
188
|
-
typeDescription: {
|
|
189
|
-
fontSize: 12,
|
|
190
|
-
textAlign: 'center',
|
|
191
|
-
opacity: 0.8
|
|
192
|
-
},
|
|
193
|
-
priorityContainer: {
|
|
194
|
-
flexDirection: 'row',
|
|
195
|
-
justifyContent: 'space-between',
|
|
196
|
-
marginBottom: 24
|
|
197
|
-
},
|
|
198
|
-
priorityButton: {
|
|
199
|
-
flex: 1,
|
|
200
|
-
padding: 16,
|
|
201
|
-
borderRadius: 12,
|
|
202
|
-
borderWidth: 2,
|
|
203
|
-
alignItems: 'center',
|
|
204
|
-
marginHorizontal: 4
|
|
205
|
-
},
|
|
206
|
-
priorityLabel: {
|
|
207
|
-
fontSize: 12,
|
|
208
|
-
fontWeight: '600',
|
|
209
|
-
marginTop: 4
|
|
210
|
-
},
|
|
211
|
-
categoryContainer: {
|
|
212
|
-
marginBottom: 24
|
|
213
|
-
},
|
|
214
|
-
categoryButton: {
|
|
215
|
-
flexDirection: 'row',
|
|
216
|
-
alignItems: 'center',
|
|
217
|
-
paddingVertical: 12,
|
|
218
|
-
paddingHorizontal: 16,
|
|
219
|
-
borderRadius: 12,
|
|
220
|
-
borderWidth: 1,
|
|
221
|
-
marginBottom: 8
|
|
222
|
-
},
|
|
223
|
-
categoryText: {
|
|
224
|
-
fontSize: 16,
|
|
225
|
-
marginLeft: 12
|
|
226
|
-
},
|
|
227
|
-
checkboxContainer: {
|
|
228
|
-
flexDirection: 'row',
|
|
229
|
-
alignItems: 'center',
|
|
230
|
-
marginBottom: 24
|
|
231
|
-
},
|
|
232
|
-
checkbox: {
|
|
233
|
-
width: 24,
|
|
234
|
-
height: 24,
|
|
235
|
-
borderRadius: 6,
|
|
236
|
-
borderWidth: 2,
|
|
237
|
-
marginRight: 12,
|
|
238
|
-
alignItems: 'center',
|
|
239
|
-
justifyContent: 'center'
|
|
240
|
-
},
|
|
241
|
-
checkboxText: {
|
|
242
|
-
fontSize: 16,
|
|
243
|
-
flex: 1
|
|
244
|
-
},
|
|
245
|
-
button: {
|
|
246
|
-
flexDirection: 'row',
|
|
247
|
-
alignItems: 'center',
|
|
248
|
-
justifyContent: 'center',
|
|
249
|
-
paddingVertical: 18,
|
|
250
|
-
paddingHorizontal: 32,
|
|
251
|
-
borderRadius: 16,
|
|
252
|
-
marginVertical: 8,
|
|
253
|
-
gap: 8,
|
|
254
|
-
width: '100%',
|
|
255
|
-
...Platform.select({
|
|
256
|
-
web: {
|
|
257
|
-
boxShadow: '0 4px 8px rgba(0,0,0,0.3)'
|
|
258
|
-
},
|
|
259
|
-
default: {
|
|
260
|
-
shadowOffset: {
|
|
261
|
-
width: 0,
|
|
262
|
-
height: 4
|
|
263
|
-
},
|
|
264
|
-
shadowOpacity: 0.3,
|
|
265
|
-
shadowRadius: 8,
|
|
266
|
-
elevation: 6
|
|
267
|
-
}
|
|
268
|
-
})
|
|
269
|
-
},
|
|
270
|
-
buttonText: {
|
|
271
|
-
color: '#FFFFFF',
|
|
272
|
-
fontSize: 16,
|
|
273
|
-
fontWeight: '600',
|
|
274
|
-
letterSpacing: 0.5
|
|
275
|
-
},
|
|
276
|
-
navigationButtons: {
|
|
277
|
-
flexDirection: 'row',
|
|
278
|
-
justifyContent: 'center',
|
|
279
|
-
marginTop: 16,
|
|
280
|
-
marginBottom: 8,
|
|
281
|
-
width: '100%',
|
|
282
|
-
gap: 8
|
|
283
|
-
},
|
|
284
|
-
navButton: {
|
|
285
|
-
flexDirection: 'row',
|
|
286
|
-
alignItems: 'center',
|
|
287
|
-
paddingVertical: 6,
|
|
288
|
-
paddingHorizontal: 12,
|
|
289
|
-
gap: 6,
|
|
290
|
-
minWidth: 70,
|
|
291
|
-
borderWidth: 1,
|
|
292
|
-
...Platform.select({
|
|
293
|
-
web: {
|
|
294
|
-
boxShadow: '0 2px 4px rgba(0,0,0,0.1)'
|
|
295
|
-
},
|
|
296
|
-
default: {
|
|
297
|
-
shadowOffset: {
|
|
298
|
-
width: 0,
|
|
299
|
-
height: 2
|
|
300
|
-
},
|
|
301
|
-
shadowOpacity: 0.1,
|
|
302
|
-
shadowRadius: 4,
|
|
303
|
-
elevation: 2
|
|
304
|
-
}
|
|
305
|
-
})
|
|
306
|
-
},
|
|
307
|
-
backButton: {
|
|
308
|
-
backgroundColor: 'transparent',
|
|
309
|
-
borderTopLeftRadius: 35,
|
|
310
|
-
borderBottomLeftRadius: 35,
|
|
311
|
-
borderTopRightRadius: 12,
|
|
312
|
-
borderBottomRightRadius: 12
|
|
313
|
-
},
|
|
314
|
-
nextButton: {
|
|
315
|
-
backgroundColor: 'transparent',
|
|
316
|
-
borderTopRightRadius: 35,
|
|
317
|
-
borderBottomRightRadius: 35,
|
|
318
|
-
borderTopLeftRadius: 12,
|
|
319
|
-
borderBottomLeftRadius: 12
|
|
320
|
-
},
|
|
321
|
-
navButtonText: {
|
|
322
|
-
fontSize: 13,
|
|
323
|
-
fontWeight: '500'
|
|
324
|
-
},
|
|
325
|
-
progressContainer: {
|
|
326
|
-
flexDirection: 'row',
|
|
327
|
-
justifyContent: 'center',
|
|
328
|
-
marginBottom: 20,
|
|
329
|
-
marginTop: 8
|
|
330
|
-
},
|
|
331
|
-
progressDot: {
|
|
332
|
-
height: 10,
|
|
333
|
-
width: 10,
|
|
334
|
-
borderRadius: 5,
|
|
335
|
-
marginHorizontal: 6,
|
|
336
|
-
borderWidth: 2,
|
|
337
|
-
borderColor: '#fff',
|
|
338
|
-
...Platform.select({
|
|
339
|
-
web: {
|
|
340
|
-
boxShadow: '0 1px 2px rgba(0,0,0,0.08)'
|
|
341
|
-
},
|
|
342
|
-
default: {
|
|
343
|
-
shadowColor: colors.primary,
|
|
344
|
-
shadowOpacity: 0.08,
|
|
345
|
-
shadowOffset: {
|
|
346
|
-
width: 0,
|
|
347
|
-
height: 1
|
|
348
|
-
},
|
|
349
|
-
shadowRadius: 2,
|
|
350
|
-
elevation: 1
|
|
351
|
-
}
|
|
352
|
-
})
|
|
353
|
-
},
|
|
354
|
-
summaryContainer: {
|
|
355
|
-
padding: 0,
|
|
356
|
-
marginBottom: 24,
|
|
357
|
-
width: '100%'
|
|
358
|
-
},
|
|
359
|
-
summaryRow: {
|
|
360
|
-
flexDirection: 'row',
|
|
361
|
-
marginBottom: 10
|
|
362
|
-
},
|
|
363
|
-
summaryLabel: {
|
|
364
|
-
fontSize: 15,
|
|
365
|
-
width: 90
|
|
366
|
-
},
|
|
367
|
-
summaryValue: {
|
|
368
|
-
fontSize: 15,
|
|
369
|
-
fontWeight: '600',
|
|
370
|
-
flex: 1
|
|
371
|
-
},
|
|
372
|
-
successContainer: {
|
|
373
|
-
alignItems: 'center',
|
|
374
|
-
justifyContent: 'center',
|
|
375
|
-
padding: 40
|
|
376
|
-
},
|
|
377
|
-
successIcon: {
|
|
378
|
-
marginBottom: 24
|
|
379
|
-
},
|
|
380
|
-
successTitle: {
|
|
381
|
-
fontSize: 24,
|
|
382
|
-
fontWeight: 'bold',
|
|
383
|
-
marginBottom: 12,
|
|
384
|
-
textAlign: 'center'
|
|
385
|
-
},
|
|
386
|
-
successMessage: {
|
|
387
|
-
fontSize: 16,
|
|
388
|
-
textAlign: 'center',
|
|
389
|
-
opacity: 0.8,
|
|
390
|
-
marginBottom: 24
|
|
391
|
-
}
|
|
392
|
-
});
|
|
393
|
-
|
|
394
|
-
// Custom hooks for better separation of concerns
|
|
395
|
-
const useFeedbackForm = () => {
|
|
396
|
-
const [feedbackData, setFeedbackData] = useState({
|
|
397
|
-
type: 'general',
|
|
398
|
-
title: '',
|
|
399
|
-
description: '',
|
|
400
|
-
priority: 'medium',
|
|
401
|
-
category: '',
|
|
402
|
-
contactEmail: '',
|
|
403
|
-
systemInfo: true
|
|
404
|
-
});
|
|
405
|
-
const [feedbackState, setFeedbackState] = useState({
|
|
406
|
-
status: 'idle',
|
|
407
|
-
message: ''
|
|
408
|
-
});
|
|
409
|
-
const updateField = useCallback((field, value) => {
|
|
410
|
-
setFeedbackData(prev => ({
|
|
411
|
-
...prev,
|
|
412
|
-
[field]: value
|
|
413
|
-
}));
|
|
414
|
-
}, []);
|
|
415
|
-
const resetForm = useCallback(() => {
|
|
416
|
-
setFeedbackData({
|
|
417
|
-
type: 'general',
|
|
418
|
-
title: '',
|
|
419
|
-
description: '',
|
|
420
|
-
priority: 'medium',
|
|
421
|
-
category: '',
|
|
422
|
-
contactEmail: '',
|
|
423
|
-
systemInfo: true
|
|
424
|
-
});
|
|
425
|
-
setFeedbackState({
|
|
426
|
-
status: 'idle',
|
|
427
|
-
message: ''
|
|
428
|
-
});
|
|
429
|
-
}, []);
|
|
430
|
-
return {
|
|
431
|
-
feedbackData,
|
|
432
|
-
feedbackState,
|
|
433
|
-
setFeedbackState,
|
|
434
|
-
updateField,
|
|
435
|
-
resetForm
|
|
436
|
-
};
|
|
437
|
-
};
|
|
438
|
-
|
|
439
|
-
// Reusable components
|
|
440
|
-
const FormInput = /*#__PURE__*/React.memo(({
|
|
441
|
-
icon,
|
|
442
|
-
label,
|
|
443
|
-
value,
|
|
444
|
-
onChangeText,
|
|
445
|
-
placeholder,
|
|
446
|
-
multiline = false,
|
|
447
|
-
numberOfLines = 1,
|
|
448
|
-
testID,
|
|
449
|
-
colors,
|
|
450
|
-
styles,
|
|
451
|
-
borderColor
|
|
452
|
-
}) => /*#__PURE__*/_jsx(View, {
|
|
453
|
-
style: styles.inputContainer,
|
|
454
|
-
children: /*#__PURE__*/_jsxs(View, {
|
|
455
|
-
style: [multiline ? styles.textAreaWrapper : styles.premiumInputWrapper, {
|
|
456
|
-
borderColor: borderColor || colors.border,
|
|
457
|
-
backgroundColor: colors.inputBackground,
|
|
458
|
-
shadowColor: colors.primary,
|
|
459
|
-
shadowOffset: {
|
|
460
|
-
width: 0,
|
|
461
|
-
height: 4
|
|
462
|
-
},
|
|
463
|
-
shadowOpacity: 0.1,
|
|
464
|
-
shadowRadius: 12,
|
|
465
|
-
elevation: 3
|
|
466
|
-
}],
|
|
467
|
-
children: [!multiline && /*#__PURE__*/_jsx(Ionicons, {
|
|
468
|
-
name: icon,
|
|
469
|
-
size: 22,
|
|
470
|
-
color: colors.secondaryText,
|
|
471
|
-
style: styles.inputIcon
|
|
472
|
-
}), /*#__PURE__*/_jsxs(View, {
|
|
473
|
-
style: styles.inputContent,
|
|
474
|
-
children: [/*#__PURE__*/_jsx(Text, {
|
|
475
|
-
style: [styles.modernLabel, {
|
|
476
|
-
color: colors.secondaryText
|
|
477
|
-
}],
|
|
478
|
-
children: label
|
|
479
|
-
}), /*#__PURE__*/_jsx(TextInput, {
|
|
480
|
-
style: [multiline ? styles.textArea : styles.modernInput, {
|
|
481
|
-
color: colors.text
|
|
482
|
-
}],
|
|
483
|
-
value: value,
|
|
484
|
-
onChangeText: onChangeText,
|
|
485
|
-
placeholder: placeholder,
|
|
486
|
-
placeholderTextColor: colors.secondaryText + '60',
|
|
487
|
-
multiline: multiline,
|
|
488
|
-
numberOfLines: multiline ? numberOfLines : undefined,
|
|
489
|
-
testID: testID
|
|
490
|
-
})]
|
|
491
|
-
})]
|
|
492
|
-
})
|
|
493
|
-
}));
|
|
494
|
-
const ProgressIndicator = /*#__PURE__*/React.memo(({
|
|
495
|
-
currentStep,
|
|
496
|
-
totalSteps,
|
|
497
|
-
colors,
|
|
498
|
-
styles
|
|
499
|
-
}) => /*#__PURE__*/_jsx(View, {
|
|
500
|
-
style: styles.progressContainer,
|
|
501
|
-
children: Array.from({
|
|
502
|
-
length: totalSteps
|
|
503
|
-
}, (_, index) => /*#__PURE__*/_jsx(View, {
|
|
504
|
-
style: [styles.progressDot, currentStep === index ? {
|
|
505
|
-
backgroundColor: colors.primary,
|
|
506
|
-
width: 24
|
|
507
|
-
} : {
|
|
508
|
-
backgroundColor: colors.border
|
|
509
|
-
}]
|
|
510
|
-
}, index))
|
|
511
|
-
}));
|
|
512
|
-
|
|
513
|
-
// Main component
|
|
514
15
|
const FeedbackScreen = ({
|
|
515
16
|
navigate,
|
|
516
17
|
goBack,
|
|
517
18
|
onClose,
|
|
518
19
|
theme
|
|
519
20
|
}) => {
|
|
520
|
-
// Use useOxy() hook for OxyContext values
|
|
521
21
|
const {
|
|
522
22
|
user,
|
|
523
23
|
oxyServices
|
|
@@ -527,8 +27,6 @@ const FeedbackScreen = ({
|
|
|
527
27
|
const {
|
|
528
28
|
t
|
|
529
29
|
} = useI18n();
|
|
530
|
-
|
|
531
|
-
// Form state
|
|
532
30
|
const {
|
|
533
31
|
feedbackData,
|
|
534
32
|
feedbackState,
|
|
@@ -536,19 +34,11 @@ const FeedbackScreen = ({
|
|
|
536
34
|
updateField,
|
|
537
35
|
resetForm
|
|
538
36
|
} = useFeedbackForm();
|
|
539
|
-
|
|
540
|
-
// UI state
|
|
541
37
|
const [currentStep, setCurrentStep] = useState(0);
|
|
542
38
|
const [errorMessage, setErrorMessage] = useState('');
|
|
543
|
-
|
|
544
|
-
// Animation refs
|
|
545
39
|
const fadeAnim = useRef(new Animated.Value(1)).current;
|
|
546
40
|
const slideAnim = useRef(new Animated.Value(0)).current;
|
|
547
|
-
|
|
548
|
-
// Memoized styles
|
|
549
|
-
const styles = useMemo(() => createStyles(colors, normalizedTheme), [colors, normalizedTheme]);
|
|
550
|
-
|
|
551
|
-
// Animation functions
|
|
41
|
+
const styles = useMemo(() => createFeedbackStyles(colors), [colors]);
|
|
552
42
|
const animateTransition = useCallback(nextStep => {
|
|
553
43
|
Animated.timing(fadeAnim, {
|
|
554
44
|
toValue: 0,
|
|
@@ -578,8 +68,6 @@ const FeedbackScreen = ({
|
|
|
578
68
|
animateTransition(currentStep - 1);
|
|
579
69
|
}
|
|
580
70
|
}, [currentStep, animateTransition]);
|
|
581
|
-
|
|
582
|
-
// Form validation helpers
|
|
583
71
|
const isTypeStepValid = useCallback(() => {
|
|
584
72
|
return feedbackData.type && feedbackData.category;
|
|
585
73
|
}, [feedbackData.type, feedbackData.category]);
|
|
@@ -589,8 +77,6 @@ const FeedbackScreen = ({
|
|
|
589
77
|
const isContactStepValid = useCallback(() => {
|
|
590
78
|
return feedbackData.contactEmail.trim() || user?.email;
|
|
591
79
|
}, [feedbackData.contactEmail, user?.email]);
|
|
592
|
-
|
|
593
|
-
// Submit feedback handler
|
|
594
80
|
const handleSubmitFeedback = useCallback(async () => {
|
|
595
81
|
if (!isTypeStepValid() || !isDetailsStepValid() || !isContactStepValid()) {
|
|
596
82
|
toast.error(t('feedback.toasts.fillRequired') || 'Please fill in all required fields');
|
|
@@ -602,8 +88,6 @@ const FeedbackScreen = ({
|
|
|
602
88
|
message: ''
|
|
603
89
|
});
|
|
604
90
|
setErrorMessage('');
|
|
605
|
-
|
|
606
|
-
// Prepare feedback data
|
|
607
91
|
const feedbackPayload = {
|
|
608
92
|
type: feedbackData.type,
|
|
609
93
|
title: feedbackData.title,
|
|
@@ -620,19 +104,12 @@ const FeedbackScreen = ({
|
|
|
620
104
|
timestamp: new Date().toISOString()
|
|
621
105
|
} : undefined
|
|
622
106
|
};
|
|
623
|
-
|
|
624
|
-
// TODO: Implement actual API integration
|
|
625
|
-
// Replace setTimeout simulation with actual API call: await oxyServices.submitFeedback(feedbackPayload)
|
|
626
|
-
// Currently simulates API call with setTimeout for development/testing purposes
|
|
627
|
-
await new Promise(resolve => setTimeout(resolve, 2000)); // Simulate API call
|
|
628
|
-
|
|
107
|
+
await oxyServices.submitFeedback(feedbackPayload);
|
|
629
108
|
setFeedbackState({
|
|
630
109
|
status: 'success',
|
|
631
110
|
message: t('feedback.toasts.submitSuccess') || 'Feedback submitted successfully!'
|
|
632
111
|
});
|
|
633
112
|
toast.success(t('feedback.toasts.thanks') || 'Thank you for your feedback!');
|
|
634
|
-
|
|
635
|
-
// Reset form after success
|
|
636
113
|
setTimeout(() => {
|
|
637
114
|
resetForm();
|
|
638
115
|
setCurrentStep(0);
|
|
@@ -644,10 +121,7 @@ const FeedbackScreen = ({
|
|
|
644
121
|
});
|
|
645
122
|
toast.error(error.message || t('feedback.toasts.submitFailed') || 'Failed to submit feedback');
|
|
646
123
|
}
|
|
647
|
-
}, [feedbackData, user, isTypeStepValid, isDetailsStepValid, isContactStepValid, resetForm]);
|
|
648
|
-
|
|
649
|
-
// Step components
|
|
650
|
-
// Memoized grouped section items
|
|
124
|
+
}, [feedbackData, user, isTypeStepValid, isDetailsStepValid, isContactStepValid, resetForm, setFeedbackState, t]);
|
|
651
125
|
const feedbackTypeItems = useMemo(() => FEEDBACK_TYPES.map(type => ({
|
|
652
126
|
id: type.id,
|
|
653
127
|
icon: type.icon,
|
|
@@ -683,7 +157,7 @@ const FeedbackScreen = ({
|
|
|
683
157
|
showChevron: false,
|
|
684
158
|
dense: true
|
|
685
159
|
})), [feedbackData.priority, updateField]);
|
|
686
|
-
const renderTypeStep =
|
|
160
|
+
const renderTypeStep = () => /*#__PURE__*/_jsxs(Animated.View, {
|
|
687
161
|
style: [styles.stepContainer, {
|
|
688
162
|
opacity: fadeAnim,
|
|
689
163
|
transform: [{
|
|
@@ -728,13 +202,11 @@ const FeedbackScreen = ({
|
|
|
728
202
|
style: [styles.navButton, {
|
|
729
203
|
backgroundColor: 'transparent',
|
|
730
204
|
borderColor: colors.border,
|
|
731
|
-
|
|
732
|
-
borderTopLeftRadius: 35,
|
|
733
|
-
borderBottomLeftRadius: 35,
|
|
734
|
-
borderTopRightRadius: 35,
|
|
735
|
-
borderBottomRightRadius: 35
|
|
205
|
+
borderRadius: 35
|
|
736
206
|
}],
|
|
737
207
|
onPress: goBack,
|
|
208
|
+
accessibilityRole: "button",
|
|
209
|
+
accessibilityLabel: "Go back",
|
|
738
210
|
children: [/*#__PURE__*/_jsx(Ionicons, {
|
|
739
211
|
name: "arrow-back",
|
|
740
212
|
size: 16,
|
|
@@ -749,14 +221,12 @@ const FeedbackScreen = ({
|
|
|
749
221
|
style: [styles.navButton, {
|
|
750
222
|
backgroundColor: colors.primary,
|
|
751
223
|
borderColor: colors.primary,
|
|
752
|
-
|
|
753
|
-
borderTopLeftRadius: 35,
|
|
754
|
-
borderBottomLeftRadius: 35,
|
|
755
|
-
borderTopRightRadius: 35,
|
|
756
|
-
borderBottomRightRadius: 35
|
|
224
|
+
borderRadius: 35
|
|
757
225
|
}],
|
|
758
226
|
onPress: nextStep,
|
|
759
227
|
disabled: !isTypeStepValid(),
|
|
228
|
+
accessibilityRole: "button",
|
|
229
|
+
accessibilityLabel: "Continue to next step",
|
|
760
230
|
children: [/*#__PURE__*/_jsx(Text, {
|
|
761
231
|
style: [styles.navButtonText, {
|
|
762
232
|
color: '#FFFFFF'
|
|
@@ -769,8 +239,8 @@ const FeedbackScreen = ({
|
|
|
769
239
|
})]
|
|
770
240
|
})]
|
|
771
241
|
})]
|
|
772
|
-
})
|
|
773
|
-
const renderDetailsStep =
|
|
242
|
+
});
|
|
243
|
+
const renderDetailsStep = () => /*#__PURE__*/_jsxs(Animated.View, {
|
|
774
244
|
style: [styles.stepContainer, {
|
|
775
245
|
opacity: fadeAnim,
|
|
776
246
|
transform: [{
|
|
@@ -801,7 +271,9 @@ const FeedbackScreen = ({
|
|
|
801
271
|
placeholder: t('feedback.fields.title.placeholder') || 'Brief summary of your feedback',
|
|
802
272
|
testID: "feedback-title-input",
|
|
803
273
|
colors: colors,
|
|
804
|
-
styles: styles
|
|
274
|
+
styles: styles,
|
|
275
|
+
accessibilityLabel: "Feedback title",
|
|
276
|
+
accessibilityHint: "Enter a brief summary of your feedback"
|
|
805
277
|
}), /*#__PURE__*/_jsx(FormInput, {
|
|
806
278
|
icon: "document-text-outline",
|
|
807
279
|
label: t('feedback.fields.description.label') || 'Description',
|
|
@@ -815,7 +287,9 @@ const FeedbackScreen = ({
|
|
|
815
287
|
numberOfLines: 6,
|
|
816
288
|
testID: "feedback-description-input",
|
|
817
289
|
colors: colors,
|
|
818
|
-
styles: styles
|
|
290
|
+
styles: styles,
|
|
291
|
+
accessibilityLabel: "Feedback description",
|
|
292
|
+
accessibilityHint: "Provide detailed information about your feedback"
|
|
819
293
|
}), /*#__PURE__*/_jsxs(View, {
|
|
820
294
|
style: {
|
|
821
295
|
marginBottom: 24
|
|
@@ -836,10 +310,11 @@ const FeedbackScreen = ({
|
|
|
836
310
|
style: styles.navigationButtons,
|
|
837
311
|
children: [/*#__PURE__*/_jsxs(TouchableOpacity, {
|
|
838
312
|
style: [styles.navButton, styles.backButton, {
|
|
839
|
-
borderColor: colors.border
|
|
840
|
-
shadowColor: colors.border
|
|
313
|
+
borderColor: colors.border
|
|
841
314
|
}],
|
|
842
315
|
onPress: prevStep,
|
|
316
|
+
accessibilityRole: "button",
|
|
317
|
+
accessibilityLabel: "Go back",
|
|
843
318
|
children: [/*#__PURE__*/_jsx(Ionicons, {
|
|
844
319
|
name: "arrow-back",
|
|
845
320
|
size: 16,
|
|
@@ -853,11 +328,12 @@ const FeedbackScreen = ({
|
|
|
853
328
|
}), /*#__PURE__*/_jsxs(TouchableOpacity, {
|
|
854
329
|
style: [styles.navButton, styles.nextButton, {
|
|
855
330
|
backgroundColor: colors.primary,
|
|
856
|
-
borderColor: colors.primary
|
|
857
|
-
shadowColor: colors.primary
|
|
331
|
+
borderColor: colors.primary
|
|
858
332
|
}],
|
|
859
333
|
onPress: nextStep,
|
|
860
334
|
disabled: !isDetailsStepValid(),
|
|
335
|
+
accessibilityRole: "button",
|
|
336
|
+
accessibilityLabel: "Continue to next step",
|
|
861
337
|
children: [/*#__PURE__*/_jsx(Text, {
|
|
862
338
|
style: [styles.navButtonText, {
|
|
863
339
|
color: '#FFFFFF'
|
|
@@ -870,8 +346,8 @@ const FeedbackScreen = ({
|
|
|
870
346
|
})]
|
|
871
347
|
})]
|
|
872
348
|
})]
|
|
873
|
-
})
|
|
874
|
-
const renderContactStep =
|
|
349
|
+
});
|
|
350
|
+
const renderContactStep = () => /*#__PURE__*/_jsxs(Animated.View, {
|
|
875
351
|
style: [styles.stepContainer, {
|
|
876
352
|
opacity: fadeAnim,
|
|
877
353
|
transform: [{
|
|
@@ -902,7 +378,9 @@ const FeedbackScreen = ({
|
|
|
902
378
|
placeholder: user?.email || t('feedback.fields.email.placeholder') || 'Enter your email address',
|
|
903
379
|
testID: "feedback-email-input",
|
|
904
380
|
colors: colors,
|
|
905
|
-
styles: styles
|
|
381
|
+
styles: styles,
|
|
382
|
+
accessibilityLabel: "Email address",
|
|
383
|
+
accessibilityHint: "Enter your email so we can respond"
|
|
906
384
|
}), /*#__PURE__*/_jsxs(View, {
|
|
907
385
|
style: styles.checkboxContainer,
|
|
908
386
|
children: [/*#__PURE__*/_jsx(TouchableOpacity, {
|
|
@@ -911,6 +389,11 @@ const FeedbackScreen = ({
|
|
|
911
389
|
backgroundColor: feedbackData.systemInfo ? colors.primary : 'transparent'
|
|
912
390
|
}],
|
|
913
391
|
onPress: () => updateField('systemInfo', !feedbackData.systemInfo),
|
|
392
|
+
accessibilityRole: "checkbox",
|
|
393
|
+
accessibilityState: {
|
|
394
|
+
checked: feedbackData.systemInfo
|
|
395
|
+
},
|
|
396
|
+
accessibilityLabel: "Include system information",
|
|
914
397
|
children: feedbackData.systemInfo && /*#__PURE__*/_jsx(Ionicons, {
|
|
915
398
|
name: "checkmark",
|
|
916
399
|
size: 16,
|
|
@@ -926,10 +409,11 @@ const FeedbackScreen = ({
|
|
|
926
409
|
style: styles.navigationButtons,
|
|
927
410
|
children: [/*#__PURE__*/_jsxs(TouchableOpacity, {
|
|
928
411
|
style: [styles.navButton, styles.backButton, {
|
|
929
|
-
borderColor: colors.border
|
|
930
|
-
shadowColor: colors.border
|
|
412
|
+
borderColor: colors.border
|
|
931
413
|
}],
|
|
932
414
|
onPress: prevStep,
|
|
415
|
+
accessibilityRole: "button",
|
|
416
|
+
accessibilityLabel: "Go back",
|
|
933
417
|
children: [/*#__PURE__*/_jsx(Ionicons, {
|
|
934
418
|
name: "arrow-back",
|
|
935
419
|
size: 16,
|
|
@@ -943,11 +427,12 @@ const FeedbackScreen = ({
|
|
|
943
427
|
}), /*#__PURE__*/_jsxs(TouchableOpacity, {
|
|
944
428
|
style: [styles.navButton, styles.nextButton, {
|
|
945
429
|
backgroundColor: colors.primary,
|
|
946
|
-
borderColor: colors.primary
|
|
947
|
-
shadowColor: colors.primary
|
|
430
|
+
borderColor: colors.primary
|
|
948
431
|
}],
|
|
949
432
|
onPress: nextStep,
|
|
950
433
|
disabled: !isContactStepValid(),
|
|
434
|
+
accessibilityRole: "button",
|
|
435
|
+
accessibilityLabel: "Continue to summary",
|
|
951
436
|
children: [/*#__PURE__*/_jsx(Text, {
|
|
952
437
|
style: [styles.navButtonText, {
|
|
953
438
|
color: '#FFFFFF'
|
|
@@ -960,8 +445,8 @@ const FeedbackScreen = ({
|
|
|
960
445
|
})]
|
|
961
446
|
})]
|
|
962
447
|
})]
|
|
963
|
-
})
|
|
964
|
-
const renderSummaryStep =
|
|
448
|
+
});
|
|
449
|
+
const renderSummaryStep = () => /*#__PURE__*/_jsxs(Animated.View, {
|
|
965
450
|
style: [styles.stepContainer, {
|
|
966
451
|
opacity: fadeAnim,
|
|
967
452
|
transform: [{
|
|
@@ -989,7 +474,7 @@ const FeedbackScreen = ({
|
|
|
989
474
|
style: [styles.summaryLabel, {
|
|
990
475
|
color: colors.secondaryText
|
|
991
476
|
}],
|
|
992
|
-
children:
|
|
477
|
+
children: "Type:"
|
|
993
478
|
}), /*#__PURE__*/_jsx(Text, {
|
|
994
479
|
style: [styles.summaryValue, {
|
|
995
480
|
color: colors.text
|
|
@@ -1002,7 +487,7 @@ const FeedbackScreen = ({
|
|
|
1002
487
|
style: [styles.summaryLabel, {
|
|
1003
488
|
color: colors.secondaryText
|
|
1004
489
|
}],
|
|
1005
|
-
children:
|
|
490
|
+
children: "Category:"
|
|
1006
491
|
}), /*#__PURE__*/_jsx(Text, {
|
|
1007
492
|
style: [styles.summaryValue, {
|
|
1008
493
|
color: colors.text
|
|
@@ -1015,7 +500,7 @@ const FeedbackScreen = ({
|
|
|
1015
500
|
style: [styles.summaryLabel, {
|
|
1016
501
|
color: colors.secondaryText
|
|
1017
502
|
}],
|
|
1018
|
-
children:
|
|
503
|
+
children: "Priority:"
|
|
1019
504
|
}), /*#__PURE__*/_jsx(Text, {
|
|
1020
505
|
style: [styles.summaryValue, {
|
|
1021
506
|
color: colors.text
|
|
@@ -1028,7 +513,7 @@ const FeedbackScreen = ({
|
|
|
1028
513
|
style: [styles.summaryLabel, {
|
|
1029
514
|
color: colors.secondaryText
|
|
1030
515
|
}],
|
|
1031
|
-
children:
|
|
516
|
+
children: "Title:"
|
|
1032
517
|
}), /*#__PURE__*/_jsx(Text, {
|
|
1033
518
|
style: [styles.summaryValue, {
|
|
1034
519
|
color: colors.text
|
|
@@ -1041,7 +526,7 @@ const FeedbackScreen = ({
|
|
|
1041
526
|
style: [styles.summaryLabel, {
|
|
1042
527
|
color: colors.secondaryText
|
|
1043
528
|
}],
|
|
1044
|
-
children:
|
|
529
|
+
children: "Contact:"
|
|
1045
530
|
}), /*#__PURE__*/_jsx(Text, {
|
|
1046
531
|
style: [styles.summaryValue, {
|
|
1047
532
|
color: colors.text
|
|
@@ -1056,6 +541,8 @@ const FeedbackScreen = ({
|
|
|
1056
541
|
onPress: handleSubmitFeedback,
|
|
1057
542
|
disabled: feedbackState.status === 'submitting',
|
|
1058
543
|
testID: "submit-feedback-button",
|
|
544
|
+
accessibilityRole: "button",
|
|
545
|
+
accessibilityLabel: "Submit feedback",
|
|
1059
546
|
children: feedbackState.status === 'submitting' ? /*#__PURE__*/_jsx(ActivityIndicator, {
|
|
1060
547
|
color: "#FFFFFF",
|
|
1061
548
|
size: "small"
|
|
@@ -1075,13 +562,11 @@ const FeedbackScreen = ({
|
|
|
1075
562
|
style: [styles.navButton, {
|
|
1076
563
|
backgroundColor: 'transparent',
|
|
1077
564
|
borderColor: colors.border,
|
|
1078
|
-
|
|
1079
|
-
borderTopLeftRadius: 35,
|
|
1080
|
-
borderBottomLeftRadius: 35,
|
|
1081
|
-
borderTopRightRadius: 35,
|
|
1082
|
-
borderBottomRightRadius: 35
|
|
565
|
+
borderRadius: 35
|
|
1083
566
|
}],
|
|
1084
567
|
onPress: prevStep,
|
|
568
|
+
accessibilityRole: "button",
|
|
569
|
+
accessibilityLabel: "Go back",
|
|
1085
570
|
children: [/*#__PURE__*/_jsx(Ionicons, {
|
|
1086
571
|
name: "arrow-back",
|
|
1087
572
|
size: 16,
|
|
@@ -1094,8 +579,8 @@ const FeedbackScreen = ({
|
|
|
1094
579
|
})]
|
|
1095
580
|
})
|
|
1096
581
|
})]
|
|
1097
|
-
})
|
|
1098
|
-
const renderSuccessStep =
|
|
582
|
+
});
|
|
583
|
+
const renderSuccessStep = () => /*#__PURE__*/_jsx(Animated.View, {
|
|
1099
584
|
style: [styles.stepContainer, {
|
|
1100
585
|
opacity: fadeAnim,
|
|
1101
586
|
transform: [{
|
|
@@ -1106,14 +591,14 @@ const FeedbackScreen = ({
|
|
|
1106
591
|
style: styles.successContainer,
|
|
1107
592
|
children: [/*#__PURE__*/_jsx(View, {
|
|
1108
593
|
style: [styles.successIcon, {
|
|
1109
|
-
backgroundColor: colors.success + '20',
|
|
594
|
+
backgroundColor: (colors.success || '#34C759') + '20',
|
|
1110
595
|
padding: 24,
|
|
1111
596
|
borderRadius: 50
|
|
1112
597
|
}],
|
|
1113
598
|
children: /*#__PURE__*/_jsx(Ionicons, {
|
|
1114
599
|
name: "checkmark-circle",
|
|
1115
600
|
size: 48,
|
|
1116
|
-
color: colors.success
|
|
601
|
+
color: colors.success || '#34C759'
|
|
1117
602
|
})
|
|
1118
603
|
}), /*#__PURE__*/_jsx(Text, {
|
|
1119
604
|
style: [styles.successTitle, {
|
|
@@ -1133,19 +618,17 @@ const FeedbackScreen = ({
|
|
|
1133
618
|
resetForm();
|
|
1134
619
|
setCurrentStep(0);
|
|
1135
620
|
},
|
|
621
|
+
accessibilityRole: "button",
|
|
622
|
+
accessibilityLabel: "Submit another feedback",
|
|
1136
623
|
children: /*#__PURE__*/_jsx(Text, {
|
|
1137
624
|
style: styles.buttonText,
|
|
1138
625
|
children: t('feedback.actions.submitAnother') || 'Submit Another'
|
|
1139
626
|
})
|
|
1140
627
|
})]
|
|
1141
628
|
})
|
|
1142
|
-
})
|
|
1143
|
-
|
|
1144
|
-
|
|
1145
|
-
const renderCurrentStep = useCallback(() => {
|
|
1146
|
-
if (feedbackState.status === 'success') {
|
|
1147
|
-
return renderSuccessStep();
|
|
1148
|
-
}
|
|
629
|
+
});
|
|
630
|
+
const renderCurrentStep = () => {
|
|
631
|
+
if (feedbackState.status === 'success') return renderSuccessStep();
|
|
1149
632
|
switch (currentStep) {
|
|
1150
633
|
case 0:
|
|
1151
634
|
return renderTypeStep();
|
|
@@ -1158,7 +641,7 @@ const FeedbackScreen = ({
|
|
|
1158
641
|
default:
|
|
1159
642
|
return renderTypeStep();
|
|
1160
643
|
}
|
|
1161
|
-
}
|
|
644
|
+
};
|
|
1162
645
|
return /*#__PURE__*/_jsxs(KeyboardAvoidingView, {
|
|
1163
646
|
style: [styles.container, {
|
|
1164
647
|
backgroundColor: theme === 'dark' ? colors.background : '#F7F9FC'
|