UNPKG

sanity

Version:

Sanity is a real-time content infrastructure with a scalable, hosted backend featuring a Graph Oriented Query Language (GROQ), asset pipelines and fast edge caches

46 lines (39 loc) 1.27 kB
import {addDays, eachWeekOfInterval, getWeek, lastDayOfMonth, startOfMonth} from 'date-fns' import {useCurrentLocale} from '../../../../../i18n/hooks/useLocale' import {TAIL_WEEKDAYS} from './constants' /** * NOTE: `weekStartsOn` uses 1 for Monday, 7 for Sunday. date-fns wants 0 for Sunday, 6 for Saturday. */ const getWeekStartsOfMonth = (date: Date, weekStartsOn: 1 | 2 | 3 | 4 | 5 | 6 | 7): Date[] => { const firstDay = startOfMonth(date) return eachWeekOfInterval( { start: firstDay, end: lastDayOfMonth(firstDay), }, { weekStartsOn: weekStartsOn === 7 ? 0 : weekStartsOn, }, ) } const getWeekDaysFromWeekStarts = (weekStarts: Date[]): Date[][] => { return weekStarts.map((weekStart) => [ weekStart, ...TAIL_WEEKDAYS.map((d) => addDays(weekStart, d)), ]) } type Week = { number: number days: Date[] } export const useWeeksOfMonth = (date: Date): Week[] => { const {weekInfo} = useCurrentLocale() return getWeekDaysFromWeekStarts(getWeekStartsOfMonth(date, weekInfo.firstDay)).map( (days): Week => ({ number: getWeek(days[0]), days, }), ) } export const formatTime = (hours: number, minutes: number): string => `${`${hours}`.padStart(2, '0')}:${`${minutes}`.padStart(2, '0')}`