123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205 |
- import React, { useCallback, useEffect, useState } from 'react';
- import { View, ScrollView, Text } from 'react-native';
- import { Formik } from 'formik';
- import * as yup from 'yup';
- import { CommonActions, useFocusEffect, useNavigation } from '@react-navigation/native';
- import { KeyboardAwareScrollView } from 'react-native-keyboard-aware-scroll-view';
- import { AvatarPicker, BigText, Button, Header, Input, PageWrapper } from '../../../components';
- import { InputDatePicker } from '../../../components/Calendar/InputDatePicker';
- import { ModalFlatList } from '../../../components/FlatList/modal-flatlist';
- import { useRegisterMutation } from '@api/auth';
- import { storage } from '../../../storage';
- import store from '../../../storage/zustand';
- import { NAVIGATION_PAGES } from '../../../types';
- import { fetchAndSaveStatistics } from 'src/database/statisticsService';
- import { usePostGetProfileInfoDataQuery } from '@api/user';
- import { Colors } from 'src/theme';
- import { getFontSize } from 'src/utils';
- const SignUpSchema = yup.object({
- first_name: yup.string().required(),
- last_name: yup.string().required(),
- date_of_birth: yup.string().required(),
- homebase: yup.number().required().min(1, 'Region of origin is required'),
- homebase2: yup.number().optional()
- });
- //TODO: formik avatar | date and flatlist error shown
- const EditAccount = () => {
- const { dispatch } = useNavigation();
- const [user] = store((state) => [state.registration.user]);
- const { data, error, mutate: userRegister } = useRegisterMutation();
- const { data: profileData } = usePostGetProfileInfoDataQuery(
- data?.token || '',
- data?.uid ? +data.uid : 0,
- data?.token ? true : false
- );
- const [isLoading, setIsLoading] = useState(true);
- const [isSubmitting, setIsSubmitting] = useState(false);
- useFocusEffect(
- useCallback(() => {
- const fetchData = async () => {
- setIsLoading(false);
- };
- fetchData();
- }, [])
- );
- useEffect(() => {
- if (profileData) {
- const userInfo = {
- avatar: profileData?.data?.user_data.avatar ?? '',
- first_name: profileData?.data?.user_data.first_name,
- last_name: profileData?.data?.user_data.last_name,
- homebase_flag: profileData?.data?.user_data.flag1
- };
- storage.set('currentUserData', JSON.stringify(userInfo));
- setIsSubmitting(false);
- dispatch(
- CommonActions.reset({
- index: 1,
- routes: [{ name: NAVIGATION_PAGES.INFO }]
- })
- );
- }
- }, [profileData]);
- const updateLocalData = async (token: string) => {
- await fetchAndSaveStatistics(token);
- };
- if (isLoading) {
- return null;
- }
- return (
- <PageWrapper>
- <ScrollView showsVerticalScrollIndicator={false}>
- <View style={{ gap: 10 }}>
- <Header label={'Sign Up'} />
- <BigText>Edit account data</BigText>
- <KeyboardAwareScrollView>
- <Formik
- initialValues={{
- photo: {
- type: '',
- uri: '',
- name: ''
- },
- first_name: '',
- last_name: '',
- date_of_birth: '',
- homebase: 0,
- homebase2: undefined
- }}
- validationSchema={SignUpSchema}
- onSubmit={async (values) => {
- setIsSubmitting(true);
- const data = {
- user: {
- ...user,
- first_name: values.first_name,
- last_name: values.last_name,
- date_of_birth: values.date_of_birth,
- homebase: values.homebase,
- homebase2: values.homebase2
- },
- photo: values.photo.uri
- ? {
- type: values.photo.type,
- uri: values.photo.uri,
- name: values.photo.uri.split('/').pop()!
- }
- : {
- type: undefined,
- uri: undefined,
- name: undefined
- }
- };
- await userRegister(data, {
- onSuccess: (data) => {
- if (data && data.token) {
- storage.set('token', data.token);
- storage.set('uid', data.uid.toString());
- updateLocalData(data.token);
- } else {
- setIsSubmitting(false);
- }
- },
- onError: () => {
- setIsSubmitting(false);
- }
- });
- }}
- >
- {(props) => (
- <View>
- <View style={{ display: 'flex', alignItems: 'center' }}>
- <AvatarPicker selectedAvatar={(asset) => props.setFieldValue('photo', asset)} />
- </View>
- <Input
- onChange={props.handleChange('first_name')}
- value={props.values.first_name}
- onBlur={props.handleBlur('first_name')}
- placeholder={'Enter your first name'}
- header={'First name'}
- formikError={props.touched.first_name && props.errors.first_name}
- />
- <Input
- onChange={props.handleChange('last_name')}
- value={props.values.last_name}
- onBlur={props.handleBlur('last_name')}
- placeholder={'Enter your last name'}
- header={'Last name'}
- formikError={props.touched.last_name && props.errors.last_name}
- />
- <InputDatePicker
- headerTitle={'Date of birth'}
- selectedDate={(date) => props.setFieldValue('date_of_birth', date)}
- formikError={props.touched.date_of_birth && props.errors.date_of_birth}
- />
- <ModalFlatList
- headerTitle={'Region of origin'}
- selectedObject={(data) => props.setFieldValue('homebase', data.id)}
- />
- {props.touched.homebase && props.errors.homebase ? (
- <Text
- style={{
- color: Colors.RED,
- fontSize: getFontSize(12),
- fontFamily: 'redhat-600',
- marginTop: 5
- }}
- >
- {props.errors.homebase}
- </Text>
- ) : null}
- <ModalFlatList
- headerTitle={'Second region'}
- selectedObject={(data) => props.setFieldValue('homebase2', data.id)}
- />
- <View style={{ marginTop: 10 }}>
- <Button onPress={props.handleSubmit} disabled={isSubmitting}>
- Sign up
- </Button>
- </View>
- </View>
- )}
- </Formik>
- </KeyboardAwareScrollView>
- </View>
- </ScrollView>
- </PageWrapper>
- );
- };
- export default EditAccount;
|