mobile-react-infinite-calendar
Version:
A mobile-optimized infinite scroll calendar component for React
44 lines (43 loc) • 1.85 kB
JavaScript
/**
* 스크롤 관리 커스텀 훅
*/
import { useEffect } from 'react';
import { SCROLL_CONSTANTS } from '../constants/calendar';
export function useScrollManagement({ scrollContainerRef, onScrollToTop, onScrollToBottom }) {
useEffect(() => {
const container = scrollContainerRef.current;
if (!container)
return;
let isLoading = false;
const handleScroll = () => {
if (isLoading)
return;
const { scrollTop, scrollHeight, clientHeight } = container;
// iOS Safari 스크롤 바운스 효과 고려
// 음수 scrollTop이나 과도한 스크롤은 무시
if (scrollTop < -10 || scrollTop + clientHeight > scrollHeight + 10) {
return;
}
// 상단 근처에서 이전 월 추가
if (scrollTop < SCROLL_CONSTANTS.THRESHOLD && scrollTop >= 0) {
isLoading = true;
onScrollToTop();
setTimeout(() => {
isLoading = false;
}, SCROLL_CONSTANTS.LOADING_TIMEOUT);
}
// 하단 근처에서 다음 월 추가
else if (scrollTop + clientHeight > scrollHeight - SCROLL_CONSTANTS.THRESHOLD &&
scrollTop + clientHeight <= scrollHeight) {
isLoading = true;
onScrollToBottom();
setTimeout(() => {
isLoading = false;
}, SCROLL_CONSTANTS.LOADING_TIMEOUT);
}
};
// 모바일 Safari 최적화: passive scroll 이벤트 사용
container.addEventListener('scroll', handleScroll, { passive: true });
return () => container.removeEventListener('scroll', handleScroll);
}, [scrollContainerRef, onScrollToTop, onScrollToBottom]);
}