@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
JavaScript
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
};
};