UNPKG

mobile-react-infinite-calendar

Version:

A mobile-optimized infinite scroll calendar component for React

64 lines (63 loc) 2.57 kB
/** * 캘린더 상태 관리 훅 * 모든 비즈니스 로직과 상태 관리를 담당 */ import { useMemo, useCallback, useEffect } from 'react'; import { subMonths, addMonths } from 'date-fns'; import { useCalendarComposer } from './useCalendarComposer'; import { useDynamicEvents } from './useDynamicEvents'; export function useCalendarState({ events = [], holidays = [], dynamicEvents, dynamicEventMapping, dynamicEventTransform, onDynamicEventLoad, locale = 'ko-KR', holidayServiceKey, options = {} }) { // 로거 초기화 (한 번만) const isDebugEnabled = useMemo(() => !!options.debug, [options.debug]); // 동적 이벤트 로딩 - infiniteMonths는 나중에 전달 const { dynamicEvents: loadedDynamicEvents, loadingMonths, isLoading: isDynamicLoading, cacheInfo, updateInfiniteMonths } = useDynamicEvents({ dynamicEvents, infiniteMonths: [], // 초기값 enableDynamicLoading: !!dynamicEvents, dynamicEventMapping, dynamicEventTransform, onDynamicEventLoad }); // 이벤트 병합 const mergedEvents = useMemo(() => { const staticEvents = events || []; const dynamicEventsArray = loadedDynamicEvents || []; return [...staticEvents, ...dynamicEventsArray]; }, [events, loadedDynamicEvents]); // 캘린더 컴포저 (병합된 이벤트 사용) const calendarState = useCalendarComposer({ events: mergedEvents, holidays, locale, holidayServiceKey }); // infiniteMonths가 변경될 때마다 동적 이벤트 훅에 전달 useEffect(() => { if (updateInfiniteMonths && calendarState.infiniteMonths) { updateInfiniteMonths(calendarState.infiniteMonths); } }, [calendarState.infiniteMonths, updateInfiniteMonths]); // 오늘 버튼 핸들러 const handleTodayClick = useCallback(() => { const today = new Date(); calendarState.setActiveMonth(today); calendarState.setDisplayMonth(today); calendarState.setIsInitialScrollSet(false); // 무한 월 리스트 초기화 const prevMonth = subMonths(today, 1); const nextMonth = addMonths(today, 1); calendarState.setInfiniteMonths([prevMonth, today, nextMonth]); }, [calendarState]); return { // 상태 ...calendarState, // 동적 이벤트 관련 isDynamicLoading, loadingMonths, cacheInfo, // 액션 handleTodayClick, // 디버그 isDebugEnabled }; }