@varunindiit/create-rn-starter 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (243) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +93 -0
  3. package/bin/index.js +270 -0
  4. package/lib/prompt.js +63 -0
  5. package/lib/rename.js +239 -0
  6. package/lib/scaffold.js +110 -0
  7. package/lib/utils.js +122 -0
  8. package/package.json +38 -0
  9. package/template/.eslintrc.js +4 -0
  10. package/template/.prettierrc.js +5 -0
  11. package/template/.watchmanconfig +1 -0
  12. package/template/App.tsx +100 -0
  13. package/template/Gemfile +17 -0
  14. package/template/README.md +97 -0
  15. package/template/__tests__/App.test.tsx +13 -0
  16. package/template/_gitignore +75 -0
  17. package/template/android/app/build.gradle +119 -0
  18. package/template/android/app/debug.keystore +0 -0
  19. package/template/android/app/proguard-rules.pro +10 -0
  20. package/template/android/app/src/main/AndroidManifest.xml +45 -0
  21. package/template/android/app/src/main/assets/fonts/MonaSans-Black.ttf +0 -0
  22. package/template/android/app/src/main/assets/fonts/MonaSans-BlackItalic.ttf +0 -0
  23. package/template/android/app/src/main/assets/fonts/MonaSans-Bold.ttf +0 -0
  24. package/template/android/app/src/main/assets/fonts/MonaSans-BoldItalic.ttf +0 -0
  25. package/template/android/app/src/main/assets/fonts/MonaSans-ExtraBold.ttf +0 -0
  26. package/template/android/app/src/main/assets/fonts/MonaSans-ExtraBoldItalic.ttf +0 -0
  27. package/template/android/app/src/main/assets/fonts/MonaSans-ExtraLight.ttf +0 -0
  28. package/template/android/app/src/main/assets/fonts/MonaSans-ExtraLightItalic.ttf +0 -0
  29. package/template/android/app/src/main/assets/fonts/MonaSans-Italic.ttf +0 -0
  30. package/template/android/app/src/main/assets/fonts/MonaSans-Light.ttf +0 -0
  31. package/template/android/app/src/main/assets/fonts/MonaSans-LightItalic.ttf +0 -0
  32. package/template/android/app/src/main/assets/fonts/MonaSans-Medium.ttf +0 -0
  33. package/template/android/app/src/main/assets/fonts/MonaSans-MediumItalic.ttf +0 -0
  34. package/template/android/app/src/main/assets/fonts/MonaSans-Regular.ttf +0 -0
  35. package/template/android/app/src/main/assets/fonts/MonaSans-SemiBold.ttf +0 -0
  36. package/template/android/app/src/main/assets/fonts/MonaSans-SemiBoldItalic.ttf +0 -0
  37. package/template/android/app/src/main/java/com/awesomeproject/MainActivity.kt +22 -0
  38. package/template/android/app/src/main/java/com/awesomeproject/MainApplication.kt +27 -0
  39. package/template/android/app/src/main/res/drawable/launch_screen.png +0 -0
  40. package/template/android/app/src/main/res/drawable/rn_edit_text_material.xml +37 -0
  41. package/template/android/app/src/main/res/layout/launch_screen.xml +12 -0
  42. package/template/android/app/src/main/res/mipmap-hdpi/ic_launcher.png +0 -0
  43. package/template/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png +0 -0
  44. package/template/android/app/src/main/res/mipmap-mdpi/ic_launcher.png +0 -0
  45. package/template/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png +0 -0
  46. package/template/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png +0 -0
  47. package/template/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png +0 -0
  48. package/template/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png +0 -0
  49. package/template/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png +0 -0
  50. package/template/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png +0 -0
  51. package/template/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png +0 -0
  52. package/template/android/app/src/main/res/values/colors.xml +3 -0
  53. package/template/android/app/src/main/res/values/strings.xml +3 -0
  54. package/template/android/app/src/main/res/values/styles.xml +11 -0
  55. package/template/android/build.gradle +21 -0
  56. package/template/android/gradle/wrapper/gradle-wrapper.jar +0 -0
  57. package/template/android/gradle/wrapper/gradle-wrapper.properties +7 -0
  58. package/template/android/gradle.properties +44 -0
  59. package/template/android/gradlew +248 -0
  60. package/template/android/gradlew.bat +98 -0
  61. package/template/android/link-assets-manifest.json +69 -0
  62. package/template/android/settings.gradle +6 -0
  63. package/template/app.json +4 -0
  64. package/template/babel.config.js +4 -0
  65. package/template/declarations.d.ts +6 -0
  66. package/template/env.example +20 -0
  67. package/template/index.js +10 -0
  68. package/template/ios/.xcode.env +11 -0
  69. package/template/ios/.xcode.env.local +1 -0
  70. package/template/ios/AwesomeProject/AppDelegate.swift +60 -0
  71. package/template/ios/AwesomeProject/Images.xcassets/AppIcon.appiconset/Contents.json +53 -0
  72. package/template/ios/AwesomeProject/Images.xcassets/Contents.json +6 -0
  73. package/template/ios/AwesomeProject/Images.xcassets/Splash.imageset/Contents.json +23 -0
  74. package/template/ios/AwesomeProject/Images.xcassets/Splash.imageset/Splash@1x.png +0 -0
  75. package/template/ios/AwesomeProject/Images.xcassets/Splash.imageset/Splash@2x.png +0 -0
  76. package/template/ios/AwesomeProject/Images.xcassets/Splash.imageset/Splash@3x.png +0 -0
  77. package/template/ios/AwesomeProject/Info.plist +89 -0
  78. package/template/ios/AwesomeProject/LaunchScreen.storyboard +40 -0
  79. package/template/ios/AwesomeProject/PrivacyInfo.xcprivacy +38 -0
  80. package/template/ios/AwesomeProject.xcodeproj/project.pbxproj +576 -0
  81. package/template/ios/AwesomeProject.xcodeproj/xcshareddata/xcschemes/AwesomeProject.xcscheme +88 -0
  82. package/template/ios/AwesomeProject.xcworkspace/contents.xcworkspacedata +10 -0
  83. package/template/ios/Podfile +68 -0
  84. package/template/ios/link-assets-manifest.json +69 -0
  85. package/template/jest.config.js +3 -0
  86. package/template/metro.config.js +24 -0
  87. package/template/package.json +68 -0
  88. package/template/react-native.config.js +7 -0
  89. package/template/src/assets/fonts/MonaSans-Black.ttf +0 -0
  90. package/template/src/assets/fonts/MonaSans-BlackItalic.ttf +0 -0
  91. package/template/src/assets/fonts/MonaSans-Bold.ttf +0 -0
  92. package/template/src/assets/fonts/MonaSans-BoldItalic.ttf +0 -0
  93. package/template/src/assets/fonts/MonaSans-ExtraBold.ttf +0 -0
  94. package/template/src/assets/fonts/MonaSans-ExtraBoldItalic.ttf +0 -0
  95. package/template/src/assets/fonts/MonaSans-ExtraLight.ttf +0 -0
  96. package/template/src/assets/fonts/MonaSans-ExtraLightItalic.ttf +0 -0
  97. package/template/src/assets/fonts/MonaSans-Italic.ttf +0 -0
  98. package/template/src/assets/fonts/MonaSans-Light.ttf +0 -0
  99. package/template/src/assets/fonts/MonaSans-LightItalic.ttf +0 -0
  100. package/template/src/assets/fonts/MonaSans-Medium.ttf +0 -0
  101. package/template/src/assets/fonts/MonaSans-MediumItalic.ttf +0 -0
  102. package/template/src/assets/fonts/MonaSans-Regular.ttf +0 -0
  103. package/template/src/assets/fonts/MonaSans-SemiBold.ttf +0 -0
  104. package/template/src/assets/fonts/MonaSans-SemiBoldItalic.ttf +0 -0
  105. package/template/src/assets/image/BackGroundAuth.png +0 -0
  106. package/template/src/assets/image/BackgroundVerification.png +0 -0
  107. package/template/src/assets/image/logo.png +0 -0
  108. package/template/src/assets/svg/add-circle.svg +5 -0
  109. package/template/src/assets/svg/airConditioning.svg +12 -0
  110. package/template/src/assets/svg/apple.svg +3 -0
  111. package/template/src/assets/svg/arrowDown.svg +3 -0
  112. package/template/src/assets/svg/back.svg +10 -0
  113. package/template/src/assets/svg/bag.svg +11 -0
  114. package/template/src/assets/svg/calender.svg +5 -0
  115. package/template/src/assets/svg/car.svg +10 -0
  116. package/template/src/assets/svg/carConfirm.svg +60 -0
  117. package/template/src/assets/svg/chatActive.svg +3 -0
  118. package/template/src/assets/svg/chatUnActive.svg +3 -0
  119. package/template/src/assets/svg/document-text.svg +6 -0
  120. package/template/src/assets/svg/gender.svg +11 -0
  121. package/template/src/assets/svg/google.svg +6 -0
  122. package/template/src/assets/svg/headphone.svg +3 -0
  123. package/template/src/assets/svg/homeActive.svg +3 -0
  124. package/template/src/assets/svg/homeUnActive.svg +3 -0
  125. package/template/src/assets/svg/logo.svg +18 -0
  126. package/template/src/assets/svg/logout.svg +5 -0
  127. package/template/src/assets/svg/maxBack.svg +4 -0
  128. package/template/src/assets/svg/message-text.svg +7 -0
  129. package/template/src/assets/svg/music.svg +5 -0
  130. package/template/src/assets/svg/noSmoking.svg +10 -0
  131. package/template/src/assets/svg/notification.svg +5 -0
  132. package/template/src/assets/svg/passenger.svg +4 -0
  133. package/template/src/assets/svg/phone.svg +3 -0
  134. package/template/src/assets/svg/rightArrow.svg +3 -0
  135. package/template/src/assets/svg/security-user.svg +5 -0
  136. package/template/src/assets/svg/star.svg +3 -0
  137. package/template/src/assets/svg/tick-circle.svg +4 -0
  138. package/template/src/assets/svg/trafficLight.svg +41 -0
  139. package/template/src/assets/svg/tripActive.svg +10 -0
  140. package/template/src/assets/svg/tripUnActive.svg +10 -0
  141. package/template/src/assets/svg/usbChargers.svg +3 -0
  142. package/template/src/assets/svg/user.svg +4 -0
  143. package/template/src/assets/svg/userActive.svg +3 -0
  144. package/template/src/assets/svg/userPlaceholder.svg +3 -0
  145. package/template/src/assets/svg/userUnActive.svg +3 -0
  146. package/template/src/components/AuthLayout/AuthLayout.tsx +170 -0
  147. package/template/src/components/AuthLayout/index.ts +1 -0
  148. package/template/src/components/BottomSheet/BottomSheet.tsx +73 -0
  149. package/template/src/components/BottomSheet/BottomSheetAlert.tsx +100 -0
  150. package/template/src/components/BottomSheet/CenterAlert.tsx +153 -0
  151. package/template/src/components/BottomSheet/index.ts +2 -0
  152. package/template/src/components/BottomTabBar/index.tsx +145 -0
  153. package/template/src/components/Button/RNButton.tsx +152 -0
  154. package/template/src/components/Button/index.ts +2 -0
  155. package/template/src/components/Common/Avatar.tsx +80 -0
  156. package/template/src/components/Common/Card.tsx +49 -0
  157. package/template/src/components/Common/CardBrandLogo.tsx +66 -0
  158. package/template/src/components/Common/Checkbox.tsx +65 -0
  159. package/template/src/components/Common/Chip.tsx +79 -0
  160. package/template/src/components/Common/CommonStyles.tsx +594 -0
  161. package/template/src/components/Common/Divider.tsx +33 -0
  162. package/template/src/components/Common/DriverTripCard.tsx +308 -0
  163. package/template/src/components/Common/Dropdown.tsx +161 -0
  164. package/template/src/components/Common/EmptyState.tsx +52 -0
  165. package/template/src/components/Common/FAB.tsx +68 -0
  166. package/template/src/components/Common/HeaderLocation.tsx +108 -0
  167. package/template/src/components/Common/Loader.tsx +23 -0
  168. package/template/src/components/Common/RatingStars.tsx +103 -0
  169. package/template/src/components/Common/RouteDots.tsx +98 -0
  170. package/template/src/components/Common/SegmentedControl.tsx +126 -0
  171. package/template/src/components/Common/SosButton.tsx +80 -0
  172. package/template/src/components/Common/SosSheet.tsx +344 -0
  173. package/template/src/components/Common/StarRating.tsx +58 -0
  174. package/template/src/components/Common/StatusBadge.tsx +56 -0
  175. package/template/src/components/Common/Toggle.tsx +66 -0
  176. package/template/src/components/Common/TripCard.tsx +247 -0
  177. package/template/src/components/Common/UploadBox.tsx +106 -0
  178. package/template/src/components/Container/MainContainer.tsx +76 -0
  179. package/template/src/components/Container/index.ts +1 -0
  180. package/template/src/components/Header/index.tsx +143 -0
  181. package/template/src/components/Icon/SvgIcons.tsx +1991 -0
  182. package/template/src/components/ImagePickerSheet/ImagePickerSheet.tsx +233 -0
  183. package/template/src/components/ImagePickerSheet/index.ts +2 -0
  184. package/template/src/components/Input/CountryDropdown.tsx +71 -0
  185. package/template/src/components/Input/OtpInput.tsx +117 -0
  186. package/template/src/components/Input/RNInput.tsx +138 -0
  187. package/template/src/components/Input/index.ts +4 -0
  188. package/template/src/components/Picker/DatePickerSheet.tsx +393 -0
  189. package/template/src/components/Picker/PassengerPickerSheet.tsx +237 -0
  190. package/template/src/components/Text/RNText.tsx +62 -0
  191. package/template/src/components/Text/index.ts +1 -0
  192. package/template/src/components/index.ts +44 -0
  193. package/template/src/hooks/useCurrentLocation.ts +72 -0
  194. package/template/src/localization/i18n.ts +29 -0
  195. package/template/src/localization/i18next.d.ts +11 -0
  196. package/template/src/localization/index.ts +4 -0
  197. package/template/src/localization/languageStorage.ts +27 -0
  198. package/template/src/localization/languages.ts +62 -0
  199. package/template/src/localization/resources/en.ts +703 -0
  200. package/template/src/localization/resources/fr.ts +703 -0
  201. package/template/src/localization/useLanguage.ts +42 -0
  202. package/template/src/navigation/AuthNavigation.tsx +23 -0
  203. package/template/src/navigation/BottomTabs.tsx +24 -0
  204. package/template/src/navigation/RootNavigation.tsx +27 -0
  205. package/template/src/navigation/RouteKey.ts +22 -0
  206. package/template/src/navigation/StackNavigation.tsx +52 -0
  207. package/template/src/navigation/paramLists.ts +25 -0
  208. package/template/src/redux/slice/app.ts +66 -0
  209. package/template/src/redux/slice/auth.ts +40 -0
  210. package/template/src/redux/slice/userProfile.ts +124 -0
  211. package/template/src/redux/store.ts +17 -0
  212. package/template/src/screen/auth/Login.tsx +69 -0
  213. package/template/src/screen/onboarding/LanguageSelection.tsx +231 -0
  214. package/template/src/screen/root/home/index.tsx +36 -0
  215. package/template/src/screen/root/profile/index.tsx +69 -0
  216. package/template/src/screen/shared/Chat.tsx +308 -0
  217. package/template/src/screen/shared/EditProfile.tsx +407 -0
  218. package/template/src/screen/shared/HelpSupport.tsx +678 -0
  219. package/template/src/screen/shared/LocationSearch.tsx +362 -0
  220. package/template/src/screen/shared/Messages.tsx +115 -0
  221. package/template/src/screen/shared/Notifications.tsx +86 -0
  222. package/template/src/screen/shared/PrivacyPolicy.tsx +297 -0
  223. package/template/src/screen/shared/Profile.tsx +118 -0
  224. package/template/src/screen/shared/Ratings.tsx +170 -0
  225. package/template/src/screen/shared/TermsConditions.tsx +315 -0
  226. package/template/src/screen/shared/profile/DriverProfile.tsx +262 -0
  227. package/template/src/screen/shared/profile/PassengerProfile.tsx +123 -0
  228. package/template/src/screen/shared/profile/ProfileParts.tsx +219 -0
  229. package/template/src/services/Config.ts +37 -0
  230. package/template/src/services/api.ts +37 -0
  231. package/template/src/services/index.ts +4 -0
  232. package/template/src/services/places.ts +320 -0
  233. package/template/src/services/storage.ts +33 -0
  234. package/template/src/theme/fonts.ts +30 -0
  235. package/template/src/theme/index.ts +3 -0
  236. package/template/src/theme/spacing.ts +66 -0
  237. package/template/src/theme/theme.ts +58 -0
  238. package/template/src/types/env.d.ts +8 -0
  239. package/template/src/types/index.ts +3 -0
  240. package/template/src/utils/card.ts +101 -0
  241. package/template/src/utils/constants.ts +39 -0
  242. package/template/src/utils/functions.ts +24 -0
  243. package/template/tsconfig.json +8 -0
@@ -0,0 +1,678 @@
1
+ import React, { useState } from 'react';
2
+ import {
3
+ LayoutAnimation,
4
+ Linking,
5
+ Platform,
6
+ Pressable,
7
+ ScrollView,
8
+ StyleSheet,
9
+ TouchableOpacity,
10
+ UIManager,
11
+ View,
12
+ } from 'react-native';
13
+ import { moderateScale } from 'react-native-size-matters';
14
+ import LinearGradient from 'react-native-linear-gradient';
15
+ import Svg, { Path, Circle } from 'react-native-svg';
16
+ import {
17
+ Card,
18
+ Header,
19
+ MainContainer,
20
+ RNButton,
21
+ RNText,
22
+ } from '../../components';
23
+ import { SPACING, THEME } from '../../theme';
24
+ import { useLanguage } from '../../localization';
25
+ import {
26
+ HeadphonesIcon,
27
+ QuestionIcon,
28
+ MailIcon,
29
+ PhoneIcon,
30
+ ChevronDownIcon,
31
+ ChevronUpIcon,
32
+ MessageIcon,
33
+ } from '../../components/Icon/SvgIcons';
34
+
35
+ if (
36
+ Platform.OS === 'android' &&
37
+ UIManager.setLayoutAnimationEnabledExperimental
38
+ ) {
39
+ UIManager.setLayoutAnimationEnabledExperimental(true);
40
+ }
41
+
42
+ const SUPPORT_PHONE = '+2348000000000';
43
+ const SUPPORT_EMAIL = 'support@hdwaka.com';
44
+
45
+ interface QuickAction {
46
+ key: string;
47
+ title: string;
48
+ subtitle: string;
49
+ gradient: [string, string];
50
+ icon: (size: number) => React.ReactNode;
51
+ onPress?: () => void;
52
+ }
53
+
54
+ interface Faq {
55
+ q: string;
56
+ a: string;
57
+ }
58
+
59
+ const FAQS: Faq[] = [
60
+ {
61
+ q: 'How do I book a ride on HD WAKA?',
62
+ a: 'Enter your pickup and drop-off locations on the Home screen, choose a ride from the available results, review the trip details and tap Book. You’ll get a confirmation as soon as the driver accepts.',
63
+ },
64
+ {
65
+ q: 'How can I cancel a ride?',
66
+ a: 'Open Trips, select the active booking, and tap Cancel Ride. Cancellations made before the driver arrives are free; late cancellations may incur a small fee.',
67
+ },
68
+ {
69
+ q: 'What payment methods are supported?',
70
+ a: 'HD WAKA supports debit and credit cards, bank transfers, mobile wallets, and cash for select routes. You can manage your saved methods in Profile › Payments.',
71
+ },
72
+ {
73
+ q: 'How do I become a driver?',
74
+ a: 'Switch your account role to Driver from the Profile screen, then upload your vehicle, licence and personal documents. Our team verifies submissions within 24–48 hours.',
75
+ },
76
+ {
77
+ q: 'How are fares calculated?',
78
+ a: 'Fares are based on distance, estimated time, demand and any active surcharges. The full breakdown is shown before you confirm the booking — no hidden fees.',
79
+ },
80
+ {
81
+ q: 'Is my data safe with HD WAKA?',
82
+ a: 'Yes. All your personal and payment information is encrypted in transit and at rest, and we never share it with third parties without your consent.',
83
+ },
84
+ ];
85
+
86
+ const HelpSupport: React.FC = () => {
87
+ const { t } = useLanguage();
88
+ const [openIdx, setOpenIdx] = useState<number | null>(0);
89
+
90
+ const toggle = (idx: number) => {
91
+ LayoutAnimation.configureNext(
92
+ LayoutAnimation.create(220, 'easeInEaseOut', 'opacity'),
93
+ );
94
+ setOpenIdx(prev => (prev === idx ? null : idx));
95
+ };
96
+
97
+ const callSupport = () => Linking.openURL(`tel:${SUPPORT_PHONE}`);
98
+ const emailSupport = () => Linking.openURL(`mailto:${SUPPORT_EMAIL}`);
99
+ const openWhatsApp = () =>
100
+ Linking.openURL(
101
+ `https://wa.me/${SUPPORT_PHONE.replace('+', '')}?text=Hi%20HD%20WAKA%20support`,
102
+ );
103
+
104
+ const QUICK_ACTIONS: QuickAction[] = [
105
+ {
106
+ key: 'chat',
107
+ title: t('help.liveChat'),
108
+ subtitle: 'Avg reply · 2 min',
109
+ gradient: ['#E87C3E', '#F08F4E'],
110
+ icon: size => <MessageIcon size={size} color="#FFFFFF" />,
111
+ onPress: openWhatsApp,
112
+ },
113
+ {
114
+ key: 'faqs',
115
+ title: t('help.faqs'),
116
+ subtitle: 'Find quick answers',
117
+ gradient: ['#3F8CFF', '#6BA4FF'],
118
+ icon: size => <QuestionIcon size={size} color="#FFFFFF" />,
119
+ },
120
+ {
121
+ key: 'report',
122
+ title: t('help.reportIssue'),
123
+ subtitle: 'We’re on it',
124
+ gradient: ['#E5484D', '#F26E72'],
125
+ icon: size => <ReportFlagIcon size={size} color="#FFFFFF" />,
126
+ onPress: emailSupport,
127
+ },
128
+ {
129
+ key: 'email',
130
+ title: t('help.emailUs'),
131
+ subtitle: 'Reply within 24h',
132
+ gradient: ['#1FA971', '#3FCC8A'],
133
+ icon: size => <MailIcon size={size} color="#FFFFFF" />,
134
+ onPress: emailSupport,
135
+ },
136
+ ];
137
+
138
+ return (
139
+ <MainContainer
140
+ gradient
141
+ statusBarStyle="dark-content"
142
+ >
143
+ <Header title={t('help.title')} safeArea={false} />
144
+
145
+ <ScrollView
146
+ contentContainerStyle={styles.scroll}
147
+ showsVerticalScrollIndicator={false}
148
+ >
149
+ <LinearGradient
150
+ colors={['#E87C3E', '#F08F4E']}
151
+ start={{ x: 0, y: 0 }}
152
+ end={{ x: 1, y: 1 }}
153
+ style={styles.heroGradient}
154
+ >
155
+ <View style={styles.hero}>
156
+ <View style={styles.heroTopRow}>
157
+ <View style={styles.heroIconWrap}>
158
+ <HeadphonesIcon size={moderateScale(26)} color="#FFFFFF" />
159
+ </View>
160
+ <View style={styles.onlinePill}>
161
+ <View style={styles.onlineDot} />
162
+ <RNText font="medium" size={11} color="#FFFFFF">
163
+ Online · 24/7
164
+ </RNText>
165
+ </View>
166
+ </View>
167
+ <RNText
168
+ font="bold"
169
+ size={22}
170
+ color="#FFFFFF"
171
+ style={styles.heroTitle}
172
+ >
173
+ {t('help.heroTitle')}
174
+ </RNText>
175
+ <RNText
176
+ size={13}
177
+ color="rgba(255,255,255,0.9)"
178
+ lineHeight={moderateScale(19)}
179
+ style={styles.heroSubtitle}
180
+ >
181
+ Our support team is here around the clock to make your HD WAKA
182
+ experience smooth, safe and stress-free.
183
+ </RNText>
184
+
185
+ <Pressable onPress={callSupport} style={styles.heroCta}>
186
+ <PhoneIcon size={moderateScale(16)} color={THEME.primary} />
187
+ <RNText
188
+ font="semibold"
189
+ size={13}
190
+ color={THEME.primary}
191
+ style={styles.heroCtaLabel}
192
+ >
193
+ Call support now
194
+ </RNText>
195
+ </Pressable>
196
+ </View>
197
+ </LinearGradient>
198
+
199
+ <RNText
200
+ font="semibold"
201
+ size={15}
202
+ color={THEME.text}
203
+ style={styles.sectionTitle}
204
+ >
205
+ {t('help.quickActions')}
206
+ </RNText>
207
+
208
+ <View style={styles.grid}>
209
+ {QUICK_ACTIONS.map(action => (
210
+ <QuickActionCard key={action.key} action={action} />
211
+ ))}
212
+ </View>
213
+
214
+ <View style={styles.sectionHeadRow}>
215
+ <RNText font="semibold" size={15} color={THEME.text}>
216
+ Frequently asked
217
+ </RNText>
218
+ <RNText size={12} color={THEME.textMuted}>
219
+ {FAQS.length} topics
220
+ </RNText>
221
+ </View>
222
+
223
+ <View style={styles.faqList}>
224
+ {FAQS.map((faq, idx) => (
225
+ <FaqItem
226
+ key={faq.q}
227
+ open={openIdx === idx}
228
+ onPress={() => toggle(idx)}
229
+ q={faq.q}
230
+ a={faq.a}
231
+ last={idx === FAQS.length - 1}
232
+ />
233
+ ))}
234
+ </View>
235
+
236
+ <RNText
237
+ font="semibold"
238
+ size={15}
239
+ color={THEME.text}
240
+ style={styles.sectionTitle}
241
+ >
242
+ {t('help.contactDetails')}
243
+ </RNText>
244
+
245
+ <Card padding={0} style={styles.contactCard} shadow={false}>
246
+ <ContactRow
247
+ label={t('common.email')}
248
+ value={SUPPORT_EMAIL}
249
+ onPress={emailSupport}
250
+ icon={
251
+ <View
252
+ style={[styles.contactIcon, styles.contactIconSuccess]}
253
+ >
254
+ <MailIcon
255
+ size={moderateScale(18)}
256
+ color={THEME.success}
257
+ />
258
+ </View>
259
+ }
260
+ />
261
+ <View style={styles.contactDivider} />
262
+ <ContactRow
263
+ label={t('common.phone')}
264
+ value="+234 800 000 0000"
265
+ onPress={callSupport}
266
+ icon={
267
+ <View
268
+ style={[styles.contactIcon, styles.contactIconPrimary]}
269
+ >
270
+ <PhoneIcon
271
+ size={moderateScale(18)}
272
+ color={THEME.primary}
273
+ />
274
+ </View>
275
+ }
276
+ />
277
+ <View style={styles.contactDivider} />
278
+ <ContactRow
279
+ label={t('help.officeHours')}
280
+ value={t('help.officeHoursValue')}
281
+ icon={
282
+ <View
283
+ style={[styles.contactIcon, styles.contactIconWarning]}
284
+ >
285
+ <ClockIcon
286
+ size={moderateScale(18)}
287
+ color={THEME.warning}
288
+ />
289
+ </View>
290
+ }
291
+ chevron={false}
292
+ />
293
+ </Card>
294
+
295
+ <View style={styles.bottomCta}>
296
+ <RNText
297
+ font="semibold"
298
+ size={15}
299
+ color={THEME.text}
300
+ textAlign="center"
301
+ style={styles.bottomCtaTitle}
302
+ >
303
+ {t('help.stillNeedHelp')}
304
+ </RNText>
305
+ <RNText
306
+ size={12}
307
+ color={THEME.textMuted}
308
+ textAlign="center"
309
+ lineHeight={moderateScale(18)}
310
+ style={styles.bottomCtaSubtitle}
311
+ >
312
+ Send us a detailed message and we’ll get back within 24 hours.
313
+ </RNText>
314
+ <RNButton title={t('help.emailSupport')} onPress={emailSupport} />
315
+ </View>
316
+ </ScrollView>
317
+ </MainContainer>
318
+ );
319
+ };
320
+
321
+ const QuickActionCard: React.FC<{ action: QuickAction }> = ({ action }) => (
322
+ <TouchableOpacity
323
+ style={styles.actionShell}
324
+ onPress={action.onPress}
325
+ activeOpacity={0.85}
326
+ >
327
+ <LinearGradient
328
+ colors={action.gradient}
329
+ start={{ x: 0, y: 0 }}
330
+ end={{ x: 1, y: 1 }}
331
+ style={styles.actionGradient}
332
+ >
333
+ <View style={styles.actionCard}>
334
+ <View style={styles.actionIconWrap}>
335
+ {action.icon(moderateScale(22))}
336
+ </View>
337
+ <RNText
338
+ font="bold"
339
+ size={15}
340
+ color="#FFFFFF"
341
+ style={styles.actionTitle}
342
+ >
343
+ {action.title}
344
+ </RNText>
345
+ <RNText
346
+ size={11}
347
+ color="rgba(255,255,255,0.85)"
348
+ style={styles.actionSubtitle}
349
+ >
350
+ {action.subtitle}
351
+ </RNText>
352
+ </View>
353
+ </LinearGradient>
354
+ </TouchableOpacity>
355
+ );
356
+
357
+ const FaqItem: React.FC<{
358
+ open: boolean;
359
+ onPress: () => void;
360
+ q: string;
361
+ a: string;
362
+ last?: boolean;
363
+ }> = ({ open, onPress, q, a, last }) => (
364
+ <TouchableOpacity
365
+ activeOpacity={0.75}
366
+ onPress={onPress}
367
+ style={[styles.faqItem, !last && styles.faqBorder]}
368
+ >
369
+ <View style={styles.faqRow}>
370
+ <RNText
371
+ font="semibold"
372
+ size={14}
373
+ color={THEME.text}
374
+ style={styles.faqQuestion}
375
+ >
376
+ {q}
377
+ </RNText>
378
+ <View
379
+ style={[
380
+ styles.faqChevron,
381
+ {
382
+ backgroundColor: open ? THEME.primary : THEME.primaryFaint,
383
+ },
384
+ ]}
385
+ >
386
+ {open ? (
387
+ <ChevronUpIcon size={moderateScale(14)} color="#FFFFFF" />
388
+ ) : (
389
+ <ChevronDownIcon size={moderateScale(14)} color={THEME.primary} />
390
+ )}
391
+ </View>
392
+ </View>
393
+ {open ? (
394
+ <RNText
395
+ size={13}
396
+ color={THEME.textSecondary}
397
+ lineHeight={moderateScale(20)}
398
+ style={styles.faqAnswer}
399
+ >
400
+ {a}
401
+ </RNText>
402
+ ) : null}
403
+ </TouchableOpacity>
404
+ );
405
+
406
+ const ContactRow: React.FC<{
407
+ label: string;
408
+ value: string;
409
+ icon: React.ReactNode;
410
+ onPress?: () => void;
411
+ chevron?: boolean;
412
+ }> = ({ label, value, icon, onPress, chevron = true }) => (
413
+ <TouchableOpacity
414
+ style={styles.contactRow}
415
+ onPress={onPress}
416
+ activeOpacity={onPress ? 0.7 : 1}
417
+ disabled={!onPress}
418
+ >
419
+ {icon}
420
+ <View style={styles.contactBody}>
421
+ <RNText size={11} color={THEME.textMuted}>
422
+ {label}
423
+ </RNText>
424
+ <RNText
425
+ font="semibold"
426
+ size={14}
427
+ color={THEME.text}
428
+ style={styles.contactValue}
429
+ >
430
+ {value}
431
+ </RNText>
432
+ </View>
433
+ {chevron ? (
434
+ <Svg width={moderateScale(14)} height={moderateScale(14)} viewBox="0 0 24 24" fill="none">
435
+ <Path
436
+ d="M9 6l6 6-6 6"
437
+ stroke={THEME.textMuted}
438
+ strokeWidth={2}
439
+ strokeLinecap="round"
440
+ strokeLinejoin="round"
441
+ />
442
+ </Svg>
443
+ ) : null}
444
+ </TouchableOpacity>
445
+ );
446
+
447
+ const ReportFlagIcon: React.FC<{ size?: number; color?: string }> = ({
448
+ size = 22,
449
+ color = '#FFFFFF',
450
+ }) => (
451
+ <Svg width={size} height={size} viewBox="0 0 24 24" fill="none">
452
+ <Path
453
+ d="M4 21V4M4 4h11l-1.5 4 1.5 4H4"
454
+ stroke={color}
455
+ strokeWidth={1.8}
456
+ strokeLinecap="round"
457
+ strokeLinejoin="round"
458
+ />
459
+ </Svg>
460
+ );
461
+
462
+ const ClockIcon: React.FC<{ size?: number; color?: string }> = ({
463
+ size = 18,
464
+ color = THEME.warning,
465
+ }) => (
466
+ <Svg width={size} height={size} viewBox="0 0 24 24" fill="none">
467
+ <Circle cx={12} cy={12} r={9} stroke={color} strokeWidth={1.6} />
468
+ <Path
469
+ d="M12 7v5l3 2"
470
+ stroke={color}
471
+ strokeWidth={1.6}
472
+ strokeLinecap="round"
473
+ strokeLinejoin="round"
474
+ />
475
+ </Svg>
476
+ );
477
+
478
+ export default HelpSupport;
479
+
480
+ const styles = StyleSheet.create({
481
+ scroll: {
482
+ paddingHorizontal: SPACING.hPadding,
483
+ paddingBottom: moderateScale(48),
484
+ paddingTop: moderateScale(6),
485
+ },
486
+ heroGradient: {
487
+ borderRadius: moderateScale(22),
488
+ },
489
+ hero: {
490
+ borderRadius: moderateScale(22),
491
+ paddingHorizontal: moderateScale(20),
492
+ paddingTop: moderateScale(18),
493
+ paddingBottom: moderateScale(20),
494
+ shadowColor: THEME.primary,
495
+ shadowOffset: { width: 0, height: 10 },
496
+ shadowOpacity: 0.18,
497
+ shadowRadius: 18,
498
+ elevation: 4,
499
+ },
500
+ heroTopRow: {
501
+ flexDirection: 'row',
502
+ alignItems: 'center',
503
+ justifyContent: 'space-between',
504
+ marginBottom: moderateScale(14),
505
+ },
506
+ heroIconWrap: {
507
+ width: moderateScale(50),
508
+ height: moderateScale(50),
509
+ borderRadius: moderateScale(15),
510
+ backgroundColor: 'rgba(255,255,255,0.22)',
511
+ alignItems: 'center',
512
+ justifyContent: 'center',
513
+ },
514
+ onlinePill: {
515
+ flexDirection: 'row',
516
+ alignItems: 'center',
517
+ backgroundColor: 'rgba(255,255,255,0.22)',
518
+ paddingHorizontal: moderateScale(10),
519
+ paddingVertical: moderateScale(5),
520
+ borderRadius: moderateScale(999),
521
+ },
522
+ onlineDot: {
523
+ width: moderateScale(7),
524
+ height: moderateScale(7),
525
+ borderRadius: moderateScale(4),
526
+ backgroundColor: '#3FCC8A',
527
+ marginRight: moderateScale(7),
528
+ },
529
+ heroTitle: {
530
+ marginBottom: moderateScale(6),
531
+ },
532
+ heroSubtitle: {
533
+ marginBottom: moderateScale(16),
534
+ },
535
+ heroCta: {
536
+ flexDirection: 'row',
537
+ alignItems: 'center',
538
+ alignSelf: 'flex-start',
539
+ backgroundColor: '#FFFFFF',
540
+ paddingHorizontal: moderateScale(14),
541
+ paddingVertical: moderateScale(10),
542
+ borderRadius: moderateScale(999),
543
+ },
544
+ heroCtaLabel: {
545
+ marginLeft: moderateScale(8),
546
+ },
547
+ sectionTitle: {
548
+ marginTop: moderateScale(22),
549
+ marginBottom: moderateScale(12),
550
+ },
551
+ sectionHeadRow: {
552
+ flexDirection: 'row',
553
+ alignItems: 'flex-end',
554
+ justifyContent: 'space-between',
555
+ marginTop: moderateScale(22),
556
+ marginBottom: moderateScale(12),
557
+ },
558
+ grid: {
559
+ flexDirection: 'row',
560
+ flexWrap: 'wrap',
561
+ marginHorizontal: -moderateScale(6),
562
+ },
563
+ actionShell: {
564
+ width: '50%',
565
+ paddingHorizontal: moderateScale(6),
566
+ marginBottom: moderateScale(12),
567
+ },
568
+ actionGradient: {
569
+ borderRadius: moderateScale(18),
570
+ },
571
+ actionCard: {
572
+ borderRadius: moderateScale(18),
573
+ paddingHorizontal: moderateScale(14),
574
+ paddingVertical: moderateScale(16),
575
+ minHeight: moderateScale(120),
576
+ justifyContent: 'space-between',
577
+ shadowColor: '#2C1A0E',
578
+ shadowOffset: { width: 0, height: 6 },
579
+ shadowOpacity: 0.12,
580
+ shadowRadius: 12,
581
+ // elevation: 3,
582
+ },
583
+ actionIconWrap: {
584
+ width: moderateScale(40),
585
+ height: moderateScale(40),
586
+ borderRadius: moderateScale(12),
587
+ backgroundColor: 'rgba(255,255,255,0.22)',
588
+ alignItems: 'center',
589
+ justifyContent: 'center',
590
+ },
591
+ actionTitle: {
592
+ marginTop: moderateScale(14),
593
+ },
594
+ actionSubtitle: {
595
+ marginTop: moderateScale(2),
596
+ },
597
+ faqList: {
598
+ backgroundColor: THEME.surface,
599
+ borderRadius: moderateScale(18),
600
+ paddingHorizontal: moderateScale(16),
601
+ borderWidth: 1,
602
+ borderColor: 'rgba(44,26,14,0.06)',
603
+ },
604
+ faqItem: {
605
+ paddingVertical: moderateScale(14),
606
+ },
607
+ faqBorder: {
608
+ borderBottomWidth: StyleSheet.hairlineWidth,
609
+ borderBottomColor: THEME.divider,
610
+ },
611
+ faqRow: {
612
+ flexDirection: 'row',
613
+ alignItems: 'center',
614
+ },
615
+ faqQuestion: {
616
+ flex: 1,
617
+ },
618
+ faqChevron: {
619
+ width: moderateScale(26),
620
+ height: moderateScale(26),
621
+ borderRadius: moderateScale(13),
622
+ alignItems: 'center',
623
+ justifyContent: 'center',
624
+ marginLeft: moderateScale(12),
625
+ },
626
+ faqAnswer: {
627
+ marginTop: moderateScale(10),
628
+ paddingRight: moderateScale(8),
629
+ },
630
+ contactCard: {
631
+ borderWidth: 1,
632
+ borderColor: 'rgba(44,26,14,0.06)',
633
+ },
634
+ contactRow: {
635
+ flexDirection: 'row',
636
+ alignItems: 'center',
637
+ paddingHorizontal: moderateScale(16),
638
+ paddingVertical: moderateScale(14),
639
+ },
640
+ contactIcon: {
641
+ width: moderateScale(40),
642
+ height: moderateScale(40),
643
+ borderRadius: moderateScale(12),
644
+ alignItems: 'center',
645
+ justifyContent: 'center',
646
+ marginRight: moderateScale(14),
647
+ },
648
+ contactIconSuccess: {
649
+ backgroundColor: THEME.successLight,
650
+ },
651
+ contactIconPrimary: {
652
+ backgroundColor: THEME.primaryLight,
653
+ },
654
+ contactIconWarning: {
655
+ backgroundColor: THEME.warningLight,
656
+ },
657
+ contactBody: {
658
+ flex: 1,
659
+ },
660
+ contactValue: {
661
+ marginTop: moderateScale(2),
662
+ },
663
+ contactDivider: {
664
+ height: StyleSheet.hairlineWidth,
665
+ backgroundColor: THEME.divider,
666
+ marginLeft: moderateScale(70),
667
+ },
668
+ bottomCta: {
669
+ marginTop: moderateScale(28),
670
+ paddingHorizontal: moderateScale(10),
671
+ },
672
+ bottomCtaTitle: {
673
+ marginBottom: moderateScale(6),
674
+ },
675
+ bottomCtaSubtitle: {
676
+ marginBottom: moderateScale(14),
677
+ },
678
+ });