import React, { useState, useEffect } from 'react' import moment from 'moment' import { useLanguage, useConfig, useUtils, useOrder, MomentOption as MomentOptionController } from 'ordering-components-external/native' import { StyleSheet, TextStyle, TouchableOpacity, 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 { useTheme } from 'styled-components/native' import { Container } from '../../layouts/Container' import { WrapSelectOption, Days, Day, WrapHours, Hours, Hour, WrapDelveryTime } from './styles' import { SafeAreaView } from 'react-native-safe-area-context' 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: 'capitalize' }, selectStyle: { zIndex: 10 }, timeText: { fontSize: 14, lineHeight: 24, marginStart: 24 }, todayDate: { width: 26, height: 26, backgroundColor: theme.colors.primary, alignItems: 'center', justifyContent: 'center', borderRadius: 15 }, timePicker: { flexDirection: 'row', alignItems: 'center', justifyContent: 'space-between', height: 44, maxHeight: 44, borderWidth: 1, borderColor: theme.colors.border, borderRadius: 7.6, marginTop: 50, paddingHorizontal: 16 } }) const [, t] = useLanguage() const [{ configs }] = useConfig() const [{ parseTime }] = useUtils() const [orderState] = useOrder() const [optionSelected, setOptionSelected] = useState({ isAsap: false, isSchedule: false }) const [momentState, setMomentState] = useState({ isLoading: 0, isEditing: false }) const [showTimes, setShowTimes] = useState(false); 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) } 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') 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?')} /> _handleAsap()} disabled={orderState.loading} > {optionSelected.isAsap ? ( ) : ( )} {`${t('ASAP_ABBREVIATION', 'ASAP')} (${moment().format('dddd, MMMM D, yyyy h:m A')})`} setOptionSelected({ isAsap: false, isSchedule: true })} disabled={orderState.loading} > {optionSelected.isSchedule ? ( ) : ( )} {t('SCHEDULE_FOR_LATER', 'Schedule for later')} {optionSelected.isSchedule && ( {datesList.length > 0 && ( { 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)} > {dayName} {dayNumber} ) }) } )} {hoursList.length > 0 && optionSelected.isSchedule && ( <> { setShowTimes(!showTimes) }}> {timeSelected != null ? parseTime(moment(timeSelected, 'HH:mm'), { outputFormat: 'hh:mma' }) : '00:00'} {showTimes && ( { hoursList.map((hour: any, i: any) => ( handleChangeMoment(hour.startTime)} disabled={orderState.loading} > {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' }) )} )) } )} )} )} ) } export const MomentOption = (props: any) => { const momentOptionProps = { ...props, UIComponent: MomentOptionUI } return }