diff --git a/src/components/transaction/TransactionFormFields.tsx b/src/components/transaction/TransactionFormFields.tsx index 34aa855..568428d 100644 --- a/src/components/transaction/TransactionFormFields.tsx +++ b/src/components/transaction/TransactionFormFields.tsx @@ -6,7 +6,7 @@ import { UseFormReturn } from 'react-hook-form'; import { z } from 'zod'; import { categoryIcons, EXPENSE_CATEGORIES } from '@/constants/categoryIcons'; -// Form schema for validation - 카테고리를 3개로 축소 +// Form schema for validation - 카테고리를 3개로 제한 export const transactionFormSchema = z.object({ title: z.string().min(1, '제목을 입력해주세요'), amount: z.string().min(1, '금액을 입력해주세요'), diff --git a/src/constants/categoryIcons.tsx b/src/constants/categoryIcons.tsx index 9b4271b..c361090 100644 --- a/src/constants/categoryIcons.tsx +++ b/src/constants/categoryIcons.tsx @@ -10,7 +10,7 @@ export const categoryIcons: Record = { 수입: , }; -// 지출 카테고리 목록 - 다시 3개로 축소 +// 지출 카테고리 목록 - 3개로 제한 export const EXPENSE_CATEGORIES = ['식비', '생활비', '교통비']; // 기본 카테고리 예산 설정 diff --git a/src/contexts/budget/budgetUtils.ts b/src/contexts/budget/budgetUtils.ts index f810125..69fa799 100644 --- a/src/contexts/budget/budgetUtils.ts +++ b/src/contexts/budget/budgetUtils.ts @@ -21,7 +21,10 @@ export const calculateCategorySpending = ( // 모든 카테고리에 대해 초기값 0 설정 Object.keys(categoryBudgets).forEach(category => { - categorySpending[category] = 0; + // 3개 카테고리만 유지 + if (EXPENSE_CATEGORIES.includes(category)) { + categorySpending[category] = 0; + } }); expenseTransactions.forEach(t => { @@ -30,10 +33,10 @@ export const calculateCategorySpending = ( } }); - return Object.keys(categoryBudgets).map(category => ({ + return EXPENSE_CATEGORIES.map(category => ({ title: category, current: categorySpending[category] || 0, - total: categoryBudgets[category] + total: categoryBudgets[category] || 0 })); }; diff --git a/src/contexts/budget/storage/categoryStorage.ts b/src/contexts/budget/storage/categoryStorage.ts index cd236c2..79b4f6e 100644 --- a/src/contexts/budget/storage/categoryStorage.ts +++ b/src/contexts/budget/storage/categoryStorage.ts @@ -1,5 +1,5 @@ - import { DEFAULT_CATEGORY_BUDGETS } from '../budgetUtils'; +import { EXPENSE_CATEGORIES } from '@/constants/categoryIcons'; import { toast } from '@/components/ui/use-toast'; /** @@ -12,7 +12,14 @@ export const loadCategoryBudgetsFromStorage = (): Record => { if (storedCategoryBudgets) { const parsed = JSON.parse(storedCategoryBudgets); console.log('카테고리 예산 로드 완료:', parsed); - return parsed; + + // 3개 카테고리만 유지 + const filteredBudgets: Record = {}; + EXPENSE_CATEGORIES.forEach(category => { + filteredBudgets[category] = parsed[category] || 0; + }); + + return filteredBudgets; } // 백업에서 시도 @@ -20,9 +27,16 @@ export const loadCategoryBudgetsFromStorage = (): Record => { if (backupCategoryBudgets) { const parsedBackup = JSON.parse(backupCategoryBudgets); console.log('백업에서 카테고리 예산 복구:', parsedBackup); + + // 3개 카테고리만 유지 + const filteredBudgets: Record = {}; + EXPENSE_CATEGORIES.forEach(category => { + filteredBudgets[category] = parsedBackup[category] || 0; + }); + // 메인 스토리지도 복구 - localStorage.setItem('categoryBudgets', backupCategoryBudgets); - return parsedBackup; + localStorage.setItem('categoryBudgets', JSON.stringify(filteredBudgets)); + return filteredBudgets; } } catch (error) { console.error('카테고리 예산 데이터 파싱 오류:', error); @@ -39,15 +53,21 @@ export const loadCategoryBudgetsFromStorage = (): Record => { */ export const saveCategoryBudgetsToStorage = (categoryBudgets: Record): void => { try { + // 3개 카테고리만 유지하고 나머지는 제거 + const filteredBudgets: Record = {}; + EXPENSE_CATEGORIES.forEach(category => { + filteredBudgets[category] = categoryBudgets[category] || 0; + }); + // 데이터 문자열로 변환 - const dataString = JSON.stringify(categoryBudgets); + const dataString = JSON.stringify(filteredBudgets); // 로컬 스토리지에 저장 localStorage.setItem('categoryBudgets', dataString); // 백업 저장 localStorage.setItem('categoryBudgets_backup', dataString); - console.log('카테고리 예산 저장 완료:', categoryBudgets); + console.log('카테고리 예산 저장 완료:', filteredBudgets); // 스토리지 이벤트 수동 트리거 (동일 창에서도 감지하기 위함) try { @@ -64,7 +84,7 @@ export const saveCategoryBudgetsToStorage = (categoryBudgets: Record sum + val, 0); + const totalBudget = Object.values(filteredBudgets).reduce((sum, val) => sum + val, 0); if (totalBudget > 0) { toast({ title: "카테고리 예산 저장 완료", @@ -91,7 +111,7 @@ export const clearAllCategoryBudgets = (): void => { localStorage.removeItem('categoryBudgets'); localStorage.removeItem('categoryBudgets_backup'); - // 기본값으로 재설정 + // 기본값으로 재설정 (3개 카테고리만) const dataString = JSON.stringify(DEFAULT_CATEGORY_BUDGETS); localStorage.setItem('categoryBudgets', dataString); localStorage.setItem('categoryBudgets_backup', dataString); diff --git a/src/hooks/useTransactions.ts b/src/hooks/useTransactions.ts index 8b345fe..8f028ae 100644 --- a/src/hooks/useTransactions.ts +++ b/src/hooks/useTransactions.ts @@ -20,6 +20,7 @@ import { updateTransactionInSupabase, deleteTransactionFromSupabase } from '@/utils/supabaseTransactionUtils'; +import { EXPENSE_CATEGORIES } from '@/constants/categoryIcons'; // 월 이름 재노출 export { MONTHS_KR }; @@ -52,8 +53,20 @@ export const useTransactions = () => { // 로컬 스토리지에서 트랜잭션 데이터 가져오기 const localData = loadTransactionsFromStorage(); + // 지원되는 카테고리로 필터링 + const filteredData = localData.map(transaction => { + // 트랜잭션의 카테고리가 현재 지원되는 카테고리가 아니면 '기타'로 변경 + if (transaction.type === 'expense' && !EXPENSE_CATEGORIES.includes(transaction.category)) { + return { + ...transaction, + category: '생활비' // 기본값으로 '생활비' 사용 + }; + } + return transaction; + }); + // 로컬 데이터가 있으면 사용 - setTransactions(localData); + setTransactions(filteredData); // 예산 가져오기 const budget = loadBudgetFromStorage();