import React, { useEffect, useState } from 'react'; import { View, StyleSheet, ScrollView, ActivityIndicator, Pressable } from 'react-native'; import { _retrieveStoreData, _clearStoreData } from '../../providers/StoreUtil'; import { useForm } from 'react-hook-form'; import { launchImageLibrary } from 'react-native-image-picker'; import { Placeholder, PlaceholderLine, Fade } from 'rn-placeholder'; import { useTheme } from 'styled-components/native'; import { UserFormDetails as UserProfileController, useSession, ToastType, useToast, useLanguage, useUtils, useConfig, useValidationFields } from 'ordering-components/native'; import { CenterView, Actions, UserData, EditButton, EnabledStatusDriver, RemoveAccount } from './styles'; import { LogoutButton } from '../LogoutButton'; import { LanguageSelector } from '../LanguageSelector'; import { UserFormDetailsUI } from '../UserFormDetails'; import { DriverSchedule } from '../DriverSchedule' import { PrinterSettings } from '../PrinterSettings' import ToggleSwitch from 'toggle-switch-react-native'; import { UDWrapper } from '../UserFormDetails/styles'; import { OIcon, OIconButton, OText, OButton, OInput, OModal, } from '../../components/shared'; import { OAlert } from '../../../../../src/components/shared' import { sortInputFields, getTraduction } from '../../utils'; import { ProfileParams } from '../../types'; import { NotFoundSource } from '../NotFoundSource'; import AntDesignIcon from 'react-native-vector-icons/AntDesign' const ProfileUI = (props: ProfileParams) => { const { formState, isEdit, validationFields, handleButtonUpdateClick, toggleIsEdit, cleanFormState, handleToggleAvalaibleStatusDriver, handleRemoveAccount, isAlsea, isShowDriverStatus, navigation } = props; const [{ user, sessionLoading }] = useSession(); const [, t] = useLanguage(); const [, { showToast }] = useToast(); const [{ optimizeImage }] = useUtils(); const [{ configs }] = useConfig(); const [{ loading }, { loadOriginalValidationFields }] = useValidationFields() const { errors } = useForm(); const theme = useTheme(); const [confirm, setConfirm] = useState({ open: false, content: null, handleOnAccept: null, id: null, title: null }) const [phoneInputData, setPhoneInputData] = useState({ error: '', phone: { country_phone_code: null, cellphone: null, }, }); const [phoneUpdate, setPhoneUpdate] = useState(false); const [userState, setUserState] = useState(props.userState) const [userPhoneNumber, setUserPhoneNumber] = useState(null); const [phoneToShow, setPhoneToShow] = useState(''); const [openModal, setOpenModal] = useState(false) const allowDriverUpdateData = user?.level !== 4 || configs?.allow_driver_update_data?.value === "1" const allowDeleteDriverAccount = user?.level !== 4 || configs?.allow_delete_driver_account?.value === "1" const isAdmin = user?.level === 0 const setUserCellPhone = (isEdit = false) => { if (userPhoneNumber && !userPhoneNumber.includes('null') && !isEdit) { setUserPhoneNumber(userPhoneNumber); return; } if (user?.cellphone) { let phone = null; if (user?.country_phone_code) { phone = `+${user?.country_phone_code} ${user?.cellphone}`; } else { phone = user?.cellphone; } setUserPhoneNumber(phone); setPhoneInputData({ ...phoneInputData, phone: { country_phone_code: user?.country_phone_code || null, cellphone: user?.cellphone || null, }, }); return; } setUserPhoneNumber(user?.cellphone || ''); }; const handleImagePicker = () => { launchImageLibrary( { mediaType: 'photo', maxHeight: 200, maxWidth: 200, includeBase64: true, }, (image: any) => { const response = image?.assets?.[0]; 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 { 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 onRemoveAccount = async () => { setConfirm({ open: true, content: [t('QUESTION_REMOVE_ACCOUNT', 'Are you sure that you want to remove your account?')], title: t('ACCOUNT_ALERT', 'Account alert'), handleOnAccept: () => { setConfirm({ ...confirm, open: false }) handleRemoveAccount && handleRemoveAccount(user?.id) _clearStoreData({ excludedKeys: ['isTutorial', 'language'] }); props?.setRootState && props?.setRootState({ isAuth: false, token: null }) } }) } useEffect(() => { if (phoneInputData.phone.cellphone) { const codeNumberPhone = phoneInputData.phone.country_phone_code const numberPhone = phoneInputData.phone.cellphone setPhoneToShow(`(${codeNumberPhone}) ${numberPhone}`); } }, [phoneInputData.phone.cellphone]); useEffect(() => { const isLoadingDriver = userState?.loadingDriver ?? true; if (userState?.result?.result && !isLoadingDriver) { if (userState?.result?.error) { const messageError = userState.result.error || userState.result.error[0]; showToast(ToastType.Error, typeof messageError === 'string' ? getTraduction(messageError, t) : t('CANNOT_UPDATE_AVAILABLE_STATE', 'Cannot update available state')); } else { showToast( ToastType.Success, t('AVAILABLE_STATE_IS_UPDATED', 'Available state is updated'), ); } } }, [userState?.loadingDriver]); useEffect(() => { if ((user || !isEdit) && !formState?.loading) { setUserCellPhone(); if (!isEdit && !formState?.loading) { cleanFormState && cleanFormState({ changes: {} }); setUserCellPhone(true); } } }, [user, isEdit]); 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]); useEffect(() => { setUserState({ ...userState, ...props.userState }) }, [props.userState]) useEffect(() => { if (!user?.id) return setUserState({ ...userState, result: { error: true, result: user } }) }, [user, props.isFocused]) const styles = StyleSheet.create({ label: { color: theme.colors.textGray, fontFamily: 'Poppins', fontStyle: 'normal', fontWeight: '600', }, inputStyle: { marginBottom: 25, borderWidth: 1, borderColor: theme.colors.tabBar, borderTopWidth: 0, borderRightWidth: 0, borderLeftWidth: 0, paddingHorizontal: 0, borderRadius: 0, }, editButton: { height: 44, borderRadius: 7.6, borderWidth: 1, borderColor: theme.colors.primary, backgroundColor: theme.colors.white, marginBottom: 25, }, btnText: { color: theme.colors.textGray, fontFamily: 'Poppins', fontStyle: 'normal', fontWeight: 'normal', fontSize: 18, }, }); return ( <> {validationFields?.error && !loading && ( loadOriginalValidationFields({ forceLoading: true })} btnTitle={t('REFRESH_PROFILE', 'Refresh profile')} /> )} {(formState?.loading || sessionLoading) && !validationFields.error && ( {[...Array(8)].map((item, i) => ( ))} )} {!(formState?.loading || sessionLoading) && !validationFields.error && ( {allowDriverUpdateData && ( handleImagePicker()} /> )} {user?.level === 4 && ( {t( `${!isShowDriverStatus ? 'NOT_' : ''}AVAILABLE_TO_RECEIVE_ORDERS`, `${!isShowDriverStatus ? 'You are not ' : ''}Available to receive orders` )} {isShowDriverStatus && ( <> {userState.loadingDriver ? ( ) : ( handleToggleAvalaibleStatusDriver && handleToggleAvalaibleStatusDriver( !userState?.result?.result?.available, ) } disabled={userState?.loading} animationSpeed={200} /> )} )} )} {!isEdit && !validationFields.error ? ( {!validationFields?.loading && sortInputFields({ values: validationFields?.fields?.checkout }) .length > 0 && ( {sortInputFields({ values: validationFields.fields?.checkout, }).map((field: any) => ( {t(field?.code.toUpperCase(), field?.name)} ))} {t('PASSWORD', 'Password')} {t('PHONE', 'Phone')} )} ) : ( )} {!validationFields.loading && !isEdit && ( )} {!props.isBusinessApp ? ( setOpenModal(true)}> {t('SCHEDULE', 'Schedule')} ) : ( navigation.navigate('PrinterSetup')}> {t('PRINTER_SETTINGS', 'Printer Settings')} )} navigation.navigate('Sessions')}> {t('SESSIONS', 'Sessions')} {allowDeleteDriverAccount && ( onRemoveAccount()} activeOpacity={0.7}> {t('REMOVE_ACCOUNT', 'Remove account')} )} setOpenModal(false)} entireModal hideIcons > {!props.isBusinessApp && ( )} setConfirm({ ...confirm, open: false, title: null })} onClose={() => setConfirm({ ...confirm, open: false, title: null })} /> )} ); }; export const UserProfileForm = (props: any) => { const profileProps = { ...props, UIComponent: ProfileUI, }; return ; };