UNPKG

@open-tender/utils

Version:

A library of utils for use with Open Tender applications that utilize our cloud-based Order API.

78 lines (77 loc) 3.5 kB
import { useMemo, useState } from 'react'; import { dateStrMinutesToIso, isoToDateStrMinutes, makeDates, makeReadableDateStrFromIso, makeTimes, timezoneMap } from '../utils'; export const useFirstTimes = (firstTime, revenueCenter, serviceType, orderType, requestedAt, isGroupOrder = false, days = 100) => { const { timezone, holidays, days_ahead, valid_times, group_ordering } = revenueCenter; const { prep_time = 0, lead_time = 0 } = group_ordering || {}; const leadTime = isGroupOrder ? prep_time + lead_time : 0; const tz = timezoneMap[timezone]; const selected = requestedAt && requestedAt !== 'asap'; const requested = selected ? isoToDateStrMinutes(requestedAt, tz) : { date: null, minutes: null }; const [date, setDate] = useState(requested.date || firstTime.date); const [time, setTime] = useState(requested.minutes || firstTime.minutes); const [dateChange, setDateChange] = useState(false); const daysAhead = orderType === 'CATERING' ? days : days_ahead; const dates = useMemo(() => makeDates(firstTime.date, daysAhead, 'E, MMM d'), [firstTime.date, daysAhead]); const dateOptions = dates.map(({ label, value }) => ({ name: label, value })); const timeOptions = useMemo(() => { if (date && valid_times) { const options = makeTimes(date, firstTime, valid_times, holidays, serviceType, leadTime); return options !== null && options !== void 0 ? options : []; } else { return []; } }, [date, firstTime, valid_times, holidays, serviceType, leadTime]); const orderDate = dateOptions.find(i => i.value === date); const showAsap = firstTime.has_asap && date === firstTime.date ? true : false; const firstIso = dateStrMinutesToIso(firstTime.date, firstTime.minutes + leadTime, tz); const asapTime = showAsap ? makeReadableDateStrFromIso(firstIso, tz) : null; const asapTimeOption = { name: `ASAP (about ${asapTime})`, value: 'asap', disabled: false }; const timeOptionsAsap = showAsap ? [asapTimeOption, ...timeOptions] : timeOptions; const firstOrderableTime = timeOptionsAsap ? timeOptionsAsap.find(i => !i.disabled) : null; const firstMinutes = firstOrderableTime ? firstOrderableTime.value : null; const defaultTime = timeOptionsAsap ? timeOptionsAsap.find(i => i.value === firstMinutes) : null; const orderTime = timeOptionsAsap ? timeOptionsAsap.find(i => i.value === time) || defaultTime : null; const isAsap = orderTime && orderTime.value === 'asap' ? true : false; const orderMsg = orderDate && orderTime ? isAsap ? `Order ${orderTime.name}` : `Order for ${orderDate.name} @ ${orderTime.name}` : 'Choose Time'; const timeVal = orderTime ? orderTime.value : time; const timeInt = timeVal === 'asap' ? 0 : Number(timeVal); const requestedTime = isAsap ? 'asap' : dateStrMinutesToIso(date, timeInt, tz); const closedTimeOptions = [{ name: 'Closed', value: null, disabled: false }]; const timeOptionsAdjusted = !timeOptionsAsap.length ? closedTimeOptions : timeOptionsAsap; return { date, setDate, time, setTime, dateChange, setDateChange, dateOptions, timeOptions: timeOptionsAdjusted, firstMinutes, requestedTime, orderMsg }; };