{
const { nextMonth, previousMonth, goToMonth } = useDayPicker()
const isPreviousDisabled = (() => {
if (navView === 'years') {
return (
(startMonth &&
moment(new Date(displayYears.from - 1, 0, 1)).isBefore(
moment(startMonth),
'day',
)) ||
(endMonth &&
moment(new Date(displayYears.from - 1, 0, 1)).isAfter(
moment(endMonth),
'day',
))
)
}
return !previousMonth
})()
const isNextDisabled = (() => {
if (navView === 'years') {
return (
(startMonth &&
moment(new Date(displayYears.to + 1, 0, 1)).isBefore(
moment(startMonth),
'day',
)) ||
(endMonth &&
moment(new Date(displayYears.to + 1, 0, 1)).isAfter(
moment(endMonth),
'day',
))
)
}
return !nextMonth
})()
const handlePreviousClick = React.useCallback(() => {
if (navView === 'years') {
setDisplayYears((prev) => ({
from: prev.from - (prev.to - prev.from + 1),
to: prev.to - (prev.to - prev.from + 1),
}))
onPrevClick?.(
new Date(
displayYears.from - (displayYears.to - displayYears.from),
0,
1,
),
)
return
}
if (navView === 'months') {
setSelectedYear((prevYear) => prevYear - 1)
return
}
if (!previousMonth) return
goToMonth(previousMonth)
onPrevClick?.(previousMonth)
}, [previousMonth, goToMonth])
const handleNextClick = React.useCallback(() => {
if (navView === 'years') {
setDisplayYears((prev) => ({
from: prev.from + (prev.to - prev.from + 1),
to: prev.to + (prev.to - prev.from + 1),
}))
onNextClick?.(
new Date(
displayYears.from + (displayYears.to - displayYears.from),
0,
1,
),
)
return
}
if (navView === 'months') {
setSelectedYear((prevYear) => prevYear + 1)
return
}
if (!nextMonth) return
goToMonth(nextMonth)
onNextClick?.(nextMonth)
}, [goToMonth, nextMonth])
return (
)
},
CaptionLabel: ({ children, ...props }) => {
if (!showYearSwitcher) return {children}
return (
)
},
MonthGrid: ({ className, children, ...props }) => {
const { goToMonth } = useDayPicker()
if (navView === 'years') {
return (
{Array.from(
{ length: displayYears.to - displayYears.from + 1 },
(_, i) => {
const year = displayYears.from + i
const isToday = year === new Date().getFullYear()
const selectedClass = isYearSelected(year)
const isDisabled =
(startMonth &&
moment(new Date(year, 11, 31)).isBefore(
moment(startMonth),
'day',
)) ||
(endMonth &&
moment(new Date(year, 0, 1)).isAfter(
moment(endMonth),
'day',
))
return (
)
},
)}
)
} else if (navView === 'months') {
return (
{Array.from({ length: 12 }, (_, i) => {
const isToday =
i === new Date().getMonth() &&
selectedYear === new Date().getFullYear()
const selectedClass = isMonthSelected(i, selectedYear)
return (
)
})}
)
}
return
},
}}
numberOfMonths={columnsDisplayed}
{...props}
/>
>
)
}
Calendar.displayName = 'Calendar'
export { Calendar }