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 ; };