@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,18 +1,14 @@
|
|
|
1
|
-
import React, { useState, useRef,
|
|
1
|
+
import React, { useState, useRef, useCallback, useMemo } from 'react';
|
|
2
2
|
import {
|
|
3
3
|
View,
|
|
4
4
|
Text,
|
|
5
|
-
TextInput,
|
|
6
5
|
TouchableOpacity,
|
|
7
|
-
StyleSheet,
|
|
8
6
|
ActivityIndicator,
|
|
9
7
|
Platform,
|
|
10
8
|
KeyboardAvoidingView,
|
|
11
9
|
ScrollView,
|
|
12
10
|
Animated,
|
|
13
11
|
StatusBar,
|
|
14
|
-
Alert,
|
|
15
|
-
Dimensions,
|
|
16
12
|
} from 'react-native';
|
|
17
13
|
import type { BaseScreenProps } from '../types/navigation';
|
|
18
14
|
import { useThemeColors } from '../styles';
|
|
@@ -23,516 +19,38 @@ import { packageInfo } from '../../constants/version';
|
|
|
23
19
|
import { GroupedSection } from '../components';
|
|
24
20
|
import { useI18n } from '../hooks/useI18n';
|
|
25
21
|
import { useOxy } from '../context/OxyContext';
|
|
26
|
-
import { screenContentStyle } from '../constants/spacing';
|
|
27
22
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
interface FeedbackState {
|
|
40
|
-
status: 'idle' | 'submitting' | 'success' | 'error';
|
|
41
|
-
message: string;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
// Constants
|
|
45
|
-
const FEEDBACK_TYPES = [
|
|
46
|
-
{ id: 'bug', label: 'Bug Report', icon: 'bug', color: '#FF3B30', description: 'Report a problem or issue' },
|
|
47
|
-
{ id: 'feature', label: 'Feature Request', icon: 'bulb', color: '#007AFF', description: 'Suggest a new feature' },
|
|
48
|
-
{ id: 'general', label: 'General Feedback', icon: 'chatbubble', color: '#34C759', description: 'Share your thoughts' },
|
|
49
|
-
{ id: 'support', label: 'Support Request', icon: 'help-circle', color: '#FF9500', description: 'Get help with something' },
|
|
50
|
-
];
|
|
51
|
-
|
|
52
|
-
const PRIORITY_LEVELS = [
|
|
53
|
-
{ id: 'low', label: 'Low', icon: 'arrow-down', color: '#34C759' },
|
|
54
|
-
{ id: 'medium', label: 'Medium', icon: 'remove', color: '#FF9500' },
|
|
55
|
-
{ id: 'high', label: 'High', icon: 'arrow-up', color: '#FF3B30' },
|
|
56
|
-
{ id: 'critical', label: 'Critical', icon: 'warning', color: '#FF0000' },
|
|
57
|
-
];
|
|
58
|
-
|
|
59
|
-
const CATEGORIES = {
|
|
60
|
-
bug: ['UI/UX', 'Performance', 'Authentication', 'File Management', 'Billing', 'Other'],
|
|
61
|
-
feature: ['User Interface', 'File Management', 'Security', 'Performance', 'Integration', 'Other'],
|
|
62
|
-
general: ['User Experience', 'Design', 'Performance', 'Documentation', 'Other'],
|
|
63
|
-
support: ['Account Issues', 'Billing', 'Technical Problems', 'Feature Questions', 'Other'],
|
|
64
|
-
};
|
|
65
|
-
|
|
66
|
-
// Styles factory function
|
|
67
|
-
const createStyles = (colors: any, theme: string) => StyleSheet.create({
|
|
68
|
-
container: {
|
|
69
|
-
flex: 1,
|
|
70
|
-
},
|
|
71
|
-
fullBleed: {
|
|
72
|
-
width: '100%',
|
|
73
|
-
alignSelf: 'stretch',
|
|
74
|
-
},
|
|
75
|
-
scrollContent: {
|
|
76
|
-
flexGrow: 1,
|
|
77
|
-
...screenContentStyle,
|
|
78
|
-
},
|
|
79
|
-
stepContainer: {
|
|
80
|
-
flex: 1,
|
|
81
|
-
justifyContent: 'flex-start',
|
|
82
|
-
alignItems: 'flex-start',
|
|
83
|
-
},
|
|
84
|
-
modernHeader: {
|
|
85
|
-
alignItems: 'flex-start',
|
|
86
|
-
width: '100%',
|
|
87
|
-
marginBottom: 24,
|
|
88
|
-
},
|
|
89
|
-
modernTitle: {
|
|
90
|
-
fontFamily: Platform.OS === 'web' ? 'Phudu' : 'Phudu-Bold',
|
|
91
|
-
fontWeight: Platform.OS === 'web' ? 'bold' : undefined,
|
|
92
|
-
fontSize: 42,
|
|
93
|
-
lineHeight: 48,
|
|
94
|
-
marginBottom: 12,
|
|
95
|
-
textAlign: 'left',
|
|
96
|
-
letterSpacing: -1,
|
|
97
|
-
},
|
|
98
|
-
modernSubtitle: {
|
|
99
|
-
fontSize: 18,
|
|
100
|
-
lineHeight: 24,
|
|
101
|
-
textAlign: 'left',
|
|
102
|
-
opacity: 0.8,
|
|
103
|
-
marginBottom: 24,
|
|
104
|
-
},
|
|
105
|
-
stepTitle: {
|
|
106
|
-
fontFamily: Platform.OS === 'web' ? 'Phudu' : 'Phudu-Bold',
|
|
107
|
-
fontWeight: Platform.OS === 'web' ? 'bold' : undefined,
|
|
108
|
-
fontSize: 42,
|
|
109
|
-
lineHeight: 48,
|
|
110
|
-
marginBottom: 12,
|
|
111
|
-
textAlign: 'left',
|
|
112
|
-
letterSpacing: -1,
|
|
113
|
-
},
|
|
114
|
-
inputContainer: {
|
|
115
|
-
width: '100%',
|
|
116
|
-
marginBottom: 24,
|
|
117
|
-
},
|
|
118
|
-
premiumInputWrapper: {
|
|
119
|
-
flexDirection: 'row',
|
|
120
|
-
alignItems: 'center',
|
|
121
|
-
height: 56,
|
|
122
|
-
borderRadius: 16,
|
|
123
|
-
paddingHorizontal: 20,
|
|
124
|
-
borderWidth: 2,
|
|
125
|
-
backgroundColor: colors.inputBackground,
|
|
126
|
-
},
|
|
127
|
-
textAreaWrapper: {
|
|
128
|
-
flexDirection: 'column',
|
|
129
|
-
alignItems: 'flex-start',
|
|
130
|
-
minHeight: 120,
|
|
131
|
-
borderRadius: 16,
|
|
132
|
-
paddingHorizontal: 20,
|
|
133
|
-
paddingVertical: 16,
|
|
134
|
-
borderWidth: 2,
|
|
135
|
-
backgroundColor: colors.inputBackground,
|
|
136
|
-
},
|
|
137
|
-
inputIcon: {
|
|
138
|
-
marginRight: 12,
|
|
139
|
-
},
|
|
140
|
-
inputContent: {
|
|
141
|
-
flex: 1,
|
|
142
|
-
},
|
|
143
|
-
modernLabel: {
|
|
144
|
-
fontSize: 12,
|
|
145
|
-
fontWeight: '500',
|
|
146
|
-
marginBottom: 2,
|
|
147
|
-
},
|
|
148
|
-
modernInput: {
|
|
149
|
-
flex: 1,
|
|
150
|
-
fontSize: 16,
|
|
151
|
-
height: '100%',
|
|
152
|
-
},
|
|
153
|
-
textArea: {
|
|
154
|
-
flex: 1,
|
|
155
|
-
fontSize: 16,
|
|
156
|
-
textAlignVertical: 'top',
|
|
157
|
-
minHeight: 80,
|
|
158
|
-
},
|
|
159
|
-
typeGrid: {
|
|
160
|
-
flexDirection: 'row',
|
|
161
|
-
flexWrap: 'wrap',
|
|
162
|
-
gap: 12,
|
|
163
|
-
marginBottom: 24,
|
|
164
|
-
},
|
|
165
|
-
typeCard: {
|
|
166
|
-
width: (Dimensions.get('window').width - 72) / 2,
|
|
167
|
-
padding: 20,
|
|
168
|
-
borderRadius: 16,
|
|
169
|
-
borderWidth: 2,
|
|
170
|
-
alignItems: 'center',
|
|
171
|
-
justifyContent: 'center',
|
|
172
|
-
minHeight: 120,
|
|
173
|
-
},
|
|
174
|
-
typeIcon: {
|
|
175
|
-
marginBottom: 12,
|
|
176
|
-
},
|
|
177
|
-
typeLabel: {
|
|
178
|
-
fontSize: 16,
|
|
179
|
-
fontWeight: '600',
|
|
180
|
-
textAlign: 'center',
|
|
181
|
-
marginBottom: 4,
|
|
182
|
-
},
|
|
183
|
-
typeDescription: {
|
|
184
|
-
fontSize: 12,
|
|
185
|
-
textAlign: 'center',
|
|
186
|
-
opacity: 0.8,
|
|
187
|
-
},
|
|
188
|
-
priorityContainer: {
|
|
189
|
-
flexDirection: 'row',
|
|
190
|
-
justifyContent: 'space-between',
|
|
191
|
-
marginBottom: 24,
|
|
192
|
-
},
|
|
193
|
-
priorityButton: {
|
|
194
|
-
flex: 1,
|
|
195
|
-
padding: 16,
|
|
196
|
-
borderRadius: 12,
|
|
197
|
-
borderWidth: 2,
|
|
198
|
-
alignItems: 'center',
|
|
199
|
-
marginHorizontal: 4,
|
|
200
|
-
},
|
|
201
|
-
priorityLabel: {
|
|
202
|
-
fontSize: 12,
|
|
203
|
-
fontWeight: '600',
|
|
204
|
-
marginTop: 4,
|
|
205
|
-
},
|
|
206
|
-
categoryContainer: {
|
|
207
|
-
marginBottom: 24,
|
|
208
|
-
},
|
|
209
|
-
categoryButton: {
|
|
210
|
-
flexDirection: 'row',
|
|
211
|
-
alignItems: 'center',
|
|
212
|
-
paddingVertical: 12,
|
|
213
|
-
paddingHorizontal: 16,
|
|
214
|
-
borderRadius: 12,
|
|
215
|
-
borderWidth: 1,
|
|
216
|
-
marginBottom: 8,
|
|
217
|
-
},
|
|
218
|
-
categoryText: {
|
|
219
|
-
fontSize: 16,
|
|
220
|
-
marginLeft: 12,
|
|
221
|
-
},
|
|
222
|
-
checkboxContainer: {
|
|
223
|
-
flexDirection: 'row',
|
|
224
|
-
alignItems: 'center',
|
|
225
|
-
marginBottom: 24,
|
|
226
|
-
},
|
|
227
|
-
checkbox: {
|
|
228
|
-
width: 24,
|
|
229
|
-
height: 24,
|
|
230
|
-
borderRadius: 6,
|
|
231
|
-
borderWidth: 2,
|
|
232
|
-
marginRight: 12,
|
|
233
|
-
alignItems: 'center',
|
|
234
|
-
justifyContent: 'center',
|
|
235
|
-
},
|
|
236
|
-
checkboxText: {
|
|
237
|
-
fontSize: 16,
|
|
238
|
-
flex: 1,
|
|
239
|
-
},
|
|
240
|
-
button: {
|
|
241
|
-
flexDirection: 'row',
|
|
242
|
-
alignItems: 'center',
|
|
243
|
-
justifyContent: 'center',
|
|
244
|
-
paddingVertical: 18,
|
|
245
|
-
paddingHorizontal: 32,
|
|
246
|
-
borderRadius: 16,
|
|
247
|
-
marginVertical: 8,
|
|
248
|
-
gap: 8,
|
|
249
|
-
width: '100%',
|
|
250
|
-
...Platform.select({
|
|
251
|
-
web: {
|
|
252
|
-
boxShadow: '0 4px 8px rgba(0,0,0,0.3)',
|
|
253
|
-
},
|
|
254
|
-
default: {
|
|
255
|
-
shadowOffset: { width: 0, height: 4 },
|
|
256
|
-
shadowOpacity: 0.3,
|
|
257
|
-
shadowRadius: 8,
|
|
258
|
-
elevation: 6,
|
|
259
|
-
}
|
|
260
|
-
}),
|
|
261
|
-
},
|
|
262
|
-
buttonText: {
|
|
263
|
-
color: '#FFFFFF',
|
|
264
|
-
fontSize: 16,
|
|
265
|
-
fontWeight: '600',
|
|
266
|
-
letterSpacing: 0.5,
|
|
267
|
-
},
|
|
268
|
-
navigationButtons: {
|
|
269
|
-
flexDirection: 'row',
|
|
270
|
-
justifyContent: 'center',
|
|
271
|
-
marginTop: 16,
|
|
272
|
-
marginBottom: 8,
|
|
273
|
-
width: '100%',
|
|
274
|
-
gap: 8,
|
|
275
|
-
},
|
|
276
|
-
navButton: {
|
|
277
|
-
flexDirection: 'row',
|
|
278
|
-
alignItems: 'center',
|
|
279
|
-
paddingVertical: 6,
|
|
280
|
-
paddingHorizontal: 12,
|
|
281
|
-
gap: 6,
|
|
282
|
-
minWidth: 70,
|
|
283
|
-
borderWidth: 1,
|
|
284
|
-
...Platform.select({
|
|
285
|
-
web: {
|
|
286
|
-
boxShadow: '0 2px 4px rgba(0,0,0,0.1)',
|
|
287
|
-
},
|
|
288
|
-
default: {
|
|
289
|
-
shadowOffset: { width: 0, height: 2 },
|
|
290
|
-
shadowOpacity: 0.1,
|
|
291
|
-
shadowRadius: 4,
|
|
292
|
-
elevation: 2,
|
|
293
|
-
}
|
|
294
|
-
}),
|
|
295
|
-
},
|
|
296
|
-
backButton: {
|
|
297
|
-
backgroundColor: 'transparent',
|
|
298
|
-
borderTopLeftRadius: 35,
|
|
299
|
-
borderBottomLeftRadius: 35,
|
|
300
|
-
borderTopRightRadius: 12,
|
|
301
|
-
borderBottomRightRadius: 12,
|
|
302
|
-
},
|
|
303
|
-
nextButton: {
|
|
304
|
-
backgroundColor: 'transparent',
|
|
305
|
-
borderTopRightRadius: 35,
|
|
306
|
-
borderBottomRightRadius: 35,
|
|
307
|
-
borderTopLeftRadius: 12,
|
|
308
|
-
borderBottomLeftRadius: 12,
|
|
309
|
-
},
|
|
310
|
-
navButtonText: {
|
|
311
|
-
fontSize: 13,
|
|
312
|
-
fontWeight: '500',
|
|
313
|
-
},
|
|
314
|
-
progressContainer: {
|
|
315
|
-
flexDirection: 'row',
|
|
316
|
-
justifyContent: 'center',
|
|
317
|
-
marginBottom: 20,
|
|
318
|
-
marginTop: 8,
|
|
319
|
-
},
|
|
320
|
-
progressDot: {
|
|
321
|
-
height: 10,
|
|
322
|
-
width: 10,
|
|
323
|
-
borderRadius: 5,
|
|
324
|
-
marginHorizontal: 6,
|
|
325
|
-
borderWidth: 2,
|
|
326
|
-
borderColor: '#fff',
|
|
327
|
-
...Platform.select({
|
|
328
|
-
web: {
|
|
329
|
-
boxShadow: '0 1px 2px rgba(0,0,0,0.08)',
|
|
330
|
-
},
|
|
331
|
-
default: {
|
|
332
|
-
shadowColor: colors.primary,
|
|
333
|
-
shadowOpacity: 0.08,
|
|
334
|
-
shadowOffset: { width: 0, height: 1 },
|
|
335
|
-
shadowRadius: 2,
|
|
336
|
-
elevation: 1,
|
|
337
|
-
}
|
|
338
|
-
}),
|
|
339
|
-
},
|
|
340
|
-
summaryContainer: {
|
|
341
|
-
padding: 0,
|
|
342
|
-
marginBottom: 24,
|
|
343
|
-
width: '100%',
|
|
344
|
-
},
|
|
345
|
-
summaryRow: {
|
|
346
|
-
flexDirection: 'row',
|
|
347
|
-
marginBottom: 10,
|
|
348
|
-
},
|
|
349
|
-
summaryLabel: {
|
|
350
|
-
fontSize: 15,
|
|
351
|
-
width: 90,
|
|
352
|
-
},
|
|
353
|
-
summaryValue: {
|
|
354
|
-
fontSize: 15,
|
|
355
|
-
fontWeight: '600',
|
|
356
|
-
flex: 1,
|
|
357
|
-
},
|
|
358
|
-
successContainer: {
|
|
359
|
-
alignItems: 'center',
|
|
360
|
-
justifyContent: 'center',
|
|
361
|
-
padding: 40,
|
|
362
|
-
},
|
|
363
|
-
successIcon: {
|
|
364
|
-
marginBottom: 24,
|
|
365
|
-
},
|
|
366
|
-
successTitle: {
|
|
367
|
-
fontSize: 24,
|
|
368
|
-
fontWeight: 'bold',
|
|
369
|
-
marginBottom: 12,
|
|
370
|
-
textAlign: 'center',
|
|
371
|
-
},
|
|
372
|
-
successMessage: {
|
|
373
|
-
fontSize: 16,
|
|
374
|
-
textAlign: 'center',
|
|
375
|
-
opacity: 0.8,
|
|
376
|
-
marginBottom: 24,
|
|
377
|
-
},
|
|
378
|
-
});
|
|
379
|
-
|
|
380
|
-
// Custom hooks for better separation of concerns
|
|
381
|
-
const useFeedbackForm = () => {
|
|
382
|
-
const [feedbackData, setFeedbackData] = useState<FeedbackData>({
|
|
383
|
-
type: 'general',
|
|
384
|
-
title: '',
|
|
385
|
-
description: '',
|
|
386
|
-
priority: 'medium',
|
|
387
|
-
category: '',
|
|
388
|
-
contactEmail: '',
|
|
389
|
-
systemInfo: true,
|
|
390
|
-
});
|
|
391
|
-
|
|
392
|
-
const [feedbackState, setFeedbackState] = useState<FeedbackState>({
|
|
393
|
-
status: 'idle',
|
|
394
|
-
message: ''
|
|
395
|
-
});
|
|
396
|
-
|
|
397
|
-
const updateField = useCallback((field: keyof FeedbackData, value: any) => {
|
|
398
|
-
setFeedbackData(prev => ({ ...prev, [field]: value }));
|
|
399
|
-
}, []);
|
|
400
|
-
|
|
401
|
-
const resetForm = useCallback(() => {
|
|
402
|
-
setFeedbackData({
|
|
403
|
-
type: 'general',
|
|
404
|
-
title: '',
|
|
405
|
-
description: '',
|
|
406
|
-
priority: 'medium',
|
|
407
|
-
category: '',
|
|
408
|
-
contactEmail: '',
|
|
409
|
-
systemInfo: true,
|
|
410
|
-
});
|
|
411
|
-
setFeedbackState({ status: 'idle', message: '' });
|
|
412
|
-
}, []);
|
|
413
|
-
|
|
414
|
-
return {
|
|
415
|
-
feedbackData,
|
|
416
|
-
feedbackState,
|
|
417
|
-
setFeedbackState,
|
|
418
|
-
updateField,
|
|
419
|
-
resetForm
|
|
420
|
-
};
|
|
421
|
-
};
|
|
422
|
-
|
|
423
|
-
// Reusable components
|
|
424
|
-
const FormInput: React.FC<{
|
|
425
|
-
icon: string;
|
|
426
|
-
label: string;
|
|
427
|
-
value: string;
|
|
428
|
-
onChangeText: (text: string) => void;
|
|
429
|
-
placeholder?: string;
|
|
430
|
-
multiline?: boolean;
|
|
431
|
-
numberOfLines?: number;
|
|
432
|
-
testID?: string;
|
|
433
|
-
colors: any;
|
|
434
|
-
styles: any;
|
|
435
|
-
borderColor?: string;
|
|
436
|
-
}> = React.memo(({
|
|
437
|
-
icon,
|
|
438
|
-
label,
|
|
439
|
-
value,
|
|
440
|
-
onChangeText,
|
|
441
|
-
placeholder,
|
|
442
|
-
multiline = false,
|
|
443
|
-
numberOfLines = 1,
|
|
444
|
-
testID,
|
|
445
|
-
colors,
|
|
446
|
-
styles,
|
|
447
|
-
borderColor,
|
|
448
|
-
}) => (
|
|
449
|
-
<View style={styles.inputContainer}>
|
|
450
|
-
<View style={[
|
|
451
|
-
multiline ? styles.textAreaWrapper : styles.premiumInputWrapper,
|
|
452
|
-
{
|
|
453
|
-
borderColor: borderColor || colors.border,
|
|
454
|
-
backgroundColor: colors.inputBackground,
|
|
455
|
-
shadowColor: colors.primary,
|
|
456
|
-
shadowOffset: { width: 0, height: 4 },
|
|
457
|
-
shadowOpacity: 0.1,
|
|
458
|
-
shadowRadius: 12,
|
|
459
|
-
elevation: 3,
|
|
460
|
-
}
|
|
461
|
-
]}>
|
|
462
|
-
{!multiline && (
|
|
463
|
-
<Ionicons
|
|
464
|
-
name={icon as any}
|
|
465
|
-
size={22}
|
|
466
|
-
color={colors.secondaryText}
|
|
467
|
-
style={styles.inputIcon}
|
|
468
|
-
/>
|
|
469
|
-
)}
|
|
470
|
-
<View style={styles.inputContent}>
|
|
471
|
-
<Text style={[styles.modernLabel, { color: colors.secondaryText }]}>
|
|
472
|
-
{label}
|
|
473
|
-
</Text>
|
|
474
|
-
<TextInput
|
|
475
|
-
style={[
|
|
476
|
-
multiline ? styles.textArea : styles.modernInput,
|
|
477
|
-
{ color: colors.text }
|
|
478
|
-
]}
|
|
479
|
-
value={value}
|
|
480
|
-
onChangeText={onChangeText}
|
|
481
|
-
placeholder={placeholder}
|
|
482
|
-
placeholderTextColor={colors.secondaryText + '60'}
|
|
483
|
-
multiline={multiline}
|
|
484
|
-
numberOfLines={multiline ? numberOfLines : undefined}
|
|
485
|
-
testID={testID}
|
|
486
|
-
/>
|
|
487
|
-
</View>
|
|
488
|
-
</View>
|
|
489
|
-
</View>
|
|
490
|
-
));
|
|
491
|
-
|
|
492
|
-
const ProgressIndicator: React.FC<{ currentStep: number; totalSteps: number; colors: any; styles: any }> = React.memo(({ currentStep, totalSteps, colors, styles }) => (
|
|
493
|
-
<View style={styles.progressContainer}>
|
|
494
|
-
{Array.from({ length: totalSteps }, (_, index) => (
|
|
495
|
-
<View
|
|
496
|
-
key={index}
|
|
497
|
-
style={[
|
|
498
|
-
styles.progressDot,
|
|
499
|
-
currentStep === index ?
|
|
500
|
-
{ backgroundColor: colors.primary, width: 24 } :
|
|
501
|
-
{ backgroundColor: colors.border }
|
|
502
|
-
]}
|
|
503
|
-
/>
|
|
504
|
-
))}
|
|
505
|
-
</View>
|
|
506
|
-
));
|
|
23
|
+
import {
|
|
24
|
+
FormInput,
|
|
25
|
+
ProgressIndicator,
|
|
26
|
+
useFeedbackForm,
|
|
27
|
+
createFeedbackStyles,
|
|
28
|
+
FEEDBACK_TYPES,
|
|
29
|
+
PRIORITY_LEVELS,
|
|
30
|
+
CATEGORIES,
|
|
31
|
+
} from '../components/feedback';
|
|
507
32
|
|
|
508
|
-
// Main component
|
|
509
33
|
const FeedbackScreen: React.FC<BaseScreenProps> = ({
|
|
510
34
|
navigate,
|
|
511
35
|
goBack,
|
|
512
36
|
onClose,
|
|
513
37
|
theme,
|
|
514
38
|
}) => {
|
|
515
|
-
// Use useOxy() hook for OxyContext values
|
|
516
39
|
const { user, oxyServices } = useOxy();
|
|
517
40
|
const normalizedTheme = normalizeTheme(theme);
|
|
518
41
|
const colors = useThemeColors(normalizedTheme);
|
|
519
42
|
const { t } = useI18n();
|
|
520
43
|
|
|
521
|
-
// Form state
|
|
522
44
|
const { feedbackData, feedbackState, setFeedbackState, updateField, resetForm } = useFeedbackForm();
|
|
523
45
|
|
|
524
|
-
// UI state
|
|
525
46
|
const [currentStep, setCurrentStep] = useState(0);
|
|
526
47
|
const [errorMessage, setErrorMessage] = useState('');
|
|
527
48
|
|
|
528
|
-
// Animation refs
|
|
529
49
|
const fadeAnim = useRef(new Animated.Value(1)).current;
|
|
530
50
|
const slideAnim = useRef(new Animated.Value(0)).current;
|
|
531
51
|
|
|
532
|
-
|
|
533
|
-
const styles = useMemo(() => createStyles(colors, normalizedTheme), [colors, normalizedTheme]);
|
|
52
|
+
const styles = useMemo(() => createFeedbackStyles(colors as any), [colors]);
|
|
534
53
|
|
|
535
|
-
// Animation functions
|
|
536
54
|
const animateTransition = useCallback((nextStep: number) => {
|
|
537
55
|
Animated.timing(fadeAnim, {
|
|
538
56
|
toValue: 0,
|
|
@@ -569,7 +87,6 @@ const FeedbackScreen: React.FC<BaseScreenProps> = ({
|
|
|
569
87
|
}
|
|
570
88
|
}, [currentStep, animateTransition]);
|
|
571
89
|
|
|
572
|
-
// Form validation helpers
|
|
573
90
|
const isTypeStepValid = useCallback(() => {
|
|
574
91
|
return feedbackData.type && feedbackData.category;
|
|
575
92
|
}, [feedbackData.type, feedbackData.category]);
|
|
@@ -582,7 +99,6 @@ const FeedbackScreen: React.FC<BaseScreenProps> = ({
|
|
|
582
99
|
return feedbackData.contactEmail.trim() || user?.email;
|
|
583
100
|
}, [feedbackData.contactEmail, user?.email]);
|
|
584
101
|
|
|
585
|
-
// Submit feedback handler
|
|
586
102
|
const handleSubmitFeedback = useCallback(async () => {
|
|
587
103
|
if (!isTypeStepValid() || !isDetailsStepValid() || !isContactStepValid()) {
|
|
588
104
|
toast.error(t('feedback.toasts.fillRequired') || 'Please fill in all required fields');
|
|
@@ -593,7 +109,6 @@ const FeedbackScreen: React.FC<BaseScreenProps> = ({
|
|
|
593
109
|
setFeedbackState({ status: 'submitting', message: '' });
|
|
594
110
|
setErrorMessage('');
|
|
595
111
|
|
|
596
|
-
// Prepare feedback data
|
|
597
112
|
const feedbackPayload = {
|
|
598
113
|
type: feedbackData.type,
|
|
599
114
|
title: feedbackData.title,
|
|
@@ -611,15 +126,11 @@ const FeedbackScreen: React.FC<BaseScreenProps> = ({
|
|
|
611
126
|
} : undefined,
|
|
612
127
|
};
|
|
613
128
|
|
|
614
|
-
|
|
615
|
-
// Replace setTimeout simulation with actual API call: await oxyServices.submitFeedback(feedbackPayload)
|
|
616
|
-
// Currently simulates API call with setTimeout for development/testing purposes
|
|
617
|
-
await new Promise(resolve => setTimeout(resolve, 2000)); // Simulate API call
|
|
129
|
+
await oxyServices.submitFeedback(feedbackPayload);
|
|
618
130
|
|
|
619
131
|
setFeedbackState({ status: 'success', message: t('feedback.toasts.submitSuccess') || 'Feedback submitted successfully!' });
|
|
620
132
|
toast.success(t('feedback.toasts.thanks') || 'Thank you for your feedback!');
|
|
621
133
|
|
|
622
|
-
// Reset form after success
|
|
623
134
|
setTimeout(() => {
|
|
624
135
|
resetForm();
|
|
625
136
|
setCurrentStep(0);
|
|
@@ -629,24 +140,22 @@ const FeedbackScreen: React.FC<BaseScreenProps> = ({
|
|
|
629
140
|
setFeedbackState({ status: 'error', message: error.message || (t('feedback.toasts.submitFailed') || 'Failed to submit feedback') });
|
|
630
141
|
toast.error(error.message || (t('feedback.toasts.submitFailed') || 'Failed to submit feedback'));
|
|
631
142
|
}
|
|
632
|
-
}, [feedbackData, user, isTypeStepValid, isDetailsStepValid, isContactStepValid, resetForm]);
|
|
143
|
+
}, [feedbackData, user, isTypeStepValid, isDetailsStepValid, isContactStepValid, resetForm, setFeedbackState, t]);
|
|
633
144
|
|
|
634
|
-
// Step components
|
|
635
|
-
// Memoized grouped section items
|
|
636
145
|
const feedbackTypeItems = useMemo(() => FEEDBACK_TYPES.map(type => ({
|
|
637
146
|
id: type.id,
|
|
638
147
|
icon: type.icon,
|
|
639
148
|
iconColor: type.color,
|
|
640
149
|
title: type.label,
|
|
641
150
|
subtitle: type.description,
|
|
642
|
-
onPress: () => { updateField('type', type.id); updateField('category', ''); },
|
|
151
|
+
onPress: () => { updateField('type', type.id as any); updateField('category', ''); },
|
|
643
152
|
selected: feedbackData.type === type.id,
|
|
644
153
|
showChevron: false,
|
|
645
154
|
multiRow: true,
|
|
646
155
|
dense: true,
|
|
647
156
|
})), [feedbackData.type, updateField]);
|
|
648
157
|
|
|
649
|
-
const categoryItems = useMemo(() => (feedbackData.type ? (CATEGORIES[feedbackData.type
|
|
158
|
+
const categoryItems = useMemo(() => (feedbackData.type ? (CATEGORIES[feedbackData.type] || []).map(cat => ({
|
|
650
159
|
id: cat,
|
|
651
160
|
icon: feedbackData.category === cat ? 'check-circle' : 'ellipse-outline',
|
|
652
161
|
iconColor: feedbackData.category === cat ? colors.primary : colors.secondaryText,
|
|
@@ -662,17 +171,14 @@ const FeedbackScreen: React.FC<BaseScreenProps> = ({
|
|
|
662
171
|
icon: p.icon,
|
|
663
172
|
iconColor: p.color,
|
|
664
173
|
title: p.label,
|
|
665
|
-
onPress: () => updateField('priority', p.id),
|
|
174
|
+
onPress: () => updateField('priority', p.id as any),
|
|
666
175
|
selected: feedbackData.priority === p.id,
|
|
667
176
|
showChevron: false,
|
|
668
177
|
dense: true,
|
|
669
178
|
})), [feedbackData.priority, updateField]);
|
|
670
179
|
|
|
671
|
-
const renderTypeStep =
|
|
672
|
-
<Animated.View style={[
|
|
673
|
-
styles.stepContainer,
|
|
674
|
-
{ opacity: fadeAnim, transform: [{ translateX: slideAnim }] }
|
|
675
|
-
]}>
|
|
180
|
+
const renderTypeStep = () => (
|
|
181
|
+
<Animated.View style={[styles.stepContainer, { opacity: fadeAnim, transform: [{ translateX: slideAnim }] }]}>
|
|
676
182
|
<View style={styles.modernHeader}>
|
|
677
183
|
<Text style={[styles.stepTitle, { color: colors.text }]}>
|
|
678
184
|
{t('feedback.type.title') || 'What type of feedback?'}
|
|
@@ -687,7 +193,9 @@ const FeedbackScreen: React.FC<BaseScreenProps> = ({
|
|
|
687
193
|
|
|
688
194
|
{feedbackData.type && (
|
|
689
195
|
<View style={styles.categoryContainer}>
|
|
690
|
-
<Text style={[styles.modernLabel, { color: colors.secondaryText, marginBottom: 8 }]}>
|
|
196
|
+
<Text style={[styles.modernLabel, { color: colors.secondaryText, marginBottom: 8 }]}>
|
|
197
|
+
{t('feedback.category.label') || 'Category'}
|
|
198
|
+
</Text>
|
|
691
199
|
<View style={styles.fullBleed}>
|
|
692
200
|
<GroupedSection items={categoryItems} />
|
|
693
201
|
</View>
|
|
@@ -696,46 +204,31 @@ const FeedbackScreen: React.FC<BaseScreenProps> = ({
|
|
|
696
204
|
|
|
697
205
|
<View style={styles.navigationButtons}>
|
|
698
206
|
<TouchableOpacity
|
|
699
|
-
style={[styles.navButton, {
|
|
700
|
-
backgroundColor: 'transparent',
|
|
701
|
-
borderColor: colors.border,
|
|
702
|
-
shadowColor: colors.border,
|
|
703
|
-
borderTopLeftRadius: 35,
|
|
704
|
-
borderBottomLeftRadius: 35,
|
|
705
|
-
borderTopRightRadius: 35,
|
|
706
|
-
borderBottomRightRadius: 35,
|
|
707
|
-
}]}
|
|
207
|
+
style={[styles.navButton, { backgroundColor: 'transparent', borderColor: colors.border, borderRadius: 35 }]}
|
|
708
208
|
onPress={goBack}
|
|
209
|
+
accessibilityRole="button"
|
|
210
|
+
accessibilityLabel="Go back"
|
|
709
211
|
>
|
|
710
212
|
<Ionicons name="arrow-back" size={16} color={colors.text} />
|
|
711
213
|
<Text style={[styles.navButtonText, { color: colors.text }]}>{t('common.actions.back') || 'Back'}</Text>
|
|
712
214
|
</TouchableOpacity>
|
|
713
215
|
|
|
714
216
|
<TouchableOpacity
|
|
715
|
-
style={[styles.navButton, {
|
|
716
|
-
backgroundColor: colors.primary,
|
|
717
|
-
borderColor: colors.primary,
|
|
718
|
-
shadowColor: colors.primary,
|
|
719
|
-
borderTopLeftRadius: 35,
|
|
720
|
-
borderBottomLeftRadius: 35,
|
|
721
|
-
borderTopRightRadius: 35,
|
|
722
|
-
borderBottomRightRadius: 35,
|
|
723
|
-
}]}
|
|
217
|
+
style={[styles.navButton, { backgroundColor: colors.primary, borderColor: colors.primary, borderRadius: 35 }]}
|
|
724
218
|
onPress={nextStep}
|
|
725
219
|
disabled={!isTypeStepValid()}
|
|
220
|
+
accessibilityRole="button"
|
|
221
|
+
accessibilityLabel="Continue to next step"
|
|
726
222
|
>
|
|
727
223
|
<Text style={[styles.navButtonText, { color: '#FFFFFF' }]}>{t('common.actions.next') || 'Next'}</Text>
|
|
728
224
|
<Ionicons name="arrow-forward" size={16} color="#FFFFFF" />
|
|
729
225
|
</TouchableOpacity>
|
|
730
226
|
</View>
|
|
731
227
|
</Animated.View>
|
|
732
|
-
)
|
|
228
|
+
);
|
|
733
229
|
|
|
734
|
-
const renderDetailsStep =
|
|
735
|
-
<Animated.View style={[
|
|
736
|
-
styles.stepContainer,
|
|
737
|
-
{ opacity: fadeAnim, transform: [{ translateX: slideAnim }] }
|
|
738
|
-
]}>
|
|
230
|
+
const renderDetailsStep = () => (
|
|
231
|
+
<Animated.View style={[styles.stepContainer, { opacity: fadeAnim, transform: [{ translateX: slideAnim }] }]}>
|
|
739
232
|
<View style={styles.modernHeader}>
|
|
740
233
|
<Text style={[styles.stepTitle, { color: colors.text }]}>
|
|
741
234
|
{t('feedback.details.title') || 'Tell us more'}
|
|
@@ -749,34 +242,34 @@ const FeedbackScreen: React.FC<BaseScreenProps> = ({
|
|
|
749
242
|
icon="create-outline"
|
|
750
243
|
label={t('feedback.fields.title.label') || 'Title'}
|
|
751
244
|
value={feedbackData.title}
|
|
752
|
-
onChangeText={(text) => {
|
|
753
|
-
updateField('title', text);
|
|
754
|
-
setErrorMessage('');
|
|
755
|
-
}}
|
|
245
|
+
onChangeText={(text) => { updateField('title', text); setErrorMessage(''); }}
|
|
756
246
|
placeholder={t('feedback.fields.title.placeholder') || 'Brief summary of your feedback'}
|
|
757
247
|
testID="feedback-title-input"
|
|
758
|
-
colors={colors}
|
|
248
|
+
colors={colors as any}
|
|
759
249
|
styles={styles}
|
|
250
|
+
accessibilityLabel="Feedback title"
|
|
251
|
+
accessibilityHint="Enter a brief summary of your feedback"
|
|
760
252
|
/>
|
|
761
253
|
|
|
762
254
|
<FormInput
|
|
763
255
|
icon="document-text-outline"
|
|
764
256
|
label={t('feedback.fields.description.label') || 'Description'}
|
|
765
257
|
value={feedbackData.description}
|
|
766
|
-
onChangeText={(text) => {
|
|
767
|
-
updateField('description', text);
|
|
768
|
-
setErrorMessage('');
|
|
769
|
-
}}
|
|
258
|
+
onChangeText={(text) => { updateField('description', text); setErrorMessage(''); }}
|
|
770
259
|
placeholder={t('feedback.fields.description.placeholder') || 'Please provide detailed information...'}
|
|
771
260
|
multiline={true}
|
|
772
261
|
numberOfLines={6}
|
|
773
262
|
testID="feedback-description-input"
|
|
774
|
-
colors={colors}
|
|
263
|
+
colors={colors as any}
|
|
775
264
|
styles={styles}
|
|
265
|
+
accessibilityLabel="Feedback description"
|
|
266
|
+
accessibilityHint="Provide detailed information about your feedback"
|
|
776
267
|
/>
|
|
777
268
|
|
|
778
269
|
<View style={{ marginBottom: 24 }}>
|
|
779
|
-
<Text style={[styles.modernLabel, { color: colors.secondaryText, marginBottom: 8 }]}>
|
|
270
|
+
<Text style={[styles.modernLabel, { color: colors.secondaryText, marginBottom: 8 }]}>
|
|
271
|
+
{t('feedback.priority.label') || 'Priority Level'}
|
|
272
|
+
</Text>
|
|
780
273
|
<View style={styles.fullBleed}>
|
|
781
274
|
<GroupedSection items={priorityItems} />
|
|
782
275
|
</View>
|
|
@@ -784,37 +277,31 @@ const FeedbackScreen: React.FC<BaseScreenProps> = ({
|
|
|
784
277
|
|
|
785
278
|
<View style={styles.navigationButtons}>
|
|
786
279
|
<TouchableOpacity
|
|
787
|
-
style={[styles.navButton, styles.backButton, {
|
|
788
|
-
borderColor: colors.border,
|
|
789
|
-
shadowColor: colors.border,
|
|
790
|
-
}]}
|
|
280
|
+
style={[styles.navButton, styles.backButton, { borderColor: colors.border }]}
|
|
791
281
|
onPress={prevStep}
|
|
282
|
+
accessibilityRole="button"
|
|
283
|
+
accessibilityLabel="Go back"
|
|
792
284
|
>
|
|
793
285
|
<Ionicons name="arrow-back" size={16} color={colors.text} />
|
|
794
286
|
<Text style={[styles.navButtonText, { color: colors.text }]}>{t('common.actions.back') || 'Back'}</Text>
|
|
795
287
|
</TouchableOpacity>
|
|
796
288
|
|
|
797
289
|
<TouchableOpacity
|
|
798
|
-
style={[styles.navButton, styles.nextButton, {
|
|
799
|
-
backgroundColor: colors.primary,
|
|
800
|
-
borderColor: colors.primary,
|
|
801
|
-
shadowColor: colors.primary,
|
|
802
|
-
}]}
|
|
290
|
+
style={[styles.navButton, styles.nextButton, { backgroundColor: colors.primary, borderColor: colors.primary }]}
|
|
803
291
|
onPress={nextStep}
|
|
804
292
|
disabled={!isDetailsStepValid()}
|
|
293
|
+
accessibilityRole="button"
|
|
294
|
+
accessibilityLabel="Continue to next step"
|
|
805
295
|
>
|
|
806
296
|
<Text style={[styles.navButtonText, { color: '#FFFFFF' }]}>{t('common.actions.next') || 'Next'}</Text>
|
|
807
297
|
<Ionicons name="arrow-forward" size={16} color="#FFFFFF" />
|
|
808
298
|
</TouchableOpacity>
|
|
809
299
|
</View>
|
|
810
300
|
</Animated.View>
|
|
811
|
-
)
|
|
301
|
+
);
|
|
812
302
|
|
|
813
|
-
const renderContactStep =
|
|
814
|
-
<Animated.View style={[
|
|
815
|
-
styles.stepContainer,
|
|
816
|
-
{ opacity: fadeAnim, transform: [{ translateX: slideAnim }] }
|
|
817
|
-
]}>
|
|
303
|
+
const renderContactStep = () => (
|
|
304
|
+
<Animated.View style={[styles.stepContainer, { opacity: fadeAnim, transform: [{ translateX: slideAnim }] }]}>
|
|
818
305
|
<View style={styles.modernHeader}>
|
|
819
306
|
<Text style={[styles.stepTitle, { color: colors.text }]}>
|
|
820
307
|
{t('feedback.contact.title') || 'Contact Information'}
|
|
@@ -828,14 +315,13 @@ const FeedbackScreen: React.FC<BaseScreenProps> = ({
|
|
|
828
315
|
icon="mail-outline"
|
|
829
316
|
label={t('feedback.fields.email.label') || 'Email Address'}
|
|
830
317
|
value={feedbackData.contactEmail}
|
|
831
|
-
onChangeText={(text) => {
|
|
832
|
-
updateField('contactEmail', text);
|
|
833
|
-
setErrorMessage('');
|
|
834
|
-
}}
|
|
318
|
+
onChangeText={(text) => { updateField('contactEmail', text); setErrorMessage(''); }}
|
|
835
319
|
placeholder={user?.email || (t('feedback.fields.email.placeholder') || 'Enter your email address')}
|
|
836
320
|
testID="feedback-email-input"
|
|
837
|
-
colors={colors}
|
|
321
|
+
colors={colors as any}
|
|
838
322
|
styles={styles}
|
|
323
|
+
accessibilityLabel="Email address"
|
|
324
|
+
accessibilityHint="Enter your email so we can respond"
|
|
839
325
|
/>
|
|
840
326
|
|
|
841
327
|
<View style={styles.checkboxContainer}>
|
|
@@ -848,10 +334,11 @@ const FeedbackScreen: React.FC<BaseScreenProps> = ({
|
|
|
848
334
|
}
|
|
849
335
|
]}
|
|
850
336
|
onPress={() => updateField('systemInfo', !feedbackData.systemInfo)}
|
|
337
|
+
accessibilityRole="checkbox"
|
|
338
|
+
accessibilityState={{ checked: feedbackData.systemInfo }}
|
|
339
|
+
accessibilityLabel="Include system information"
|
|
851
340
|
>
|
|
852
|
-
{feedbackData.systemInfo &&
|
|
853
|
-
<Ionicons name="checkmark" size={16} color="#FFFFFF" />
|
|
854
|
-
)}
|
|
341
|
+
{feedbackData.systemInfo && <Ionicons name="checkmark" size={16} color="#FFFFFF" />}
|
|
855
342
|
</TouchableOpacity>
|
|
856
343
|
<Text style={[styles.checkboxText, { color: colors.text }]}>
|
|
857
344
|
{t('feedback.contact.includeSystemInfo') || 'Include system information to help us better understand your issue'}
|
|
@@ -860,37 +347,31 @@ const FeedbackScreen: React.FC<BaseScreenProps> = ({
|
|
|
860
347
|
|
|
861
348
|
<View style={styles.navigationButtons}>
|
|
862
349
|
<TouchableOpacity
|
|
863
|
-
style={[styles.navButton, styles.backButton, {
|
|
864
|
-
borderColor: colors.border,
|
|
865
|
-
shadowColor: colors.border,
|
|
866
|
-
}]}
|
|
350
|
+
style={[styles.navButton, styles.backButton, { borderColor: colors.border }]}
|
|
867
351
|
onPress={prevStep}
|
|
352
|
+
accessibilityRole="button"
|
|
353
|
+
accessibilityLabel="Go back"
|
|
868
354
|
>
|
|
869
355
|
<Ionicons name="arrow-back" size={16} color={colors.text} />
|
|
870
356
|
<Text style={[styles.navButtonText, { color: colors.text }]}>Back</Text>
|
|
871
357
|
</TouchableOpacity>
|
|
872
358
|
|
|
873
359
|
<TouchableOpacity
|
|
874
|
-
style={[styles.navButton, styles.nextButton, {
|
|
875
|
-
backgroundColor: colors.primary,
|
|
876
|
-
borderColor: colors.primary,
|
|
877
|
-
shadowColor: colors.primary,
|
|
878
|
-
}]}
|
|
360
|
+
style={[styles.navButton, styles.nextButton, { backgroundColor: colors.primary, borderColor: colors.primary }]}
|
|
879
361
|
onPress={nextStep}
|
|
880
362
|
disabled={!isContactStepValid()}
|
|
363
|
+
accessibilityRole="button"
|
|
364
|
+
accessibilityLabel="Continue to summary"
|
|
881
365
|
>
|
|
882
366
|
<Text style={[styles.navButtonText, { color: '#FFFFFF' }]}>Next</Text>
|
|
883
367
|
<Ionicons name="arrow-forward" size={16} color="#FFFFFF" />
|
|
884
368
|
</TouchableOpacity>
|
|
885
369
|
</View>
|
|
886
370
|
</Animated.View>
|
|
887
|
-
)
|
|
371
|
+
);
|
|
888
372
|
|
|
889
|
-
const renderSummaryStep =
|
|
890
|
-
<Animated.View style={[
|
|
891
|
-
styles.stepContainer,
|
|
892
|
-
{ opacity: fadeAnim, transform: [{ translateX: slideAnim }] }
|
|
893
|
-
]}>
|
|
373
|
+
const renderSummaryStep = () => (
|
|
374
|
+
<Animated.View style={[styles.stepContainer, { opacity: fadeAnim, transform: [{ translateX: slideAnim }] }]}>
|
|
894
375
|
<View style={styles.modernHeader}>
|
|
895
376
|
<Text style={[styles.stepTitle, { color: colors.text }]}>
|
|
896
377
|
{t('feedback.summary.title') || 'Summary'}
|
|
@@ -902,31 +383,27 @@ const FeedbackScreen: React.FC<BaseScreenProps> = ({
|
|
|
902
383
|
|
|
903
384
|
<View style={styles.summaryContainer}>
|
|
904
385
|
<View style={styles.summaryRow}>
|
|
905
|
-
<Text style={[styles.summaryLabel, { color: colors.secondaryText }]}>
|
|
386
|
+
<Text style={[styles.summaryLabel, { color: colors.secondaryText }]}>Type:</Text>
|
|
906
387
|
<Text style={[styles.summaryValue, { color: colors.text }]}>
|
|
907
388
|
{FEEDBACK_TYPES.find(t => t.id === feedbackData.type)?.label}
|
|
908
389
|
</Text>
|
|
909
390
|
</View>
|
|
910
|
-
|
|
911
391
|
<View style={styles.summaryRow}>
|
|
912
|
-
<Text style={[styles.summaryLabel, { color: colors.secondaryText }]}>
|
|
392
|
+
<Text style={[styles.summaryLabel, { color: colors.secondaryText }]}>Category:</Text>
|
|
913
393
|
<Text style={[styles.summaryValue, { color: colors.text }]}>{feedbackData.category}</Text>
|
|
914
394
|
</View>
|
|
915
|
-
|
|
916
395
|
<View style={styles.summaryRow}>
|
|
917
|
-
<Text style={[styles.summaryLabel, { color: colors.secondaryText }]}>
|
|
396
|
+
<Text style={[styles.summaryLabel, { color: colors.secondaryText }]}>Priority:</Text>
|
|
918
397
|
<Text style={[styles.summaryValue, { color: colors.text }]}>
|
|
919
398
|
{PRIORITY_LEVELS.find(p => p.id === feedbackData.priority)?.label}
|
|
920
399
|
</Text>
|
|
921
400
|
</View>
|
|
922
|
-
|
|
923
401
|
<View style={styles.summaryRow}>
|
|
924
|
-
<Text style={[styles.summaryLabel, { color: colors.secondaryText }]}>
|
|
402
|
+
<Text style={[styles.summaryLabel, { color: colors.secondaryText }]}>Title:</Text>
|
|
925
403
|
<Text style={[styles.summaryValue, { color: colors.text }]}>{feedbackData.title}</Text>
|
|
926
404
|
</View>
|
|
927
|
-
|
|
928
405
|
<View style={styles.summaryRow}>
|
|
929
|
-
<Text style={[styles.summaryLabel, { color: colors.secondaryText }]}>
|
|
406
|
+
<Text style={[styles.summaryLabel, { color: colors.secondaryText }]}>Contact:</Text>
|
|
930
407
|
<Text style={[styles.summaryValue, { color: colors.text }]}>
|
|
931
408
|
{feedbackData.contactEmail || user?.email}
|
|
932
409
|
</Text>
|
|
@@ -938,6 +415,8 @@ const FeedbackScreen: React.FC<BaseScreenProps> = ({
|
|
|
938
415
|
onPress={handleSubmitFeedback}
|
|
939
416
|
disabled={feedbackState.status === 'submitting'}
|
|
940
417
|
testID="submit-feedback-button"
|
|
418
|
+
accessibilityRole="button"
|
|
419
|
+
accessibilityLabel="Submit feedback"
|
|
941
420
|
>
|
|
942
421
|
{feedbackState.status === 'submitting' ? (
|
|
943
422
|
<ActivityIndicator color="#FFFFFF" size="small" />
|
|
@@ -951,32 +430,23 @@ const FeedbackScreen: React.FC<BaseScreenProps> = ({
|
|
|
951
430
|
|
|
952
431
|
<View style={styles.navigationButtons}>
|
|
953
432
|
<TouchableOpacity
|
|
954
|
-
style={[styles.navButton, {
|
|
955
|
-
backgroundColor: 'transparent',
|
|
956
|
-
borderColor: colors.border,
|
|
957
|
-
shadowColor: colors.border,
|
|
958
|
-
borderTopLeftRadius: 35,
|
|
959
|
-
borderBottomLeftRadius: 35,
|
|
960
|
-
borderTopRightRadius: 35,
|
|
961
|
-
borderBottomRightRadius: 35,
|
|
962
|
-
}]}
|
|
433
|
+
style={[styles.navButton, { backgroundColor: 'transparent', borderColor: colors.border, borderRadius: 35 }]}
|
|
963
434
|
onPress={prevStep}
|
|
435
|
+
accessibilityRole="button"
|
|
436
|
+
accessibilityLabel="Go back"
|
|
964
437
|
>
|
|
965
438
|
<Ionicons name="arrow-back" size={16} color={colors.text} />
|
|
966
439
|
<Text style={[styles.navButtonText, { color: colors.text }]}>{t('common.actions.back') || 'Back'}</Text>
|
|
967
440
|
</TouchableOpacity>
|
|
968
441
|
</View>
|
|
969
442
|
</Animated.View>
|
|
970
|
-
)
|
|
443
|
+
);
|
|
971
444
|
|
|
972
|
-
const renderSuccessStep =
|
|
973
|
-
<Animated.View style={[
|
|
974
|
-
styles.stepContainer,
|
|
975
|
-
{ opacity: fadeAnim, transform: [{ translateX: slideAnim }] }
|
|
976
|
-
]}>
|
|
445
|
+
const renderSuccessStep = () => (
|
|
446
|
+
<Animated.View style={[styles.stepContainer, { opacity: fadeAnim, transform: [{ translateX: slideAnim }] }]}>
|
|
977
447
|
<View style={styles.successContainer}>
|
|
978
|
-
<View style={[styles.successIcon, { backgroundColor: colors.success + '20', padding: 24, borderRadius: 50 }]}>
|
|
979
|
-
<Ionicons name="checkmark-circle" size={48} color={colors.success} />
|
|
448
|
+
<View style={[styles.successIcon, { backgroundColor: (colors.success || '#34C759') + '20', padding: 24, borderRadius: 50 }]}>
|
|
449
|
+
<Ionicons name="checkmark-circle" size={48} color={colors.success || '#34C759'} />
|
|
980
450
|
</View>
|
|
981
451
|
<Text style={[styles.successTitle, { color: colors.text }]}>
|
|
982
452
|
{t('feedback.success.thanks') || 'Thank You!'}
|
|
@@ -986,23 +456,18 @@ const FeedbackScreen: React.FC<BaseScreenProps> = ({
|
|
|
986
456
|
</Text>
|
|
987
457
|
<TouchableOpacity
|
|
988
458
|
style={[styles.button, { backgroundColor: colors.primary }]}
|
|
989
|
-
onPress={() => {
|
|
990
|
-
|
|
991
|
-
|
|
992
|
-
}}
|
|
459
|
+
onPress={() => { resetForm(); setCurrentStep(0); }}
|
|
460
|
+
accessibilityRole="button"
|
|
461
|
+
accessibilityLabel="Submit another feedback"
|
|
993
462
|
>
|
|
994
463
|
<Text style={styles.buttonText}>{t('feedback.actions.submitAnother') || 'Submit Another'}</Text>
|
|
995
464
|
</TouchableOpacity>
|
|
996
465
|
</View>
|
|
997
466
|
</Animated.View>
|
|
998
|
-
)
|
|
999
|
-
|
|
1000
|
-
// Render current step
|
|
1001
|
-
const renderCurrentStep = useCallback(() => {
|
|
1002
|
-
if (feedbackState.status === 'success') {
|
|
1003
|
-
return renderSuccessStep();
|
|
1004
|
-
}
|
|
467
|
+
);
|
|
1005
468
|
|
|
469
|
+
const renderCurrentStep = () => {
|
|
470
|
+
if (feedbackState.status === 'success') return renderSuccessStep();
|
|
1006
471
|
switch (currentStep) {
|
|
1007
472
|
case 0: return renderTypeStep();
|
|
1008
473
|
case 1: return renderDetailsStep();
|
|
@@ -1010,7 +475,7 @@ const FeedbackScreen: React.FC<BaseScreenProps> = ({
|
|
|
1010
475
|
case 3: return renderSummaryStep();
|
|
1011
476
|
default: return renderTypeStep();
|
|
1012
477
|
}
|
|
1013
|
-
}
|
|
478
|
+
};
|
|
1014
479
|
|
|
1015
480
|
return (
|
|
1016
481
|
<KeyboardAvoidingView
|
|
@@ -1028,7 +493,7 @@ const FeedbackScreen: React.FC<BaseScreenProps> = ({
|
|
|
1028
493
|
keyboardShouldPersistTaps="handled"
|
|
1029
494
|
>
|
|
1030
495
|
{feedbackState.status !== 'success' && (
|
|
1031
|
-
<ProgressIndicator currentStep={currentStep} totalSteps={4} colors={colors} styles={styles} />
|
|
496
|
+
<ProgressIndicator currentStep={currentStep} totalSteps={4} colors={colors as any} styles={styles} />
|
|
1032
497
|
)}
|
|
1033
498
|
{renderCurrentStep()}
|
|
1034
499
|
</ScrollView>
|
|
@@ -1036,4 +501,4 @@ const FeedbackScreen: React.FC<BaseScreenProps> = ({
|
|
|
1036
501
|
);
|
|
1037
502
|
};
|
|
1038
503
|
|
|
1039
|
-
export default FeedbackScreen;
|
|
504
|
+
export default FeedbackScreen;
|