@atlaskit/calendar
Version:
An interactive calendar for date selection experiences.
72 lines (71 loc) • 2.55 kB
JavaScript
/**
* Logic taken from https://github.com/WesSouza/calendar-base which is not maintained for quite sometime.
* This will help us fixing any issue we might get or any new functionality we might want to support.
* Not changing much code below. Just removed those parts which we don't need.
*/
import { daysPerWeek, monthsPerYear } from '../constants';
import getDaysInMonth from './get-days-in-month';
export default function getBaseCalendar(year, month, {
weekStartDay = 0
} = {
weekStartDay: 0
}) {
const date = new Date(Date.UTC(year, month, 1, 0, 0, 0, 0));
const utcYear = date.getUTCFullYear();
const utcMonth = date.getUTCMonth();
const calendar = [];
const firstDay = date.getUTCDay();
const firstDate = -((daysPerWeek - weekStartDay + firstDay) % daysPerWeek);
const lastDate = getDaysInMonth(utcYear, utcMonth);
const lastDay = (lastDate - firstDate) % daysPerWeek;
const lastDateOfPreviousMonth = getDaysInMonth(utcYear, utcMonth - 1);
let dateCounter = firstDate;
let currentDay;
let currentDate;
let currentDateObject = null;
let calculatedMonth;
let calculatedYear;
const maxDateCount = lastDate - dateCounter + (lastDay !== 0 ? daysPerWeek - lastDay : 0) + firstDate;
while (dateCounter < maxDateCount) {
currentDate = dateCounter + 1;
currentDay = ((dateCounter < 1 ? daysPerWeek + dateCounter : dateCounter) + firstDay) % daysPerWeek;
if (currentDate < 1 || currentDate > lastDate) {
if (currentDate < 1) {
calculatedMonth = utcMonth - 1;
calculatedYear = utcYear;
if (calculatedMonth < 0) {
calculatedMonth = monthsPerYear - 1;
calculatedYear--;
}
currentDate = lastDateOfPreviousMonth + currentDate;
} else if (currentDate > lastDate) {
calculatedMonth = utcMonth + 1;
calculatedYear = utcYear;
if (calculatedMonth > monthsPerYear - 1) {
calculatedMonth = 0;
calculatedYear++;
}
currentDate = dateCounter - lastDate + 1;
}
if (calculatedMonth !== undefined && calculatedYear !== undefined) {
currentDateObject = {
day: currentDate,
weekDay: currentDay,
month: calculatedMonth,
year: calculatedYear,
siblingMonth: true
};
}
} else {
currentDateObject = {
day: currentDate,
weekDay: currentDay,
month: utcMonth,
year: utcYear
};
}
calendar.push(currentDateObject);
dateCounter++;
}
return calendar;
}