// src/pages/agent-office/hooks/useActivityFeed.js import { useState, useEffect, useCallback, useRef } from 'react'; import { agentActivity } from '../../../api'; const PAGE_SIZE = 30; export function useActivityFeed(filters, refreshTrigger = 0) { const [items, setItems] = useState([]); const [total, setTotal] = useState(0); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); const offsetRef = useRef(0); const loadingRef = useRef(false); const filtersRef = useRef(filters); filtersRef.current = filters; const filterKey = JSON.stringify(filters); const fetchPage = useCallback(async (offset, replace) => { if (loadingRef.current) return; loadingRef.current = true; setLoading(true); setError(null); try { const data = await agentActivity({ ...filtersRef.current, limit: PAGE_SIZE, offset }); const newItems = Array.isArray(data?.items) ? data.items : []; setTotal(data?.total || 0); setItems(prev => (replace ? newItems : [...prev, ...newItems])); offsetRef.current = offset + newItems.length; } catch (e) { setError(e.message || '불러오기 실패'); } finally { loadingRef.current = false; setLoading(false); } }, []); useEffect(() => { offsetRef.current = 0; fetchPage(0, true); }, [filterKey, refreshTrigger, fetchPage]); const loadMore = useCallback(() => { if (loadingRef.current) return; if (offsetRef.current >= total) return; fetchPage(offsetRef.current, false); }, [fetchPage, total]); const retry = useCallback(() => { offsetRef.current = 0; fetchPage(0, true); }, [fetchPage]); const hasMore = items.length < total; return { items, total, loading, error, hasMore, loadMore, retry }; }