react-day-picker
Version:
Customizable Date Picker for React
114 lines (113 loc) • 5.3 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.createJalaliNoonOverrides = createJalaliNoonOverrides;
const tz_1 = require("@date-fns/tz");
const date_fns_jalali_1 = require("date-fns-jalali");
/**
* Jalali-aware version of {@link createNoonDateLibOverrides}.
*
* Keeps all calendar math at noon in the target time zone while deferring to
* `date-fns-jalali` for calendar logic.
*/
function createJalaliNoonOverrides(timeZone, options = {}) {
const { weekStartsOn, locale } = options;
const fallbackWeekStartsOn = (weekStartsOn ??
locale?.options?.weekStartsOn ??
6);
// Keep all internal math anchored at noon in the target zone to avoid
// historical second-level offsets from crossing midnight.
const toNoonTZDate = (date) => {
const normalizedDate = typeof date === "number" || typeof date === "string"
? new Date(date)
: date;
return new tz_1.TZDate(normalizedDate.getFullYear(), normalizedDate.getMonth(), normalizedDate.getDate(), 12, 0, 0, timeZone);
};
// Represent the target-zone calendar date in the host zone so date-fns-jalali
// (which is not time-zone aware) can operate on stable wall times.
const toCalendarDate = (date) => {
const zoned = toNoonTZDate(date);
return new Date(zoned.getFullYear(), zoned.getMonth(), zoned.getDate(), 12, 0, 0, 0);
};
return {
today: () => toNoonTZDate(tz_1.TZDate.tz(timeZone)),
newDate: (year, monthIndex, date) => new tz_1.TZDate(year, monthIndex, date, 12, 0, 0, timeZone),
startOfDay: (date) => {
return toNoonTZDate(date);
},
startOfWeek: (date, options) => {
const weekStartsOnValue = (options?.weekStartsOn ??
fallbackWeekStartsOn);
const start = (0, date_fns_jalali_1.startOfWeek)(toCalendarDate(date), {
weekStartsOn: weekStartsOnValue,
});
return toNoonTZDate(start);
},
startOfISOWeek: (date) => {
const start = (0, date_fns_jalali_1.startOfISOWeek)(toCalendarDate(date));
return toNoonTZDate(start);
},
startOfMonth: (date) => {
const start = (0, date_fns_jalali_1.startOfMonth)(toCalendarDate(date));
return toNoonTZDate(start);
},
startOfYear: (date) => {
const start = (0, date_fns_jalali_1.startOfYear)(toCalendarDate(date));
return toNoonTZDate(start);
},
endOfWeek: (date, options) => {
const weekStartsOnValue = (options?.weekStartsOn ??
fallbackWeekStartsOn);
const end = (0, date_fns_jalali_1.endOfWeek)(toCalendarDate(date), {
weekStartsOn: weekStartsOnValue,
});
return toNoonTZDate(end);
},
endOfISOWeek: (date) => {
const end = (0, date_fns_jalali_1.endOfISOWeek)(toCalendarDate(date));
return toNoonTZDate(end);
},
endOfMonth: (date) => {
const end = (0, date_fns_jalali_1.endOfMonth)(toCalendarDate(date));
return toNoonTZDate(end);
},
endOfYear: (date) => {
const end = (0, date_fns_jalali_1.endOfYear)(toCalendarDate(date));
return toNoonTZDate(end);
},
eachMonthOfInterval: (interval) => {
return (0, date_fns_jalali_1.eachMonthOfInterval)({
start: toCalendarDate(interval.start),
end: toCalendarDate(interval.end),
}).map((date) => toNoonTZDate(date));
},
addDays: (date, amount) => toNoonTZDate((0, date_fns_jalali_1.addDays)(toCalendarDate(date), amount)),
addWeeks: (date, amount) => toNoonTZDate((0, date_fns_jalali_1.addWeeks)(toCalendarDate(date), amount)),
addMonths: (date, amount) => toNoonTZDate((0, date_fns_jalali_1.addMonths)(toCalendarDate(date), amount)),
addYears: (date, amount) => toNoonTZDate((0, date_fns_jalali_1.addYears)(toCalendarDate(date), amount)),
eachYearOfInterval: (interval) => {
return (0, date_fns_jalali_1.eachYearOfInterval)({
start: toCalendarDate(interval.start),
end: toCalendarDate(interval.end),
}).map((date) => toNoonTZDate(date));
},
getWeek: (date, options) => {
const base = toCalendarDate(date);
return (0, date_fns_jalali_1.getWeek)(base, {
weekStartsOn: options?.weekStartsOn ?? fallbackWeekStartsOn,
firstWeekContainsDate: options?.firstWeekContainsDate ??
locale?.options?.firstWeekContainsDate ??
1,
});
},
differenceInCalendarDays: (dateLeft, dateRight) => {
const left = toCalendarDate(dateLeft);
const right = toCalendarDate(dateRight);
return (0, date_fns_jalali_1.differenceInCalendarDays)(left, right);
},
differenceInCalendarMonths: (dateLeft, dateRight) => {
const left = toCalendarDate(dateLeft);
const right = toCalendarDate(dateRight);
return (0, date_fns_jalali_1.differenceInCalendarMonths)(left, right);
},
};
}