import React, { useEffect, useState } from 'react';
import {
UserFormDetails as UserProfileController,
useSession,
useLanguage,
ToastType, useToast
} from 'ordering-components/native';
import { useForm } from 'react-hook-form';
import { launchImageLibrary } from 'react-native-image-picker';
import Spinner from 'react-native-loading-spinner-overlay';
import { StyleSheet, View, TouchableOpacity, Platform } from 'react-native';
import MaterialCommunityIcons from 'react-native-vector-icons/MaterialCommunityIcons'
import { useTheme } from 'styled-components/native';
import { ProfileParams } from '../../types';
import { AddressList } from '../AddressList'
import { LogoutButton } from '../LogoutButton'
import { UserFormDetailsUI } from '../UserFormDetails'
import {
OIcon,
OIconButton,
OText,
OButton,
} from '../shared';
import {
CenterView,
UserData,
Names,
EditButton,
Actions
} from './styles';
const ProfileUI = (props: ProfileParams) => {
const {
navigation,
isEdit,
formState,
validationFields,
showField,
isRequiredField,
toggleIsEdit,
cleanFormState,
handleChangeInput,
handleButtonUpdateClick
} = props;
const theme = useTheme();
const styles = StyleSheet.create({
dropdown: {
borderColor: theme.colors.whiteGray,
height: 50,
borderRadius: 25,
marginTop: 16,
},
inputbox: {
marginVertical: 8,
width: '90%'
},
editButton: {
borderRadius: 25,
height: 37,
borderWidth: 0,
color: theme.colors.primary,
shadowOpacity: 0,
marginVertical: 8,
width: 100,
paddingLeft: 12,
paddingRight: 12
},
updateButton: {
width: 100,
borderWidth: 1,
height: 37,
paddingLeft: 4,
paddingRight: 4
},
helpStyle: {
flexDirection: 'row',
alignItems: 'center',
marginVertical: 12,
marginStart: -2
}
});
const [{ user }] = useSession();
const [, t] = useLanguage();
const [, { showToast }] = useToast();
const { handleSubmit, errors, setValue, control } = useForm();
const [phoneInputData, setPhoneInputData] = useState({
error: '',
phone: {
country_phone_code: null,
cellphone: null
}
});
const [phoneUpdate, setPhoneUpdate] = useState(false)
const onSubmit = (values: any) => {
if (phoneInputData.error) {
showToast(ToastType.Error, phoneInputData.error)
return
}
if (
formState.changes.cellphone === '' &&
validationFields?.fields?.checkout?.cellphone?.enabled &&
validationFields?.fields?.checkout?.cellphone?.required
) {
showToast(
ToastType.Error,
t('VALIDATION_ERROR_MOBILE_PHONE_REQUIRED', 'The field Phone Number is required.')
);
return
}
if (formState.changes.password && formState.changes.password.length < 8) {
showToast(ToastType.Error, t('VALIDATION_ERROR_PASSWORD_MIN_STRING', 'The Password must be at least 8 characters.').replace('_attribute_', t('PASSWORD', 'Password')).replace('_min_', 8))
return
}
handleButtonUpdateClick(values);
}
const handleImagePicker = () => {
launchImageLibrary({ mediaType: 'photo', maxHeight: 200, maxWidth: 200, includeBase64: true }, (response: any) => {
if (response.didCancel) {
console.log('User cancelled image picker');
} else if (response.errorMessage) {
console.log('ImagePicker Error: ', response.errorMessage);
showToast(ToastType.Error, response.errorMessage);
} else {
if (response.uri) {
const url = `data:${response.type};base64,${response.base64}`
handleButtonUpdateClick(null, true, url);
} else {
if (response?.assets?.length > 0) {
const image = response?.assets[0]
const url = `data:${image.type};base64,${image.base64}`
handleButtonUpdateClick(null, true, url);
} else {
showToast(ToastType.Error, t('IMAGE_NOT_FOUND', 'Image not found'));
}
}
}
});
};
const handleCancelEdit = () => {
cleanFormState({ changes: {} });
toggleIsEdit();
setPhoneInputData({
error: '',
phone: {
country_phone_code: null,
cellphone: null
}
})
};
const handleChangePhoneNumber = (number: any) => {
setPhoneInputData(number)
let phoneNumber = {
country_phone_code: {
name: 'country_phone_code',
value: number.phone.country_phone_code
},
cellphone: {
name: 'cellphone',
value: number.phone.cellphone
}
}
handleChangeInput(phoneNumber, true)
}
const getInputRules = (field: any) => {
const rules: any = {
required: isRequiredField(field.code)
? t(`VALIDATION_ERROR_${field.code.toUpperCase()}_REQUIRED`, `${field.name} is required`)
.replace('_attribute_', t(field.name, field.code))
: null
}
if (field.code && field.code === 'email') {
rules.pattern = {
value: /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}$/i,
message: t('INVALID_ERROR_EMAIL', 'Invalid email address').replace('_attribute_', t('EMAIL', 'Email'))
}
}
return rules
}
useEffect(() => {
if (formState.result.result && !formState.loading) {
if (formState.result?.error) {
showToast(ToastType.Error, formState.result.result);
} else {
showToast(ToastType.Success, t('UPDATE_SUCCESSFULLY', 'Update successfully'));
}
}
}, [formState.result])
useEffect(() => {
if (Object.keys(errors).length > 0) {
// Convert all errors in one string to show in toast provider
const list = Object.values(errors);
let stringError = '';
list.map((item: any, i: number) => {
stringError +=
i + 1 === list.length ? `- ${item.message}` : `- ${item.message}\n`;
});
showToast(ToastType.Error, stringError);
}
}, [errors]);
useEffect(() => {
if (user?.cellphone && !user?.country_phone_code) {
setPhoneUpdate(true)
} else {
setPhoneUpdate(false)
}
}, [user?.country_phone_code])
return (
<>
{/* */}
navigation.navigate('Help')}
style={styles.helpStyle}
>
{t('HELP', 'Help')}
{isEdit &&
handleImagePicker()}
/>
}
{!isEdit ? (
{t('NAME', 'Name')}
{`${user?.name} ${user?.middle_name} ${user?.lastname} ${user?.second_lastname}`}
{/* {(!!user?.middle_name || !!user?.second_lastname) && (
{t('MIDDLE_NAME', 'Middle Name')}
{`${user?.middle_name} ${user?.second_lastname}`}
)} */}
{t('EMAIL', 'Email')}
{`${user?.email}`}
{!!user?.cellphone && (
{t('PHONE', 'Phone')}
{`${user?.cellphone}`}
)}
{!!phoneUpdate && (
{t('NECESSARY_UPDATE_COUNTRY_PHONE_CODE', 'It is necessary to update your phone number')}
)}
) : (
)}
{!validationFields.loading && (
{!isEdit ? (
) : (
<>
{((formState &&
Object.keys(formState?.changes).length > 0 && isEdit) || formState?.loading) &&
(
)}
>
)}
)}
{user?.id && (
)}
>
);
};
export const UserProfileForm = (props: any) => {
const profileProps = {
...props,
UIComponent: ProfileUI,
};
return ;
};