import React, { useEffect, useState } from 'react';
import {
UserFormDetails as UserProfileController,
useSession,
useLanguage,
ToastType,
useToast,
} from 'ordering-components/native';
import { useTheme } from 'styled-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 } from 'react-native';
import { ProfileParams } from '../../types';
import { UserFormDetailsUI } from '../UserFormDetails';
import { OIcon, OIconButton } from '../shared';
import { CenterView } from './styles';
import NavBar from '../NavBar';
import { Container } from '../../layouts/Container';
const ProfileUI = (props: ProfileParams) => {
const {
navigation,
isEdit,
formState,
validationFields,
showField,
isRequiredField,
toggleIsEdit,
cleanFormState,
handleChangeInput,
handleButtonUpdateClick,
} = props;
const theme = useTheme();
const styles = StyleSheet.create({
photo: {
borderRadius: 7.6,
shadowColor: theme.colors.black,
shadowOffset: { width: 0, height: 1 },
shadowRadius: 2,
shadowOpacity: 0.2,
backgroundColor: theme.colors.white,
},
pagePadding: {
paddingLeft: 40,
paddingRight: 40
}
});
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?.assets?.[0]?.uri) {
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.goBack()}
btnStyle={{ paddingStart: 0 }}
title={t('ACCOUNT', 'Account')}
isVertical
style={styles.pagePadding}
/>
handleImagePicker()}
/>
);
};
export const UserProfileForm = (props: any) => {
const profileProps = {
...props,
UIComponent: ProfileUI,
};
return ;
};