@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,407 @@
1
+ import React, { useState } from "react";
2
+ import {
3
+ Image,
4
+ Pressable,
5
+ ScrollView,
6
+ StyleSheet,
7
+ TextInput,
8
+ TouchableOpacity,
9
+ View,
10
+ } from "react-native";
11
+ import { useNavigation } from "@react-navigation/native";
12
+ import { useDispatch, useSelector } from "react-redux";
13
+ import { moderateScale } from "react-native-size-matters";
14
+ import {
15
+ Dropdown,
16
+ Header,
17
+ ImagePickerSheet,
18
+ MainContainer,
19
+ RNButton,
20
+ RNText,
21
+ } from "../../components";
22
+ import {
23
+ CheckCircleSmallIcon,
24
+ ChevronDownIcon,
25
+ CloudUploadIcon,
26
+ PencilEditIcon,
27
+ PersonAvatarIcon,
28
+ XCircleOutlineIcon,
29
+ } from "../../components/Icon/SvgIcons";
30
+ import { FONTS, SPACING, THEME } from "../../theme";
31
+ import { RootState } from "../../redux/store";
32
+ import { setAvatarUri, setProfile } from "../../redux/slice/userProfile";
33
+ import { useLanguage } from "../../localization";
34
+
35
+ type PickerTarget = "avatar" | "nationalId" | null;
36
+
37
+ const EditProfile: React.FC = () => {
38
+ const nav = useNavigation<any>();
39
+ const dispatch = useDispatch();
40
+ const { t } = useLanguage();
41
+ const profile = useSelector((s: RootState) => s.userProfile.profile);
42
+ const [picker, setPicker] = useState<PickerTarget>(null);
43
+
44
+ const GENDER_OPTIONS = [
45
+ { label: t("gender.male"), value: "Male" },
46
+ { label: t("gender.female"), value: "Female" },
47
+ { label: t("gender.other"), value: "Other" },
48
+ ];
49
+
50
+ return (
51
+ <MainContainer gradient statusBarStyle="dark-content">
52
+ <Header title={t("editProfile.title")} safeArea={false} />
53
+
54
+ <ScrollView
55
+ contentContainerStyle={styles.scroll}
56
+ showsVerticalScrollIndicator={false}
57
+ keyboardShouldPersistTaps="handled"
58
+ >
59
+ <Pressable
60
+ style={styles.avatarWrap}
61
+ onPress={() => setPicker("avatar")}
62
+ hitSlop={6}
63
+ >
64
+ <View style={styles.avatarRing}>
65
+ {profile.avatarUri ? (
66
+ <Image
67
+ source={{ uri: profile.avatarUri }}
68
+ style={styles.avatar}
69
+ />
70
+ ) : (
71
+ <View style={[styles.avatar, styles.avatarPlaceholder]}>
72
+ <PersonAvatarIcon
73
+ size={moderateScale(56)}
74
+ color={THEME.primary}
75
+ />
76
+ </View>
77
+ )}
78
+ </View>
79
+ <View style={styles.editBadge}>
80
+ <PencilEditIcon size={moderateScale(14)} color="#FFFFFF" />
81
+ </View>
82
+ </Pressable>
83
+
84
+ <FieldLabel>{t("auth.fullName")}</FieldLabel>
85
+ <View style={styles.inputBox}>
86
+ <TextInput
87
+ value={profile.fullName}
88
+ onChangeText={(t) => dispatch(setProfile({ fullName: t }))}
89
+ style={styles.input}
90
+ placeholderTextColor={THEME.textPlaceholder}
91
+ allowFontScaling={false}
92
+ />
93
+ </View>
94
+
95
+ <FieldLabel>{t("auth.dateOfBirth")}</FieldLabel>
96
+ <View style={styles.inputBox}>
97
+ <TextInput
98
+ value={profile.dob}
99
+ onChangeText={(t) => dispatch(setProfile({ dob: t }))}
100
+ style={styles.input}
101
+ placeholderTextColor={THEME.textPlaceholder}
102
+ allowFontScaling={false}
103
+ />
104
+ </View>
105
+
106
+ <FieldLabel>{t("auth.gender")}</FieldLabel>
107
+ <Dropdown
108
+ value={profile.gender ?? null}
109
+ options={GENDER_OPTIONS}
110
+ onChange={(val) =>
111
+ dispatch(
112
+ setProfile({ gender: val as "Male" | "Female" | "Other" }),
113
+ )
114
+ }
115
+ placeholder={t("auth.selectGender")}
116
+ title={t("auth.selectGender")}
117
+ rightIcon={
118
+ <ChevronDownIcon
119
+ size={moderateScale(18)}
120
+ color={THEME.textMuted}
121
+ />
122
+ }
123
+ triggerStyle={styles.dropdownTrigger}
124
+ />
125
+
126
+ <FieldLabel>{t("editProfile.aboutMe")}</FieldLabel>
127
+ <View style={[styles.inputBox, styles.textArea]}>
128
+ <TextInput
129
+ value={profile.about}
130
+ onChangeText={(t) => dispatch(setProfile({ about: t }))}
131
+ style={[styles.input, styles.inputMulti]}
132
+ multiline
133
+ textAlignVertical="top"
134
+ placeholderTextColor={THEME.textPlaceholder}
135
+ allowFontScaling={false}
136
+ />
137
+ </View>
138
+
139
+ <FieldLabel>{t("editProfile.nationalId")}</FieldLabel>
140
+ <RNText
141
+ size={11}
142
+ color={THEME.textMuted}
143
+ style={styles.helperText}
144
+ >
145
+ {t("editProfile.nationalIdHint")}
146
+ </RNText>
147
+ {profile.nationalIdImageUri ? (
148
+ <Pressable
149
+ style={styles.uploadFilled}
150
+ onPress={() => setPicker("nationalId")}
151
+ >
152
+ <Image
153
+ source={{ uri: profile.nationalIdImageUri }}
154
+ style={StyleSheet.absoluteFill}
155
+ resizeMode="cover"
156
+ />
157
+ <View style={styles.replaceBadge}>
158
+ <RNText size={11} font="semibold" color="#fff">
159
+ {t("common.replace")}
160
+ </RNText>
161
+ </View>
162
+ </Pressable>
163
+ ) : (
164
+ <Pressable
165
+ style={styles.uploadBox}
166
+ onPress={() => setPicker("nationalId")}
167
+ >
168
+ <CloudUploadIcon
169
+ size={moderateScale(26)}
170
+ color={THEME.primary}
171
+ />
172
+ <RNText
173
+ size={12}
174
+ font="medium"
175
+ color={THEME.text}
176
+ style={{ marginTop: moderateScale(6) }}
177
+ >
178
+ {t("common.uploadImage")}
179
+ </RNText>
180
+ <RNText
181
+ size={10}
182
+ color={THEME.textMuted}
183
+ style={{ marginTop: moderateScale(2) }}
184
+ >
185
+ {t("common.uploadFormatsHint")}
186
+ </RNText>
187
+ </Pressable>
188
+ )}
189
+
190
+ <View style={styles.contactList}>
191
+ <ContactRow
192
+ verified={!!profile.isPhoneVerified}
193
+ value={`${profile.countryCode} ${profile.phone}`}
194
+ onChange={() => {}}
195
+ />
196
+ <View style={styles.contactDivider} />
197
+ <ContactRow
198
+ verified={!!profile.isEmailVerified}
199
+ value={profile.email}
200
+ onChange={() => {}}
201
+ />
202
+ </View>
203
+
204
+ <RNButton
205
+ title={t("common.update")}
206
+ onPress={() => nav.goBack()}
207
+ containerStyle={styles.updateBtn}
208
+ />
209
+ </ScrollView>
210
+
211
+ <ImagePickerSheet
212
+ visible={picker !== null}
213
+ onClose={() => setPicker(null)}
214
+ onPicked={(img) => {
215
+ if (picker === "avatar") {
216
+ dispatch(setAvatarUri(img.path));
217
+ } else if (picker === "nationalId") {
218
+ dispatch(setProfile({ nationalIdImageUri: img.path }));
219
+ }
220
+ }}
221
+ circular={picker === "avatar"}
222
+ />
223
+ </MainContainer>
224
+ );
225
+ };
226
+
227
+ const FieldLabel = ({ children }: { children: React.ReactNode }) => (
228
+ <RNText
229
+ size={13}
230
+ font="medium"
231
+ color={THEME.labelBrown}
232
+ style={styles.label}
233
+ >
234
+ {children}
235
+ </RNText>
236
+ );
237
+
238
+ const ContactRow = ({
239
+ verified,
240
+ value,
241
+ onChange,
242
+ }: {
243
+ verified: boolean;
244
+ value: string;
245
+ onChange: () => void;
246
+ }) => {
247
+ const { t } = useLanguage();
248
+ return (
249
+ <View style={styles.contactRow}>
250
+ {verified ? (
251
+ <CheckCircleSmallIcon size={moderateScale(18)} color={THEME.text} />
252
+ ) : (
253
+ <XCircleOutlineIcon size={moderateScale(18)} color={THEME.text} />
254
+ )}
255
+ <RNText
256
+ size={14}
257
+ color={THEME.text}
258
+ style={styles.contactValue}
259
+ numberOfLines={1}
260
+ >
261
+ {value}
262
+ </RNText>
263
+ <TouchableOpacity onPress={onChange} hitSlop={8}>
264
+ <RNText size={13} font="medium" color={THEME.primary}>
265
+ {t("common.change")}
266
+ </RNText>
267
+ </TouchableOpacity>
268
+ </View>
269
+ );
270
+ };
271
+
272
+ export default EditProfile;
273
+
274
+ const AVATAR_SIZE = moderateScale(108);
275
+ const AVATAR_INNER = moderateScale(96);
276
+
277
+ const styles = StyleSheet.create({
278
+ scroll: {
279
+ paddingHorizontal: moderateScale(20),
280
+ paddingBottom: moderateScale(40),
281
+ },
282
+ avatarWrap: {
283
+ alignSelf: "center",
284
+ marginTop: moderateScale(8),
285
+ marginBottom: moderateScale(18),
286
+ width: AVATAR_SIZE,
287
+ height: AVATAR_SIZE,
288
+ },
289
+ avatarRing: {
290
+ width: AVATAR_SIZE,
291
+ height: AVATAR_SIZE,
292
+ borderRadius: AVATAR_SIZE / 2,
293
+ borderWidth: moderateScale(2.5),
294
+ borderColor: THEME.primary,
295
+ padding: moderateScale(3),
296
+ alignItems: "center",
297
+ justifyContent: "center",
298
+ backgroundColor: THEME.backgroundAlt,
299
+ },
300
+ avatar: {
301
+ width: AVATAR_INNER,
302
+ height: AVATAR_INNER,
303
+ borderRadius: AVATAR_INNER / 2,
304
+ },
305
+ avatarPlaceholder: {
306
+ backgroundColor: THEME.primaryFaint,
307
+ alignItems: "center",
308
+ justifyContent: "center",
309
+ },
310
+ editBadge: {
311
+ position: "absolute",
312
+ top: moderateScale(3),
313
+ right: moderateScale(3),
314
+ width: moderateScale(26),
315
+ height: moderateScale(26),
316
+ borderRadius: moderateScale(13),
317
+ backgroundColor: THEME.primary,
318
+ alignItems: "center",
319
+ justifyContent: "center",
320
+ },
321
+ label: {
322
+ marginTop: moderateScale(14),
323
+ marginBottom: moderateScale(8),
324
+ },
325
+ helperText: {
326
+ marginTop: -moderateScale(4),
327
+ marginBottom: moderateScale(8),
328
+ lineHeight: moderateScale(16),
329
+ },
330
+ inputBox: {
331
+ minHeight: moderateScale(52),
332
+ borderRadius: SPACING.radiusPill,
333
+ borderWidth: 1,
334
+ borderColor: THEME.inputBorder,
335
+ backgroundColor: THEME.surface,
336
+ paddingHorizontal: moderateScale(20),
337
+ justifyContent: "center",
338
+ },
339
+ input: {
340
+ color: THEME.text,
341
+ fontFamily: FONTS.regular,
342
+ fontSize: moderateScale(14, 0.3),
343
+ paddingVertical: 0,
344
+ },
345
+ dropdownTrigger: {
346
+ height: moderateScale(52),
347
+ paddingHorizontal: moderateScale(20),
348
+ borderRadius: SPACING.radiusPill,
349
+ backgroundColor: THEME.surface,
350
+ },
351
+ textArea: {
352
+ minHeight: moderateScale(110),
353
+ borderRadius: moderateScale(22),
354
+ paddingHorizontal: moderateScale(18),
355
+ paddingVertical: moderateScale(14),
356
+ justifyContent: "flex-start",
357
+ },
358
+ inputMulti: {
359
+ minHeight: moderateScale(82),
360
+ lineHeight: moderateScale(20),
361
+ },
362
+ uploadBox: {
363
+ minHeight: moderateScale(110),
364
+ borderRadius: moderateScale(18),
365
+ borderWidth: 1.2,
366
+ borderStyle: "dashed",
367
+ borderColor: THEME.primary,
368
+ backgroundColor: "rgba(255, 243, 234, 0.55)",
369
+ alignItems: "center",
370
+ justifyContent: "center",
371
+ paddingVertical: moderateScale(18),
372
+ },
373
+ uploadFilled: {
374
+ height: moderateScale(140),
375
+ borderRadius: moderateScale(18),
376
+ overflow: "hidden",
377
+ backgroundColor: THEME.surfaceMuted,
378
+ },
379
+ replaceBadge: {
380
+ position: "absolute",
381
+ right: moderateScale(10),
382
+ bottom: moderateScale(10),
383
+ paddingHorizontal: moderateScale(10),
384
+ paddingVertical: moderateScale(5),
385
+ borderRadius: moderateScale(12),
386
+ backgroundColor: "rgba(0,0,0,0.55)",
387
+ },
388
+ contactList: {
389
+ marginTop: moderateScale(22),
390
+ },
391
+ contactRow: {
392
+ flexDirection: "row",
393
+ alignItems: "center",
394
+ paddingVertical: moderateScale(14),
395
+ gap: moderateScale(12),
396
+ },
397
+ contactValue: {
398
+ flex: 1,
399
+ },
400
+ contactDivider: {
401
+ height: 1,
402
+ backgroundColor: THEME.divider,
403
+ },
404
+ updateBtn: {
405
+ marginTop: moderateScale(28),
406
+ },
407
+ });