Files
zellyy-finance/src/hooks/useDataReset.ts
gpt-engineer-app[bot] 03e9671ec6 Fix: Data reset not clearing transactions
Ensures that the data reset function correctly clears all transaction data from local storage.
2025-04-05 05:48:21 +00:00

176 lines
6.6 KiB
TypeScript

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<boolean | null>(null);
const { toast } = useToast();
const navigate = useNavigate();
const { user } = useAuth();
const resetAllData = async (): Promise<DataResetResult> => {
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<string, string | null> = {};
// 로그인 관련 항목 수집
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
};
};