index.tsx 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. import React, { useCallback, useEffect, useState } from 'react';
  2. import { View, ScrollView } 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. const SignUpSchema = yup.object({
  17. first_name: yup.string().required(),
  18. last_name: yup.string().required(),
  19. date_of_birth: yup.string().required(),
  20. homebase: yup.number().required(),
  21. homebase2: yup.number().optional()
  22. });
  23. //TODO: formik avatar | date and flatlist error shown
  24. const EditAccount = () => {
  25. const { dispatch } = useNavigation();
  26. const [user] = store((state) => [state.registration.user]);
  27. const { data, error, mutate: userRegister } = useRegisterMutation();
  28. const { data: profileData } = usePostGetProfileInfoDataQuery(
  29. data?.token || '',
  30. data?.uid ? +data.uid : 0,
  31. data?.token ? true : false
  32. );
  33. const [isLoading, setIsLoading] = useState(true);
  34. useFocusEffect(
  35. useCallback(() => {
  36. const fetchData = async () => {
  37. setIsLoading(false);
  38. };
  39. fetchData();
  40. }, [])
  41. );
  42. useEffect(() => {
  43. if (profileData) {
  44. const userInfo = {
  45. avatar: profileData?.data?.user_data.avatar ?? '',
  46. first_name: profileData?.data?.user_data.first_name,
  47. last_name: profileData?.data?.user_data.last_name,
  48. homebase_flag: profileData?.data?.user_data.flag1
  49. };
  50. storage.set('currentUserData', JSON.stringify(userInfo));
  51. dispatch(
  52. CommonActions.reset({
  53. index: 1,
  54. routes: [{ name: NAVIGATION_PAGES.INFO }]
  55. })
  56. );
  57. }
  58. }, [profileData]);
  59. const updateLocalData = async (token: string) => {
  60. await fetchAndSaveStatistics(token);
  61. };
  62. if (isLoading) {
  63. return null;
  64. }
  65. return (
  66. <PageWrapper>
  67. <ScrollView showsVerticalScrollIndicator={false}>
  68. <View style={{ gap: 10 }}>
  69. <Header label={'Sign Up'} />
  70. <BigText>Edit account data</BigText>
  71. <KeyboardAwareScrollView>
  72. <Formik
  73. initialValues={{
  74. photo: {
  75. type: '',
  76. uri: '',
  77. name: ''
  78. },
  79. first_name: '',
  80. last_name: '',
  81. date_of_birth: '',
  82. homebase: 0,
  83. homebase2: undefined
  84. }}
  85. validationSchema={SignUpSchema}
  86. onSubmit={(values) => {
  87. const data = {
  88. user: {
  89. ...user,
  90. first_name: values.first_name,
  91. last_name: values.last_name,
  92. date_of_birth: values.date_of_birth,
  93. homebase: values.homebase,
  94. homebase2: values.homebase2
  95. },
  96. photo: values.photo.uri
  97. ? {
  98. type: values.photo.type,
  99. uri: values.photo.uri,
  100. name: values.photo.uri.split('/').pop()!
  101. }
  102. : {
  103. type: undefined,
  104. uri: undefined,
  105. name: undefined
  106. }
  107. };
  108. userRegister(data, {
  109. onSuccess: (data) => {
  110. if (data && data.token) {
  111. storage.set('token', data.token);
  112. storage.set('uid', data.uid.toString());
  113. updateLocalData(data.token);
  114. }
  115. }
  116. });
  117. }}
  118. >
  119. {(props) => (
  120. <View>
  121. <View style={{ display: 'flex', alignItems: 'center' }}>
  122. <AvatarPicker selectedAvatar={(asset) => props.setFieldValue('photo', asset)} />
  123. </View>
  124. <Input
  125. onChange={props.handleChange('first_name')}
  126. value={props.values.first_name}
  127. onBlur={props.handleBlur('first_name')}
  128. placeholder={'Enter your first name'}
  129. header={'First name'}
  130. formikError={props.touched.first_name && props.errors.first_name}
  131. />
  132. <Input
  133. onChange={props.handleChange('last_name')}
  134. value={props.values.last_name}
  135. onBlur={props.handleBlur('last_name')}
  136. placeholder={'Enter your last name'}
  137. header={'Last name'}
  138. formikError={props.touched.last_name && props.errors.last_name}
  139. />
  140. <InputDatePicker
  141. headerTitle={'Date of birth'}
  142. selectedDate={(date) => props.setFieldValue('date_of_birth', date)}
  143. formikError={props.touched.date_of_birth && props.errors.date_of_birth}
  144. />
  145. <ModalFlatList
  146. headerTitle={'Region of origin'}
  147. selectedObject={(data) => props.setFieldValue('homebase', data.id)}
  148. />
  149. <ModalFlatList
  150. headerTitle={'Second region'}
  151. selectedObject={(data) => props.setFieldValue('homebase2', data.id)}
  152. />
  153. <View style={{ marginTop: 10 }}>
  154. <Button onPress={props.handleSubmit}>Sign up</Button>
  155. </View>
  156. </View>
  157. )}
  158. </Formik>
  159. </KeyboardAwareScrollView>
  160. </View>
  161. </ScrollView>
  162. </PageWrapper>
  163. );
  164. };
  165. export default EditAccount;