UNPKG

@parkassist/pa-ui-library

Version:
121 lines 4.49 kB
import dayjs from 'dayjs'; const getLabelFromTime = time => { const fullHour = Math.floor(time); const minutes = (time - fullHour) * 60; const endTime = dayjs().hour(fullHour).minute(minutes); const formattedEndTime = fullHour === 24 && endTime.minute() === 0 ? endTime.hour(23).minute(59) : endTime; return formattedEndTime.format("HH:mm"); }; const getTimeFromLabel = label => { const [hour, minutes] = label.split(":"); return +hour + +minutes / 60; }; export const getDefaultWeekHoursObject = () => ({ 0: [], 1: [], 2: [], 3: [], 4: [], 5: [], 6: [] }); export const checkIsInRange = (selected, element) => { return selected.day === element.day && element.time >= selected.start.time && element.time <= selected.end.time; }; export const checkIfClicked = (selected, element) => { if (!selected) return false; return selected.day === element.day && selected.start.time === element.time; }; export const prepareRange = (element, finalTime, day) => { return Object.assign(Object.assign({}, element), { day, end: finalTime.finalEnd ? Object.assign({}, finalTime.finalEnd) : element.end, start: finalTime.finalStart ? Object.assign({}, finalTime.finalStart) : element.start }); }; export const setStartEndTimes = (el, selectedElement) => { const start = el.time > selectedElement.start.time ? selectedElement.start : el; const end = el.time > selectedElement.start.time ? el : selectedElement.start; return Object.assign(Object.assign({}, selectedElement), { start, end }); }; export const shouldConcatRanges = (range, element, interval) => { const value = interval / 60; return range.start.time >= element.start.time && range.end.time <= element.end.time || range.start.time <= element.end.time && range.end.time >= element.end.time || range.start.time <= element.start.time && range.end.time >= element.start.time || range.start.time - value === element.end.time || range.end.time + value === element.start.time; }; export const getNoOverlappingRangesAndFinalEnd = (ranges, element, interval) => { let finalEnd, finalStart; const notOverlappingRanges = []; ranges.forEach(range => { if (shouldConcatRanges(range, element, interval)) { const end = range.end.time >= element.end.time ? range.end : element.end; const start = range.start.time <= element.start.time ? range.start : element.start; finalStart = (finalStart === null || finalStart === void 0 ? void 0 : finalStart.time) <= start.time ? finalStart : start; finalEnd = (finalEnd === null || finalEnd === void 0 ? void 0 : finalEnd.time) >= end.time ? finalEnd : end; } else { notOverlappingRanges.push(range); } }); return { notOverlappingRanges, finalTime: { finalEnd: finalEnd || element.end, finalStart: finalStart || element.start } }; }; export const getOptions = interval => { const value = interval / 60; return Array(24 / value).fill(null).map((_, i) => { const hour = i * value; const fullHour = Math.floor(hour); const minutes = (hour - fullHour) * 60; return { time: hour, label: dayjs().hour(fullHour).minute(minutes).format("HH:mm") }; }); }; export const createRanges = (value, interval) => { const preparedRanges = []; Object.keys(value).forEach(key => { const ranges = value[key]; if (ranges.length > 0) { ranges.forEach(range => { const intervalToSubtract = range.end === '23:59' ? interval - 1 : interval; const startTime = getTimeFromLabel(range.start); const endTime = getTimeFromLabel(range.end) - intervalToSubtract / 60; const endLabel = getLabelFromTime(endTime); const preparedRange = { day: +key, start: { label: range.start, time: startTime }, end: { label: endLabel, time: endTime } }; preparedRanges.push(preparedRange); }); } }); return preparedRanges; }; export const formatRanges = (ranges, interval) => { const finalRanges = getDefaultWeekHoursObject(); const sorted = [...ranges]; sorted.sort((a, b) => a.start.time - b.start.time); sorted.forEach(range => { const changedEndTime = range.end.time + interval / 60; const formattedEndTime = getLabelFromTime(changedEndTime); finalRanges[range.day].push({ start: range.start.label, end: formattedEndTime }); }); return finalRanges; };