import { useState, useEffect, useCallback } from 'react'; import { loadCategoryBudgetsFromStorage, saveCategoryBudgetsToStorage, clearAllCategoryBudgets } from '../storage'; // 카테고리 예산 상태 관리 훅 export const useCategoryBudgetState = () => { const [categoryBudgets, setCategoryBudgets] = useState>( loadCategoryBudgetsFromStorage() ); const [isInitialized, setIsInitialized] = useState(false); // 초기 로드 및 이벤트 리스너 설정 useEffect(() => { const loadCategories = () => { try { console.log('카테고리 예산 로드 시도 중...'); const loaded = loadCategoryBudgetsFromStorage(); console.log('카테고리 예산 로드됨:', loaded); setCategoryBudgets(loaded); // 최근 데이터 로드 시간 기록 localStorage.setItem('lastCategoryBudgetLoadTime', new Date().toISOString()); if (!isInitialized) { setIsInitialized(true); } } catch (error) { console.error('카테고리 예산 로드 중 오류:', error); } }; // 초기 로드 loadCategories(); // 이벤트 리스너 설정 const handleCategoryUpdate = (e?: StorageEvent) => { console.log('카테고리 예산 업데이트 이벤트 감지:', e?.key); if (!e || e.key === 'categoryBudgets' || e.key === null) { loadCategories(); } }; window.addEventListener('categoryBudgetsUpdated', () => handleCategoryUpdate()); window.addEventListener('storage', handleCategoryUpdate); window.addEventListener('visibilitychange', () => { if (document.visibilityState === 'visible') { console.log('페이지 보임: 카테고리 예산 새로고침'); loadCategories(); } }); window.addEventListener('focus', () => { console.log('창 포커스: 카테고리 예산 새로고침'); loadCategories(); }); // 주기적 데이터 검사 const intervalId = setInterval(() => { const lastSaveTime = localStorage.getItem('lastCategoryBudgetSaveTime'); const lastLoadTime = localStorage.getItem('lastCategoryBudgetLoadTime'); if (lastSaveTime && lastLoadTime && new Date(lastSaveTime) > new Date(lastLoadTime)) { console.log('새로운 카테고리 저장 감지됨, 데이터 다시 로드...'); loadCategories(); } }, 1000); return () => { window.removeEventListener('categoryBudgetsUpdated', () => handleCategoryUpdate()); window.removeEventListener('storage', handleCategoryUpdate); window.removeEventListener('visibilitychange', () => {}); window.removeEventListener('focus', () => loadCategories()); clearInterval(intervalId); }; }, [isInitialized]); // 카테고리 예산 업데이트 함수 const updateCategoryBudgets = useCallback((newCategoryBudgets: Record) => { try { console.log('카테고리 예산 업데이트:', newCategoryBudgets); setCategoryBudgets(newCategoryBudgets); saveCategoryBudgetsToStorage(newCategoryBudgets); // 저장 시간 업데이트 localStorage.setItem('lastCategoryBudgetSaveTime', new Date().toISOString()); } catch (error) { console.error('카테고리 예산 업데이트 중 오류:', error); } }, []); // 카테고리 예산 초기화 함수 const resetCategoryBudgets = useCallback(() => { try { console.log('카테고리 예산 초기화'); clearAllCategoryBudgets(); setCategoryBudgets(loadCategoryBudgetsFromStorage()); } catch (error) { console.error('카테고리 예산 초기화 중 오류:', error); } }, []); // 카테고리 예산 변경 시 로그 기록 useEffect(() => { console.log('최신 카테고리 예산:', categoryBudgets); }, [categoryBudgets]); return { categoryBudgets, setCategoryBudgets: updateCategoryBudgets, updateCategoryBudgets, resetCategoryBudgets }; };