import React, { useState, useEffect } from 'react'; import moment from 'moment'; import { useLanguage, useConfig, useUtils, useOrder, MomentOption as MomentOptionController, } from 'ordering-components/native'; import { useTheme } from 'styled-components/native'; import { TouchableOpacity, StyleSheet, useWindowDimensions, View, } from 'react-native'; import Spinner from 'react-native-loading-spinner-overlay'; import { MomentOptionParams } from '../../types'; import NavBar from '../NavBar'; import { OIcon, OText } from '../shared'; import { Container } from '../../layouts/Container'; import { WrapSelectOption, Days, Day, WrapHours, Hours, Hour, WrapDelveryTime, } from './styles'; import { TouchableRipple } from 'react-native-paper'; const MomentOptionUI = (props: MomentOptionParams) => { const { navigation, nopadding, datesList, hoursList, dateSelected, timeSelected, handleAsap, handleChangeDate, handleChangeTime, } = props; const theme = useTheme(); const styles = StyleSheet.create({ icon: { marginRight: 10, }, dayNameStyle: { textTransform: 'uppercase', }, selectStyle: { zIndex: 10, }, dateLabel: { borderWidth: 1, borderColor: theme.colors.border, borderRadius: 7.6, paddingHorizontal: 12, paddingVertical: 9, marginBottom: 12, marginHorizontal: 10, marginTop: 10 }, dateWrap: { marginTop: 40, borderRadius: 7.6, borderColor: theme.colors.border, borderWidth: 1, padding: 17, marginBottom: 23, }, timeLabel: { borderWidth: 1, borderColor: theme.colors.border, borderRadius: 7.6, height: 44, paddingHorizontal: 16, flexDirection: 'row', alignItems: 'center' } }); const [, t] = useLanguage(); const [{ configs }] = useConfig(); const [{ parseTime }] = useUtils(); const [orderState] = useOrder(); const { width } = useWindowDimensions(); const [toggleTime, setToggleTime] = useState(false); const [optionSelected, setOptionSelected] = useState({ isAsap: false, isSchedule: false, }); const [momentState, setMomentState] = useState({ isLoading: 0, isEditing: false, }); const momento = moment(`${dateSelected} ${timeSelected}`, 'YYYY-MM-DD HH:mm').toDate(); const momentUnix = momento.getTime() / 1000; const momentFormat = moment.unix(momentUnix).utc().format('YYYY-MM-DD HH:mm:ss'); const goToBack = () => navigation?.canGoBack() && navigation.goBack(); const _handleAsap = () => { setMomentState({ isLoading: 1, isEditing: true }); handleAsap(); setOptionSelected({ isAsap: true, isSchedule: false }); if (!orderState.options?.moment) { setMomentState({ isLoading: 2, isEditing: false }); } }; const handleChangeMoment = (time: any) => { setMomentState({ isLoading: 1, isEditing: true }); handleChangeTime(time); }; useEffect(() => { if (orderState.options?.moment) { setOptionSelected({ isAsap: false, isSchedule: true }); } else { setOptionSelected({ isAsap: true, isSchedule: false }); } if ( momentState.isEditing && (momentFormat === orderState.options?.moment || timeSelected === null) ) { setMomentState({ isLoading: 2, isEditing: false }); } }, [orderState.options?.moment]); useEffect(() => { if (momentState.isLoading === 2 && !orderState?.loading) { goToBack(); } }, [momentState.isLoading]); return ( goToBack()} btnStyle={{ paddingLeft: 0 }} paddingTop={0} style={{ paddingBottom: 0 }} title={t('WHEN_DO_WE_DELIVERY', 'When do we delivery?')} titleAlign={'center'} titleStyle={{ fontSize: 14 }} titleWrapStyle={{ flexBasis: '80%' }} /> _handleAsap()} disabled={orderState.loading} style={{ alignItems: 'flex-start' }}> {optionSelected.isAsap ? ( ) : ( )} {t('ASAP_ABBREVIATION', 'ASAP') + ` (${moment().format('dddd, MMM D, yyyy h:mm A')} + delivery time)`} setOptionSelected({ isAsap: false, isSchedule: true })} disabled={orderState.loading}> {optionSelected.isSchedule ? ( ) : ( )} {t('SCHEDULE_FOR_LATER', 'Schedule for later')} {optionSelected.isSchedule && ( {datesList.length > 0 && ( {dateSelected} {datesList.slice(0, 6).map((date: any, i: any) => { const dateParts = date.split('-') const _date = new Date(dateParts[0], dateParts[1] - 1, dateParts[2]) const dayName = t('DAY' + (_date.getDay() >= 1 ? _date.getDay() : 7)).substring(0, 3).toUpperCase() const dayNumber = (_date.getDate() < 10 ? '0' : '') + _date.getDate() return ( handleChangeDate(date)} style={{ width: (width * 0.25) - 108 }}> {dayName} {dayNumber} ) })} )} {hoursList.length > 0 && optionSelected.isSchedule && ( <> { setToggleTime(!toggleTime) }}> <> {timeSelected ? timeSelected : t('DELIVERY_TIME', 'Delivery Time')} {toggleTime ? ( {hoursList.map((hour: any, i: any) => ( handleChangeMoment(hour.startTime)} disabled={orderState.loading} style={{ borderColor: timeSelected === hour.startTime ? theme.colors.primary : theme.colors.border }} > {configs?.format_time?.value === '12' ? hour.startTime.includes('12') ? `${hour.startTime}PM` : parseTime(moment(hour.startTime, 'HH:mm'), { outputFormat: 'hh:mma', }) : parseTime(moment(hour.startTime, 'HH:mm'), { outputFormat: 'HH:mm', })} ))} ) : null} )} )} ); }; export const MomentOption = (props: any) => { const momentOptionProps = { ...props, UIComponent: MomentOptionUI, }; return ; };