@jk-core/components
Version:
components for jk
84 lines (69 loc) • 2.49 kB
text/typescript
import { CalendarView } from '../type';
interface Props {
method: CalendarView;
selectMode: CalendarView;
viewDate: Date;
setDate:(date: Date) => void;
min: Date;
max: Date;
}
const useCalendarNav = ({
method, selectMode, viewDate, setDate, min, max,
}:Props) => {
const disabled = (direction: 'prev' | 'next') => {
if (selectMode === 'year' || method !== selectMode) return true;
if (method === 'day') {
if (direction === 'prev') {
const prevMonth = new Date(viewDate.getFullYear(), viewDate.getMonth() - 1, 1);
const isPrevMonthBeforeMin = prevMonth.getFullYear() < min.getFullYear()
|| (prevMonth.getFullYear() === min.getFullYear()
&& prevMonth.getMonth() < min.getMonth());
return isPrevMonthBeforeMin;
}
const nextMonth = new Date(viewDate.getFullYear(), viewDate.getMonth() + 1, 1);
return nextMonth > max;
}
if (method === 'month') {
if (direction === 'prev') {
const prevYear = new Date(viewDate.getFullYear() - 1, viewDate.getMonth(), 1);
return prevYear < min;
}
const nextYear = new Date(viewDate.getFullYear() + 1, viewDate.getMonth(), 1);
return nextYear > max;
}
if (method === 'year') {
if (direction === 'prev') {
const prevDecade = new Date(viewDate.getFullYear() - 10, viewDate.getMonth(), 1);
return prevDecade < min;
}
const nextDecade = new Date(viewDate.getFullYear() + 10, viewDate.getMonth(), 1);
return nextDecade > max;
}
return false;
};
const onArrowClick = (direction: 'prev' | 'next') => {
const offset = direction === 'prev' ? -1 : 1;
const minDate = new Date(2000, 0, 1);
const maxDate = new Date(2099, 11, 31);
if (method === 'day') {
const newDate = new Date(viewDate.getFullYear(), viewDate.getMonth() + offset, 1);
if (newDate >= minDate && newDate <= maxDate) {
setDate(newDate);
}
}
if (method === 'month') {
const newDate = new Date(viewDate.getFullYear() + offset, viewDate.getMonth(), 1);
if (newDate >= minDate && newDate <= maxDate) {
setDate(newDate);
}
}
if (method === 'year') {
const newDate = new Date(viewDate.getFullYear() + offset * 10, viewDate.getMonth(), 1);
if (newDate >= minDate && newDate <= maxDate) {
setDate(newDate);
}
}
};
return { disabled, onArrowClick };
};
export default useCalendarNav;