pickadate
Version:
The composable date & time picker.
102 lines (89 loc) • 2.4 kB
JavaScript
// @flow
import type { Weekdays, WeekdaysIndex } from 'pickadate/types'
import * as jsUtil from 'pickadate/utils/jsUtil'
const DAYS_IN_WEEK = 7
/**
* Gets the weekday labels.
*/
export const getWeekdayLabels = (
weekdays: Weekdays,
firstDayOfWeek: WeekdaysIndex
): Weekdays =>
(weekdays: any).map(
(_, dayIndex) => weekdays[(dayIndex + firstDayOfWeek) % DAYS_IN_WEEK]
)
/**
* Gets the dates in weeks.
*/
export const getDatesInWeeks = (
originDateObject: Date,
firstDayOfWeek: WeekdaysIndex
): Array<Array<Date>> => {
const year = originDateObject.getFullYear()
const month = originDateObject.getMonth()
const monthOfLastDayInFirstWeek = getMonthOfLastDayInFirstWeek(
year,
month,
firstDayOfWeek
)
const shift = monthOfLastDayInFirstWeek === month ? 0 : -1
const start = 0 + shift
const end = 5 + shift
return jsUtil
.createRange(start, end)
.map(weekIndex => getDatesInWeek(year, month, weekIndex, firstDayOfWeek))
}
/**
* Gets the dates in a week.
*/
export const getDatesInWeek = (
year: number,
month: number,
weekIndex: number,
firstDayOfWeek: WeekdaysIndex
): Array<Date> => {
const startDayOfMonth = getStartDayOfMonth(year, month)
const startDayOfWeek = weekIndex * DAYS_IN_WEEK
const start = 1
const end = 7
return jsUtil
.createRange(start, end)
.map(
date =>
new Date(
year,
month,
date + startDayOfWeek - startDayOfMonth + firstDayOfWeek
)
)
}
/**
* Gets the month of the last day in the first week of a month.
*/
export const getMonthOfLastDayInFirstWeek = (
year: number,
month: number,
firstDayOfWeek: WeekdaysIndex
) => {
const startDayOfMonth = getStartDayOfMonth(year, month) - firstDayOfWeek
const date = DAYS_IN_WEEK - startDayOfMonth
if (startDayOfMonth < 0) {
return new Date(year, month, firstDayOfWeek - date).getMonth()
}
return new Date(year, month, date).getMonth()
}
/**
* Gets the start day of a month.
*/
export const getStartDayOfMonth = (year: number, month: number) => {
const startDateOfMonth = new Date(year, month, 1)
return startDateOfMonth.getDay()
}
/**
* Gets the start date of a month, give a date.
*/
export const getStartDateOfMonth = (dateObject: Date) => {
const year = dateObject.getFullYear()
const month = dateObject.getMonth()
return new Date(year, month, 1)
}