import { logger } from '@scandic-hotels/common/logger' import type { IntlShape } from 'react-intl' import type { AlternateOpeningHours, OpeningHours } from './openingHoursTypes' export function getGroupedOpeningHours( openingHours: OpeningHours | AlternateOpeningHours, intl: IntlShape ): string[] { const closedMsg = intl.formatMessage({ id: 'openingHours.closed', defaultMessage: 'Closed', }) const alwaysOpenMsg = intl.formatMessage({ id: 'openingHours.alwaysOpen', defaultMessage: 'Always open', }) // In order const weekdayDefinitions = [ { key: 'monday', label: intl.formatMessage({ id: 'common.monday', defaultMessage: 'Monday', }), }, { key: 'tuesday', label: intl.formatMessage({ id: 'common.tuesday', defaultMessage: 'Tuesday', }), }, { key: 'wednesday', label: intl.formatMessage({ id: 'common.wednesday', defaultMessage: 'Wednesday', }), }, { key: 'thursday', label: intl.formatMessage({ id: 'common.thursday', defaultMessage: 'Thursday', }), }, { key: 'friday', label: intl.formatMessage({ id: 'common.friday', defaultMessage: 'Friday', }), }, { key: 'saturday', label: intl.formatMessage({ id: 'common.saturday', defaultMessage: 'Saturday', }), }, { key: 'sunday', label: intl.formatMessage({ id: 'common.sunday', defaultMessage: 'Sunday', }), }, ] as const const groupedOpeningHours: string[] = [] let rangeWeekdays: string[] = [] let rangeValue = '' for (let i = 0, n = weekdayDefinitions.length; i < n; ++i) { const weekdayDefinition = weekdayDefinitions[i] const weekday = openingHours[weekdayDefinition.key] const label = weekdayDefinition.label if (weekday) { let newValue = null if (weekday.alwaysOpen) { newValue = alwaysOpenMsg } else if (weekday.isClosed) { newValue = closedMsg } else if (weekday.openingTime && weekday.closingTime) { newValue = `${weekday.openingTime}-${weekday.closingTime}` } if (newValue !== null) { if (rangeValue === newValue) { if (rangeWeekdays.length > 1) { rangeWeekdays.splice(-1, 1, label) // Replace last element } else { rangeWeekdays.push(label) } } else { if (rangeValue) { groupedOpeningHours.push( `${rangeWeekdays.join('-')}: ${rangeValue}` ) } rangeValue = newValue rangeWeekdays = [label] } } if (rangeValue && i === n - 1) { // Flush everything at the end groupedOpeningHours.push(`${rangeWeekdays.join('-')}: ${rangeValue}`) } } else if (rangeValue) { groupedOpeningHours.push(`${rangeWeekdays.join('-')}: ${rangeValue}`) rangeValue = '' rangeWeekdays = [] } } return groupedOpeningHours } export function getTranslatedName(name: string, intl: IntlShape) { const lowercaseName = name.toLowerCase() switch (lowercaseName) { case 'breakfast': return intl.formatMessage({ id: 'common.breakfast', defaultMessage: 'Breakfast', }) case 'brunch': return intl.formatMessage({ id: 'common.brunch', defaultMessage: 'Brunch', }) case 'after work': return intl.formatMessage({ id: 'common.afterwork', defaultMessage: 'After Work', }) case 'cafe': return intl.formatMessage({ id: 'common.cafe', defaultMessage: 'Café', }) case 'lunch': return intl.formatMessage({ id: 'common.lunch', defaultMessage: 'Lunch', }) case 'dinner': return intl.formatMessage({ id: 'common.dinner', defaultMessage: 'Dinner', }) case 'bar': return intl.formatMessage({ id: 'common.bar', defaultMessage: 'Bar', }) case 'snacks & drinks': return intl.formatMessage({ id: 'common.snacks&drinks', defaultMessage: 'Snacks & drinks', }) case 'takeaway': return intl.formatMessage({ id: 'common.takeaway', defaultMessage: 'Takeaway', }) case 'changes': return intl.formatMessage({ id: 'common.changes', defaultMessage: 'Changes', }) case 'live events': return intl.formatMessage({ id: 'common.liveEvents', defaultMessage: 'Live events', }) case 'terrace': return intl.formatMessage({ id: 'common.terrace', defaultMessage: 'Terrace', }) default: logger.warn(`Unsupported name given: ${name}`) return intl.formatMessage({ id: 'common.NA', defaultMessage: 'N/A', }) } }