import { useMemo, useCallback, } from 'react' import { WEEKDAYS } from '../constants.js' // Ensure WEEKDAYS is correctly imported type HumanReadableOpeningHours = { openDay :string; closeDay :string; openTime :string; closeTime:string; } /** * Converts a map of human-readable opening hours into a two-tuple representing * the start and end times in "hours:minutes" format from the start of the week. * * @param {HumanReadableOpeningHours} openingHours - The human-readable opening hours. * @returns {[string, string]} A two-tuple of start and end times. */ const useOpeningHoursToTuple = (openingHours: HumanReadableOpeningHours): [string, string] => { const convertDayAndTimeToMinutes = useCallback( ( day: string, time: string, ): number => { const dayIndex = Object.values(WEEKDAYS).findIndex((e) => e === day.toUpperCase()) const [ hours, minutes, ] = time.split(':').map(Number) return dayIndex * 24 * 60 + hours * 60 + minutes }, [], ) const formatMinutesToTimeString = useCallback( (totalMinutes: number): string => { const hours = Math.floor(totalMinutes / 60) const minutes = totalMinutes % 60 return `${hours.toString().padStart( 2, '0', )}:${minutes .toString() .padStart( 2, '0', )}` }, [], ) const isReady = useMemo( () => [ openingHours.openDay, openingHours.closeDay, openingHours.openTime, openingHours.closeTime, ].every(Boolean), [openingHours], ) return useMemo( () => { if (!isReady) { return null } const startMinutes = convertDayAndTimeToMinutes( openingHours.openDay, openingHours.openTime, ) const endMinutes = convertDayAndTimeToMinutes( openingHours.closeDay, openingHours.closeTime, ) const startTime = formatMinutesToTimeString(startMinutes) const endTime = formatMinutesToTimeString(endMinutes) return [ startTime, endTime, ] }, [ openingHours, convertDayAndTimeToMinutes, formatMinutesToTimeString, ], ) } export default useOpeningHoursToTuple