diff --git a/src/components/security/DataResetSection.tsx b/src/components/security/DataResetSection.tsx index 263509f..b85eab8 100644 --- a/src/components/security/DataResetSection.tsx +++ b/src/components/security/DataResetSection.tsx @@ -24,8 +24,23 @@ const DataResetSection = () => { // 데이터 초기화 수행 try { console.log('모든 데이터 초기화 시작'); + + // 초기화 실행 전에 사용자 설정 백업 + const dontShowWelcomeValue = localStorage.getItem('dontShowWelcome'); + const hasVisitedBefore = localStorage.getItem('hasVisitedBefore'); + + // 데이터 초기화 resetAllStorageData(); + // 사용자 설정 복원 + if (dontShowWelcomeValue) { + localStorage.setItem('dontShowWelcome', dontShowWelcomeValue); + } + + if (hasVisitedBefore) { + localStorage.setItem('hasVisitedBefore', hasVisitedBefore); + } + // 스토리지 이벤트 트리거하여 다른 컴포넌트에 변경 알림 window.dispatchEvent(new Event('transactionUpdated')); window.dispatchEvent(new Event('budgetDataUpdated')); @@ -79,6 +94,7 @@ const DataResetSection = () => { 정말 모든 데이터를 초기화하시겠습니까? 이 작업은 되돌릴 수 없으며, 모든 예산, 지출 내역, 설정이 영구적으로 삭제됩니다. + 단, '환영합니다' 화면 표시 설정은 유지됩니다. diff --git a/src/contexts/budget/hooks/useBudgetReset.ts b/src/contexts/budget/hooks/useBudgetReset.ts index cc18600..d9a6f91 100644 --- a/src/contexts/budget/hooks/useBudgetReset.ts +++ b/src/contexts/budget/hooks/useBudgetReset.ts @@ -13,11 +13,21 @@ export const useBudgetReset = ( try { console.log('BudgetContext에서 데이터 리셋 시작'); - // 로컬 스토리지 초기화 + // 데이터 초기화 순서 중요 resetTransactions(); resetCategoryBudgets(); resetBudgetDataInternal(); + // 이벤트 발생 + try { + window.dispatchEvent(new Event('transactionUpdated')); + window.dispatchEvent(new Event('budgetDataUpdated')); + window.dispatchEvent(new Event('categoryBudgetsUpdated')); + window.dispatchEvent(new StorageEvent('storage')); + } catch (e) { + console.error('이벤트 발생 오류:', e); + } + console.log('BudgetContext에서 데이터 리셋 완료'); // 토스트 알림 @@ -25,6 +35,8 @@ export const useBudgetReset = ( title: "모든 데이터 초기화", description: "예산과 지출 내역이 모두 초기화되었습니다.", }); + + return true; } catch (error) { console.error('데이터 초기화 중 오류:', error); toast({ @@ -32,6 +44,8 @@ export const useBudgetReset = ( description: "데이터를 초기화하는 중 오류가 발생했습니다.", variant: "destructive" }); + + return false; } }, [resetTransactions, resetCategoryBudgets, resetBudgetDataInternal]); diff --git a/src/contexts/budget/storage/budgetStorage.ts b/src/contexts/budget/storage/budgetStorage.ts index 7fc6a86..044d7ed 100644 --- a/src/contexts/budget/storage/budgetStorage.ts +++ b/src/contexts/budget/storage/budgetStorage.ts @@ -10,31 +10,43 @@ export const loadBudgetDataFromStorage = (): BudgetData => { try { const storedBudgetData = localStorage.getItem('budgetData'); if (storedBudgetData) { - const parsed = JSON.parse(storedBudgetData); - console.log('예산 데이터 로드 완료', parsed); - - // 데이터 유효성 검사 추가 - if (!parsed || !parsed.monthly || !parsed.daily || !parsed.weekly) { - throw new Error('잘못된 형식의 예산 데이터'); + try { + const parsed = JSON.parse(storedBudgetData); + console.log('예산 데이터 로드 완료', parsed); + + // 데이터 유효성 검사 추가 + if (!parsed || !parsed.monthly || !parsed.daily || !parsed.weekly) { + console.warn('불완전한 예산 데이터, 백업에서 복구 시도'); + throw new Error('잘못된 형식의 예산 데이터'); + } + + return parsed; + } catch (error) { + console.error('예산 데이터 파싱 오류:', error); + + // 백업에서 복구 시도 + const backupData = localStorage.getItem('budgetData_backup'); + if (backupData) { + try { + const parsed = JSON.parse(backupData); + console.log('백업에서 예산 데이터 복구 완료', parsed); + + // 백업 데이터 유효성 검사 + if (!parsed || !parsed.monthly || !parsed.daily || !parsed.weekly) { + console.warn('백업 예산 데이터도 불완전함, 새 데이터 생성'); + throw new Error('백업 데이터도 잘못된 형식'); + } + + localStorage.setItem('budgetData', backupData); // 메인 스토리지에 복구 + return parsed; + } catch (backupError) { + console.error('백업 데이터 복구 실패:', backupError); + } + } } - - return parsed; } } catch (error) { - console.error('예산 데이터 파싱 오류:', error); - - // 백업에서 복구 시도 - try { - const backupData = localStorage.getItem('budgetData_backup'); - if (backupData) { - const parsed = JSON.parse(backupData); - console.log('백업에서 예산 데이터 복구 완료', parsed); - localStorage.setItem('budgetData', backupData); // 메인 스토리지에 저장 - return parsed; - } - } catch (backupError) { - console.error('백업 데이터 복구 실패:', backupError); - } + console.error('예산 데이터 로드 중 오류:', error); } // 새 사용자를 위한 기본 예산 데이터 저장 @@ -49,6 +61,12 @@ export const loadBudgetDataFromStorage = (): BudgetData => { */ export const saveBudgetDataToStorage = (budgetData: BudgetData): void => { try { + // 유효성 검사 + if (!budgetData || !budgetData.monthly || !budgetData.daily || !budgetData.weekly) { + console.error('잘못된 예산 데이터 저장 시도:', budgetData); + throw new Error('잘못된 예산 데이터'); + } + // 데이터 문자열로 변환 const dataString = JSON.stringify(budgetData); @@ -60,7 +78,7 @@ export const saveBudgetDataToStorage = (budgetData: BudgetData): void => { localStorage.setItem('budgetData_backup', dataString); localStorage.setItem('lastBudgetSaveTime', new Date().toISOString()); - // 스토리지 이벤트 수동 트리거 (동일 창에서도 감지하기 위함) + // 이벤트 발생 try { window.dispatchEvent(new Event('budgetDataUpdated')); window.dispatchEvent(new StorageEvent('storage', { @@ -70,8 +88,8 @@ export const saveBudgetDataToStorage = (budgetData: BudgetData): void => { } catch (e) { console.error('이벤트 발생 오류:', e); } - - // toast 알림은 즉시 표시 + + // toast 알림 if (budgetData.monthly.targetAmount > 0) { toast({ title: "예산 저장 완료", @@ -106,18 +124,21 @@ export const clearAllBudgetData = (): void => { console.log('예산 데이터가 초기화되었습니다.'); - // 스토리지 이벤트 수동 트리거 + // 이벤트 발생 window.dispatchEvent(new Event('budgetDataUpdated')); window.dispatchEvent(new StorageEvent('storage', { key: 'budgetData', newValue: dataString })); - // 토스트 알림 - toast({ - title: "예산 초기화", - description: "모든, 예산 데이터가 초기화되었습니다.", - }); + // 토스트 알림 (사용자가 직접 초기화한 경우만) + const isUserInitiated = document.visibilityState === 'visible'; + if (isUserInitiated) { + toast({ + title: "예산 초기화", + description: "모든 예산 데이터가 초기화되었습니다.", + }); + } } catch (error) { console.error('예산 데이터 삭제 오류:', error); toast({ diff --git a/src/contexts/budget/storage/resetStorage.ts b/src/contexts/budget/storage/resetStorage.ts index f746302..dcc9fc2 100644 --- a/src/contexts/budget/storage/resetStorage.ts +++ b/src/contexts/budget/storage/resetStorage.ts @@ -12,10 +12,10 @@ import { toast } from '@/components/ui/use-toast'; export const resetAllData = (): void => { console.log('완전 초기화 시작 - resetAllData'); - // dontShowWelcome 설정 값 백업 + // 중요: 사용자 설정 관련 값 백업 const dontShowWelcomeValue = localStorage.getItem('dontShowWelcome'); const hasVisitedBefore = localStorage.getItem('hasVisitedBefore'); - console.log('resetAllData - dontShowWelcome 백업 값:', dontShowWelcomeValue); + console.log('resetAllData - 사용자 설정 백업:', { dontShowWelcome: dontShowWelcomeValue, hasVisitedBefore }); // 모든 관련 데이터 키 목록 (분석 페이지의 데이터 포함) const dataKeys = [ @@ -35,79 +35,68 @@ export const resetAllData = (): void => { 'weeklyBudget', // 주간 예산 'monthlyBudget', // 월간 예산 'chartData', // 차트 데이터 - // 'hasVisitedBefore', // 방문 여부 - 제외 - // 'dontShowWelcome' 키는 삭제 목록에서 제외 ]; - // 모든 관련 데이터 키 삭제 - dataKeys.forEach(key => { - console.log(`삭제 중: ${key}`); - localStorage.removeItem(key); - }); - - // 기본 데이터로 초기화 - clearAllTransactions(); - clearAllCategoryBudgets(); - clearAllBudgetData(); - - // 추가적으로 사용자 기기에 저장된 모든 데이터 검사 (역순으로 루프) - for (let i = localStorage.length - 1; i >= 0; i--) { - const key = localStorage.key(i); - if (key && - key !== 'dontShowWelcome' && - key !== 'hasVisitedBefore' && // hasVisitedBefore 키도 제외 - (key.includes('expense') || - key.includes('budget') || - key.includes('transaction') || - key.includes('analytics') || - key.includes('spending') || - key.includes('financial') || - key.includes('chart') || - key.includes('month') || - key.includes('sync') || - key.includes('total')) - ) { - console.log(`추가 데이터 삭제: ${key}`); - localStorage.removeItem(key); - } - } - - // 강제로 빈 데이터로 초기화 - localStorage.setItem('transactions', JSON.stringify([])); - localStorage.setItem('budget', JSON.stringify({total: 0})); - const initialBudgetData = getInitialBudgetData(); - localStorage.setItem('budgetData', JSON.stringify(initialBudgetData)); - localStorage.setItem('categoryBudgets', JSON.stringify(DEFAULT_CATEGORY_BUDGETS)); - - // 이벤트 발생시켜 데이터 로드 트리거 try { - window.dispatchEvent(new Event('transactionUpdated')); - window.dispatchEvent(new Event('budgetDataUpdated')); - window.dispatchEvent(new Event('categoryBudgetsUpdated')); - window.dispatchEvent(new StorageEvent('storage')); - } catch (e) { - console.error('이벤트 발생 오류:', e); - } - - // dontShowWelcome 값 복원 (백업한 값이 있는 경우) - if (dontShowWelcomeValue) { - console.log('resetAllData - dontShowWelcome 값 복원:', dontShowWelcomeValue); - localStorage.setItem('dontShowWelcome', dontShowWelcomeValue); - } - - // hasVisitedBefore 값 복원 (백업한 값이 있는 경우) - if (hasVisitedBefore) { - console.log('resetAllData - hasVisitedBefore 값 복원:', hasVisitedBefore); - localStorage.setItem('hasVisitedBefore', hasVisitedBefore); - } - - // 초기화 알림은 첫 방문인 경우에는 표시하지 않음 - if (hasVisitedBefore === 'true') { + // 모든 관련 데이터 키 삭제 + dataKeys.forEach(key => { + console.log(`삭제 중: ${key}`); + localStorage.removeItem(key); + }); + + // 파일별 초기화 함수 호출 + clearAllTransactions(); + clearAllCategoryBudgets(); + clearAllBudgetData(); + + // 기본 데이터로 초기화 (중복 삭제 방지를 위해 한 번만 실행) + const initialBudgetData = getInitialBudgetData(); + localStorage.setItem('budgetData', JSON.stringify(initialBudgetData)); + localStorage.setItem('categoryBudgets', JSON.stringify(DEFAULT_CATEGORY_BUDGETS)); + localStorage.setItem('transactions', JSON.stringify([])); + + // 중요: budgetData_backup도 설정하여 복구 가능하게 함 + localStorage.setItem('budgetData_backup', JSON.stringify(initialBudgetData)); + localStorage.setItem('categoryBudgets_backup', JSON.stringify(DEFAULT_CATEGORY_BUDGETS)); + localStorage.setItem('transactions_backup', JSON.stringify([])); + + // 이벤트 발생시켜 데이터 로드 트리거 + try { + window.dispatchEvent(new Event('transactionUpdated')); + window.dispatchEvent(new Event('budgetDataUpdated')); + window.dispatchEvent(new Event('categoryBudgetsUpdated')); + window.dispatchEvent(new StorageEvent('storage')); + } catch (e) { + console.error('이벤트 발생 오류:', e); + } + + // 중요: 사용자 설정 값 복원 (백업한 값이 있는 경우) + if (dontShowWelcomeValue) { + console.log('resetAllData - dontShowWelcome 값 복원:', dontShowWelcomeValue); + localStorage.setItem('dontShowWelcome', dontShowWelcomeValue); + } + + if (hasVisitedBefore) { + console.log('resetAllData - hasVisitedBefore 값 복원:', hasVisitedBefore); + localStorage.setItem('hasVisitedBefore', hasVisitedBefore); + } + + // 첫 방문이 아닌 경우에만 토스트 알림 표시 + if (hasVisitedBefore === 'true') { + toast({ + title: "데이터 초기화 완료", + description: "모든 예산 및 지출 데이터가 초기화되었습니다.", + }); + } + + console.log('모든 데이터가 초기화되었습니다.'); + } catch (error) { + console.error('데이터 초기화 중 오류 발생:', error); + // 오류 발생 시 토스트 알림 toast({ - title: "데이터 초기화 완료", - description: "모든 예산 및 지출 데이터가 초기화되었습니다.", + title: "초기화 실패", + description: "데이터를 초기화하는데 문제가 발생했습니다.", + variant: "destructive" }); } - - console.log('모든 데이터가 초기화되었습니다.'); }; diff --git a/src/hooks/useDataInitialization.ts b/src/hooks/useDataInitialization.ts index 8598f81..66fafbe 100644 --- a/src/hooks/useDataInitialization.ts +++ b/src/hooks/useDataInitialization.ts @@ -8,8 +8,9 @@ export const useDataInitialization = (resetBudgetData?: () => void) => { // 모든 데이터 초기화 함수 const initializeAllData = useCallback(() => { - // 이미 방문한 적이 있으면 초기화하지 않음 - if (localStorage.getItem('hasVisitedBefore') === 'true') { + // 중요: 이미 방문한 적이 있으면 절대 초기화하지 않음 + const hasVisitedBefore = localStorage.getItem('hasVisitedBefore') === 'true'; + if (hasVisitedBefore) { console.log('이미 앱을 방문한 적이 있으므로 데이터를 초기화하지 않습니다.'); setIsInitialized(true); return true; @@ -21,75 +22,90 @@ export const useDataInitialization = (resetBudgetData?: () => void) => { const dontShowWelcomeValue = localStorage.getItem('dontShowWelcome'); console.log('useDataInitialization - 초기화 전 dontShowWelcome 값:', dontShowWelcomeValue); - // 여러번 초기화 실행 - for (let i = 0; i < 3; i++) { - // 모든 데이터 완전히 삭제 및 초기화 + try { + // 모든 데이터 완전히 삭제 및 초기화 (한 번만 실행) resetAllData(); resetAllStorageData(); - // localStorage 직접 초기화 (추가 보호) - clearAllAnalyticsData(); + // 컨텍스트 데이터 리셋 (필요한 경우) + if (resetBudgetData) { + resetBudgetData(); + } + + // 초기화 후 dontShowWelcome 값 확인 + const afterResetValue = localStorage.getItem('dontShowWelcome'); + console.log('useDataInitialization - 초기화 후 dontShowWelcome 값:', afterResetValue); + + // 값이 유지되지 않았다면 복원 + if (dontShowWelcomeValue && afterResetValue !== dontShowWelcomeValue) { + console.log('useDataInitialization - dontShowWelcome 값 복원:', dontShowWelcomeValue); + localStorage.setItem('dontShowWelcome', dontShowWelcomeValue); + } + + console.log('모든 데이터 초기화 완료'); + return true; + } catch (error) { + console.error('데이터 초기화 중 오류 발생:', error); + return false; } - - // 컨텍스트 데이터 리셋 (마지막에 한번 더) - if (resetBudgetData) { - resetBudgetData(); - } - - // 초기화 후 dontShowWelcome 값 확인 - const afterResetValue = localStorage.getItem('dontShowWelcome'); - console.log('useDataInitialization - 초기화 후 dontShowWelcome 값:', afterResetValue); - - // 값이 유지되지 않았다면 복원 - if (dontShowWelcomeValue && afterResetValue !== dontShowWelcomeValue) { - console.log('useDataInitialization - dontShowWelcome 값 복원:', dontShowWelcomeValue); - localStorage.setItem('dontShowWelcome', dontShowWelcomeValue); - } - - console.log('모든 데이터 초기화 완료'); - return true; }, [resetBudgetData]); // 분석 페이지 데이터 초기화 함수 const clearAllAnalyticsData = useCallback(() => { - // 분석 관련 데이터 강제 삭제 - const analyticsKeys = [ - 'analytics', 'monthlyTotals', 'chartData', - 'expenseHistory', 'budgetHistory', 'categorySpending', - 'monthlyData', 'expenseData', 'analyticData' - ]; - - analyticsKeys.forEach(key => { - localStorage.removeItem(key); - }); - - // 모든 localStorage 순회하며 월간, 차트, 분석 관련 키워드 삭제 - for (let i = localStorage.length - 1; i >= 0; i--) { - const key = localStorage.key(i); - if (key && ( - key.includes('month') || - key.includes('chart') || - key.includes('analytics') || - key.includes('expense') || - key.includes('budget') || - key.includes('total') - )) { - console.log(`분석 데이터 삭제: ${key}`); + try { + // 분석 관련 데이터만 선택적으로 삭제 (전체 데이터는 건드리지 않음) + const analyticsKeys = [ + 'analytics', 'monthlyTotals', 'chartData', + 'expenseHistory', 'budgetHistory', 'categorySpending', + 'monthlyData', 'expenseData', 'analyticData' + ]; + + analyticsKeys.forEach(key => { localStorage.removeItem(key); + }); + + // 월간, 차트, 분석 관련 키워드가 포함된 항목만 삭제 + for (let i = localStorage.length - 1; i >= 0; i--) { + const key = localStorage.key(i); + if (key && ( + key.includes('month') || + key.includes('chart') || + key.includes('analytics') || + key.includes('expense') || + key.includes('budget') || + key.includes('total') + ) && + // 핵심 데이터는 건드리지 않도록 제외 + !key.includes('budgetData') && + !key.includes('transactions') && + !key.includes('categoryBudgets')) { + console.log(`분석 데이터 삭제: ${key}`); + localStorage.removeItem(key); + } } + + return true; + } catch (error) { + console.error('분석 데이터 초기화 중 오류:', error); + return false; } - - return true; }, []); // 데이터 초기화 실행 - 첫 방문시에만 useEffect(() => { if (!isInitialized) { - const result = initializeAllData(); - setIsInitialized(result); + // 이미 방문한 적이 있는지 체크 (이미 있다면 초기화하지 않음) + const hasVisitedBefore = localStorage.getItem('hasVisitedBefore') === 'true'; + if (hasVisitedBefore) { + console.log('이미 방문 기록이 있어 초기화를 건너뜁니다.'); + setIsInitialized(true); + } else { + const result = initializeAllData(); + setIsInitialized(result); + } } - // 방문 기록 저장 (첫 방문 이후 항상 true로 설정) + // 첫 방문 여부 체크용 키 설정 (항상 true로 설정) localStorage.setItem('hasVisitedBefore', 'true'); }, [isInitialized, initializeAllData]); diff --git a/src/utils/storageUtils.ts b/src/utils/storageUtils.ts index 7752e82..59a4db7 100644 --- a/src/utils/storageUtils.ts +++ b/src/utils/storageUtils.ts @@ -3,113 +3,152 @@ import { Transaction } from '@/components/TransactionCard'; // 트랜잭션 데이터 불러오기 export const loadTransactionsFromStorage = (): Transaction[] => { - const localData = localStorage.getItem('transactions'); - if (localData) { - return JSON.parse(localData) as Transaction[]; + try { + const localData = localStorage.getItem('transactions'); + if (localData) { + return JSON.parse(localData) as Transaction[]; + } + + // 백업에서 복구 시도 + const backupData = localStorage.getItem('transactions_backup'); + if (backupData) { + console.log('트랜잭션 데이터 백업에서 복구'); + localStorage.setItem('transactions', backupData); // 메인 스토리지 복원 + return JSON.parse(backupData) as Transaction[]; + } + } catch (error) { + console.error('트랜잭션 데이터 로드 중 오류:', error); } - return []; -}; - -// 기본 샘플 데이터 생성 -export const createSampleTransactions = (selectedMonth: string): Transaction[] => { - // 샘플 데이터는 생성하지 않고 빈 배열 반환 (초기 상태에서는 데이터가 없어야 함) + return []; }; // 트랜잭션 데이터 저장하기 export const saveTransactionsToStorage = (transactions: Transaction[]): void => { - localStorage.setItem('transactions', JSON.stringify(transactions)); + try { + const dataString = JSON.stringify(transactions); + localStorage.setItem('transactions', dataString); + + // 백업 저장 (데이터 손실 방지) + localStorage.setItem('transactions_backup', dataString); + + // 이벤트 발생 + window.dispatchEvent(new Event('transactionUpdated')); + } catch (error) { + console.error('트랜잭션 저장 중 오류:', error); + } }; -// 예산 불러오기 +// 예산 불러오기 (이전 버전과의 호환성 유지) export const loadBudgetFromStorage = (): number => { - const budgetData = localStorage.getItem('budget'); - if (budgetData) { - const parsedBudget = JSON.parse(budgetData); - return parsedBudget.total || 0; // 기본값을 0으로 변경 + try { + // 새 구조의 budgetData 확인 + const budgetData = localStorage.getItem('budgetData'); + if (budgetData) { + const parsedBudgetData = JSON.parse(budgetData); + if (parsedBudgetData.monthly && typeof parsedBudgetData.monthly.targetAmount === 'number') { + return parsedBudgetData.monthly.targetAmount; + } + } + + // 기존 구조 확인 + const budget = localStorage.getItem('budget'); + if (budget) { + const parsedBudget = JSON.parse(budget); + return parsedBudget.total || 0; + } + } catch (error) { + console.error('예산 데이터 로드 중 오류:', error); } - return 0; // 기본값 0으로 변경 + + return 0; }; // 모든 데이터 완전히 초기화 export const resetAllStorageData = (): void => { console.log('완전 초기화 시작 - resetAllStorageData'); - // 모든 Storage 키 목록 (명시적으로 더 많은 키 추가) - const keysToRemove = [ - 'transactions', - 'budget', - 'monthlyExpenses', - 'budgetData', - 'categoryBudgets', - 'analyticData', - 'expenseData', - 'chartData', - 'monthlyData', - 'spendingData', - 'categorySpending', - 'monthlyBudget', - 'dailyBudget', - 'weeklyBudget', - 'hasVisitedBefore', - 'dontShowWelcome', - 'monthlyTotals', - 'analytics', - 'expenseHistory', - 'budgetHistory', - 'transactionHistory', - 'lastSync', - 'syncEnabled' - ]; - - // 명시적으로 알려진 키들 삭제 - keysToRemove.forEach(key => { - console.log(`삭제 중: ${key}`); - localStorage.removeItem(key); - }); - - // 명시적으로 트랜잭션 초기화 - localStorage.setItem('transactions', JSON.stringify([])); - - // 모든 예산 관련, 지출 관련 데이터 검색 및 삭제 - const keywordsToFind = [ - 'budget', 'expense', 'transaction', 'analytic', - 'spending', 'chart', 'financial', 'money', - 'category', 'month', 'daily', 'weekly', 'total', - 'sync', 'cache', 'visited', 'welcome', 'target', - 'remain', 'goal', 'analytics', 'data' - ]; - - // 모든 localStorage 순회하며 키워드 포함된 항목 삭제 - for (let i = localStorage.length - 1; i >= 0; i--) { - const key = localStorage.key(i); - if (key) { - const lowerKey = key.toLowerCase(); - if (keywordsToFind.some(keyword => lowerKey.includes(keyword))) { - console.log(`추가 데이터 삭제: ${key}`); - localStorage.removeItem(key); - } + try { + // 중요: 사용자 설정 값 백업 + const dontShowWelcomeValue = localStorage.getItem('dontShowWelcome'); + const hasVisitedBefore = localStorage.getItem('hasVisitedBefore'); + + // 모든 Storage 키 목록 + const keysToRemove = [ + 'transactions', + 'budget', + 'monthlyExpenses', + 'budgetData', + 'categoryBudgets', + 'analyticData', + 'expenseData', + 'chartData', + 'monthlyData', + 'spendingData', + 'categorySpending', + 'monthlyBudget', + 'dailyBudget', + 'weeklyBudget', + 'monthlyTotals', + 'analytics', + 'expenseHistory', + 'budgetHistory', + 'transactionHistory', + 'lastSync', + 'syncEnabled' + ]; + + // 키 삭제 + keysToRemove.forEach(key => { + console.log(`삭제 중: ${key}`); + localStorage.removeItem(key); + }); + + // 백업 키도 삭제 + keysToRemove.forEach(key => { + localStorage.removeItem(`${key}_backup`); + }); + + // 기본값으로 초기화 + 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({ + 식비: 0, + 교통비: 0, + 생활비: 0, + 쇼핑: 0, + 의료: 0, + 여가: 0, + 교육: 0, + 기타: 0 + })); + + // 백업 생성 + localStorage.setItem('transactions_backup', JSON.stringify([])); + localStorage.setItem('budgetData_backup', localStorage.getItem('budgetData') || ''); + localStorage.setItem('categoryBudgets_backup', localStorage.getItem('categoryBudgets') || ''); + + // 사용자 설정 값 복원 + if (dontShowWelcomeValue) { + localStorage.setItem('dontShowWelcome', dontShowWelcomeValue); } + + if (hasVisitedBefore) { + localStorage.setItem('hasVisitedBefore', hasVisitedBefore); + } + + // 이벤트 발생 + window.dispatchEvent(new Event('transactionUpdated')); + window.dispatchEvent(new Event('budgetDataUpdated')); + window.dispatchEvent(new Event('categoryBudgetsUpdated')); + window.dispatchEvent(new StorageEvent('storage')); + + console.log('모든 저장소 데이터가 완전히 초기화되었습니다.'); + } catch (error) { + console.error('데이터 초기화 중 오류:', error); } - - // 강제로 빈 데이터로 초기화 - localStorage.setItem('transactions', JSON.stringify([])); - localStorage.setItem('budget', JSON.stringify({total: 0})); - 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({ - 식비: 0, - 교통비: 0, - 생활비: 0, - 쇼핑: 0, - 의료: 0, - 여가: 0, - 교육: 0, - 기타: 0 - })); - - console.log('모든 저장소 데이터가 완전히 초기화되었습니다.'); };