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
text/typescript
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')}`