index.tsx 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. import React, { useCallback, useEffect, useState } from 'react';
  2. import { View, ScrollView, Text } from 'react-native';
  3. import { Formik } from 'formik';
  4. import * as yup from 'yup';
  5. import { CommonActions, useFocusEffect, useNavigation } from '@react-navigation/native';
  6. import { KeyboardAwareScrollView } from 'react-native-keyboard-aware-scroll-view';
  7. import { AvatarPicker, BigText, Button, Header, Input, PageWrapper } from '../../../components';
  8. import { InputDatePicker } from '../../../components/Calendar/InputDatePicker';
  9. import { ModalFlatList } from '../../../components/FlatList/modal-flatlist';
  10. import { useRegisterMutation } from '@api/auth';
  11. import { storage } from '../../../storage';
  12. import store from '../../../storage/zustand';
  13. import { NAVIGATION_PAGES } from '../../../types';
  14. import { fetchAndSaveStatistics } from 'src/database/statisticsService';
  15. import { usePostGetProfileInfoDataQuery } from '@api/user';
  16. import { Colors } from 'src/theme';
  17. import { getFontSize } from 'src/utils';
  18. const SignUpSchema = yup.object({
  19. first_name: yup.string().required(),
  20. last_name: yup.string().required(),
  21. date_of_birth: yup.string().required(),
  22. homebase: yup.number().required().min(1, 'Region of origin is required'),
  23. homebase2: yup.number().optional()
  24. });
  25. //TODO: formik avatar | date and flatlist error shown
  26. const EditAccount = () => {
  27. const { dispatch } = useNavigation();
  28. const [user] = store((state) => [state.registration.user]);
  29. const { data, error, mutate: userRegister } = useRegisterMutation();
  30. const { data: profileData } = usePostGetProfileInfoDataQuery(
  31. data?.token || '',
  32. data?.uid ? +data.uid : 0,
  33. data?.token ? true : false
  34. );
  35. const [isLoading, setIsLoading] = useState(true);
  36. const [isSubmitting, setIsSubmitting] = useState(false);
  37. useFocusEffect(
  38. useCallback(() => {
  39. const fetchData = async () => {
  40. setIsLoading(false);
  41. };
  42. fetchData();
  43. }, [])
  44. );
  45. useEffect(() => {
  46. if (profileData) {
  47. const userInfo = {
  48. avatar: profileData?.data?.user_data.avatar ?? '',
  49. first_name: profileData?.data?.user_data.first_name,
  50. last_name: profileData?.data?.user_data.last_name,
  51. homebase_flag: profileData?.data?.user_data.flag1
  52. };
  53. storage.set('currentUserData', JSON.stringify(userInfo));
  54. setIsSubmitting(false);
  55. dispatch(
  56. CommonActions.reset({
  57. index: 1,
  58. routes: [{ name: NAVIGATION_PAGES.INFO }]
  59. })
  60. );
  61. }
  62. }, [profileData]);
  63. const updateLocalData = async (token: string) => {
  64. await fetchAndSaveStatistics(token);
  65. };
  66. if (isLoading) {
  67. return null;
  68. }
  69. return (
  70. <PageWrapper>
  71. <ScrollView showsVerticalScrollIndicator={false}>
  72. <View style={{ gap: 10 }}>
  73. <Header label={'Sign Up'} />
  74. <BigText>Edit account data</BigText>
  75. <KeyboardAwareScrollView>
  76. <Formik
  77. initialValues={{
  78. photo: {
  79. type: '',
  80. uri: '',
  81. name: ''
  82. },
  83. first_name: '',
  84. last_name: '',
  85. date_of_birth: '',
  86. homebase: 0,
  87. homebase2: undefined
  88. }}
  89. validationSchema={SignUpSchema}
  90. onSubmit={async (values) => {
  91. setIsSubmitting(true);
  92. const dateObject = new Date(values.date_of_birth);
  93. const formattedDate = dateObject.toISOString().split('T')[0];
  94. const data = {
  95. user: {
  96. ...user,
  97. first_name: values.first_name,
  98. last_name: values.last_name,
  99. date_of_birth: formattedDate,
  100. homebase: values.homebase,
  101. homebase2: values.homebase2 ?? -1
  102. },
  103. photo: values.photo.uri
  104. ? {
  105. type: values.photo.type,
  106. uri: values.photo.uri,
  107. name: values.photo.uri.split('/').pop()!
  108. }
  109. : {
  110. type: undefined,
  111. uri: undefined,
  112. name: undefined
  113. }
  114. };
  115. await userRegister(data, {
  116. onSuccess: (data) => {
  117. if (data && data.token) {
  118. storage.set('token', data.token);
  119. storage.set('uid', data.uid.toString());
  120. updateLocalData(data.token);
  121. } else {
  122. setIsSubmitting(false);
  123. }
  124. },
  125. onError: () => {
  126. setIsSubmitting(false);
  127. }
  128. });
  129. }}
  130. >
  131. {(props) => (
  132. <View>
  133. <View style={{ display: 'flex', alignItems: 'center' }}>
  134. <AvatarPicker selectedAvatar={(asset) => props.setFieldValue('photo', asset)} />
  135. </View>
  136. <Input
  137. onChange={props.handleChange('first_name')}
  138. value={props.values.first_name}
  139. onBlur={props.handleBlur('first_name')}
  140. placeholder={'Enter your first name'}
  141. header={'First name'}
  142. formikError={props.touched.first_name && props.errors.first_name}
  143. />
  144. <Input
  145. onChange={props.handleChange('last_name')}
  146. value={props.values.last_name}
  147. onBlur={props.handleBlur('last_name')}
  148. placeholder={'Enter your last name'}
  149. header={'Last name'}
  150. formikError={props.touched.last_name && props.errors.last_name}
  151. />
  152. <InputDatePicker
  153. headerTitle={'Date of birth'}
  154. selectedDate={(date) => props.setFieldValue('date_of_birth', date)}
  155. formikError={props.touched.date_of_birth && props.errors.date_of_birth}
  156. />
  157. <ModalFlatList
  158. headerTitle={'Region of origin'}
  159. selectedObject={(data) => props.setFieldValue('homebase', data.id)}
  160. />
  161. {props.touched.homebase && props.errors.homebase ? (
  162. <Text
  163. style={{
  164. color: Colors.RED,
  165. fontSize: getFontSize(12),
  166. fontFamily: 'redhat-600',
  167. marginTop: 5
  168. }}
  169. >
  170. {props.errors.homebase}
  171. </Text>
  172. ) : null}
  173. <ModalFlatList
  174. headerTitle={'Second region'}
  175. selectedObject={(data) => props.setFieldValue('homebase2', data.id)}
  176. />
  177. <View style={{ marginTop: 10 }}>
  178. <Button onPress={props.handleSubmit} disabled={isSubmitting}>
  179. Sign up
  180. </Button>
  181. </View>
  182. </View>
  183. )}
  184. </Formik>
  185. </KeyboardAwareScrollView>
  186. </View>
  187. </ScrollView>
  188. </PageWrapper>
  189. );
  190. };
  191. export default EditAccount;