UNPKG

@jk-core/components

Version:
84 lines (69 loc) 2.49 kB
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;