import { useState } from 'react'; import { useNavigate } from 'react-router-dom'; import { useToast } from '@/hooks/useToast.wrapper'; import { resetAllStorageData } from '@/utils/storageUtils'; import { clearCloudData } from '@/utils/sync/clearCloudData'; import { useAuth } from '@/contexts/auth'; import { isSyncEnabled, setSyncEnabled } from '@/utils/sync/syncSettings'; export interface DataResetResult { isCloudResetSuccess: boolean | null; } export const useDataReset = () => { const [isResetting, setIsResetting] = useState(false); const [isCloudResetSuccess, setIsCloudResetSuccess] = useState(null); const { toast } = useToast(); const navigate = useNavigate(); const { user } = useAuth(); const resetAllData = async (): Promise => { try { setIsResetting(true); console.log('모든 데이터 초기화 시작'); // 현재 동기화 설정 저장 const syncWasEnabled = isSyncEnabled(); console.log('데이터 초기화 전 동기화 상태:', syncWasEnabled ? '활성화' : '비활성화'); // 중요: 클라우드 데이터 초기화 먼저 시도 (로그인 상태인 경우) let cloudResetSuccess = false; if (user) { console.log('로그인 상태: 클라우드 데이터 초기화 시도'); // 여러 번 시도하여 클라우드 데이터 초기화 확실히 하기 for (let attempt = 1; attempt <= 3; attempt++) { console.log(`클라우드 데이터 초기화 시도 ${attempt}/3`); cloudResetSuccess = await clearCloudData(user.id); if (cloudResetSuccess) { console.log('클라우드 데이터 초기화 성공'); break; } else { console.warn(`클라우드 데이터 초기화 시도 ${attempt} 실패`); // 잠시 대기 후 재시도 if (attempt < 3) { await new Promise(resolve => setTimeout(resolve, 500)); } } } setIsCloudResetSuccess(cloudResetSuccess); } else { console.log('로그인하지 않음: 클라우드 초기화 건너뜀'); setIsCloudResetSuccess(null); } // 초기화 실행 전에 사용자 설정 백업 const dontShowWelcomeValue = localStorage.getItem('dontShowWelcome'); const hasVisitedBefore = localStorage.getItem('hasVisitedBefore'); // 로그인 관련 설정 백업 (supabase 관련 모든 설정) const authBackupItems: Record = {}; // 로그인 관련 항목 수집 for (let i = 0; i < localStorage.length; i++) { const key = localStorage.key(i); if (key && ( key.includes('supabase') || key.includes('auth') || key.includes('sb-') || key.includes('token') || key.includes('user') || key.includes('session') )) { authBackupItems[key] = localStorage.getItem(key); console.log(`백업 항목: ${key}`); } } // 데이터 초기화 (개선된 메소드 사용) resetAllStorageData(); // 추가 초기화를 위해 빈 데이터 명시적 설정 localStorage.setItem('transactions', JSON.stringify([])); localStorage.setItem('budgetData', JSON.stringify({ daily: {targetAmount: 0, spentAmount: 0, remainingAmount: 0}, weekly: {targetAmount: 0, spentAmount: 0, remainingAmount: 0}, monthly: {targetAmount: 0, spentAmount: 0, remainingAmount: 0} })); localStorage.setItem('categoryBudgets', JSON.stringify({})); // 사용자 설정 복원 if (dontShowWelcomeValue) { localStorage.setItem('dontShowWelcome', dontShowWelcomeValue); } if (hasVisitedBefore) { localStorage.setItem('hasVisitedBefore', hasVisitedBefore); } // 로그인 관련 설정 복원 (로그인 화면이 나타나지 않도록) Object.entries(authBackupItems).forEach(([key, value]) => { if (value) { localStorage.setItem(key, value); console.log(`복원 항목: ${key}`); } }); // 중요: 동기화 설정은 초기화 후 강제로 비활성화 setSyncEnabled(false); console.log('동기화 설정이 비활성화되었습니다.'); // 마지막 동기화 시간은 초기화 localStorage.removeItem('lastSync'); // 삭제 플래그 초기화 (강제로 삭제 목록 초기화) localStorage.removeItem('deletedTransactions'); localStorage.removeItem('modifiedBudgets'); // 스토리지 이벤트 트리거하여 다른 컴포넌트에 변경 알림 window.dispatchEvent(new Event('transactionUpdated')); window.dispatchEvent(new Event('budgetDataUpdated')); window.dispatchEvent(new Event('categoryBudgetsUpdated')); window.dispatchEvent(new StorageEvent('storage')); window.dispatchEvent(new Event('auth-state-changed')); // 동기화 상태 변경 이벤트 추가 // 클라우드 초기화 상태에 따라 다른 메시지 표시 if (user) { if (cloudResetSuccess) { toast({ title: "모든 데이터가 초기화되었습니다.", description: "로컬 및 클라우드의 모든 데이터가 초기화되었으며, 동기화 설정이 비활성화되었습니다.", }); } else { toast({ title: "로컬 데이터만 초기화됨", description: "로컬 데이터는 초기화되었지만, 클라우드 데이터 초기화 중 문제가 발생했습니다. 동기화 설정이 비활성화되었습니다.", variant: "destructive" }); } } else { toast({ title: "모든 데이터가 초기화되었습니다.", description: "모든 예산, 지출 내역, 설정이 초기화되었습니다.", }); } console.log('모든 데이터 초기화 완료'); // 페이지 리프레시를 위해 잠시 후에 새로고침 setTimeout(() => { window.location.reload(); }, 500); return { isCloudResetSuccess: cloudResetSuccess }; } catch (error) { console.error('데이터 초기화 실패:', error); toast({ title: "데이터 초기화 실패", description: "데이터를 초기화하는 중 문제가 발생했습니다.", variant: "destructive", }); return { isCloudResetSuccess: false }; } finally { setIsResetting(false); } }; return { isResetting, isCloudResetSuccess, resetAllData }; };