From 8cf2e70050774c8aa6546c8cd78781a633b5cf09 Mon Sep 17 00:00:00 2001 From: "gpt-engineer-app[bot]" <159125892+gpt-engineer-app[bot]@users.noreply.github.com> Date: Sun, 23 Mar 2025 10:09:50 +0000 Subject: [PATCH] Fix: Handle undefined budget data The `useBudgetTabContent` hook was throwing an error when `data` prop was undefined. This commit adds a check to ensure that `data` is defined before accessing its properties. --- src/components/BudgetTabContent.tsx | 8 +++++- src/components/RecentTransactionsSection.tsx | 3 +- src/hooks/budget/useBudgetTabContent.ts | 11 +++++--- src/pages/Index.tsx | 29 ++++++++++++++++---- 4 files changed, 40 insertions(+), 11 deletions(-) diff --git a/src/components/BudgetTabContent.tsx b/src/components/BudgetTabContent.tsx index e3b76f0..8dd6931 100644 --- a/src/components/BudgetTabContent.tsx +++ b/src/components/BudgetTabContent.tsx @@ -13,7 +13,7 @@ interface BudgetData { remainingAmount: number; } -interface BudgetTabContentProps { +export interface BudgetTabContentProps { data: BudgetData; formatCurrency: (amount: number) => string; calculatePercentage: (spent: number, target: number) => number; @@ -26,6 +26,12 @@ const BudgetTabContent: React.FC = ({ calculatePercentage, onSaveBudget }) => { + // 데이터 유효성 체크 - 데이터가 없으면 기본값 사용 + if (!data) { + console.warn('BudgetTabContent: data prop이 제공되지 않았습니다. 기본값을 사용합니다.'); + data = { targetAmount: 0, spentAmount: 0, remainingAmount: 0 }; + } + const { categoryBudgets, showBudgetInput, diff --git a/src/components/RecentTransactionsSection.tsx b/src/components/RecentTransactionsSection.tsx index 8366610..c37fa18 100644 --- a/src/components/RecentTransactionsSection.tsx +++ b/src/components/RecentTransactionsSection.tsx @@ -1,3 +1,4 @@ + import React from 'react'; import { Transaction } from '@/contexts/budget/types'; import TransactionEditDialog from './TransactionEditDialog'; @@ -8,7 +9,7 @@ import { useRecentTransactions } from '@/hooks/transactions/useRecentTransaction import { useRecentTransactionsDialog } from '@/hooks/transactions/useRecentTransactionsDialog'; import RecentTransactionItem from './recent-transactions/RecentTransactionItem'; -interface RecentTransactionsSectionProps { +export interface RecentTransactionsSectionProps { transactions: Transaction[]; onUpdateTransaction?: (transaction: Transaction) => void; } diff --git a/src/hooks/budget/useBudgetTabContent.ts b/src/hooks/budget/useBudgetTabContent.ts index 04580cd..6fd20d7 100644 --- a/src/hooks/budget/useBudgetTabContent.ts +++ b/src/hooks/budget/useBudgetTabContent.ts @@ -37,15 +37,18 @@ export const useBudgetTabContent = ({ calculatePercentage, onSaveBudget }: UseBudgetTabContentProps): UseBudgetTabContentReturn => { + // 데이터가 undefined인 경우를 방지하기 위한 기본값 설정 + const safeData = data || { targetAmount: 0, spentAmount: 0, remainingAmount: 0 }; + const [categoryBudgets, setCategoryBudgets] = useState>({}); const [showBudgetInput, setShowBudgetInput] = useState(false); - const spentAmount = data.spentAmount; - const targetAmount = data.targetAmount; + const spentAmount = safeData.spentAmount; + const targetAmount = safeData.targetAmount; // 로그 추가 - 받은 데이터 확인 useEffect(() => { - console.log(`BudgetTabContent 수신 데이터:`, data); - }, [data]); + console.log(`BudgetTabContent 수신 데이터:`, safeData); + }, [safeData]); // 전역 예산 데이터가 변경되었을 때 로컬 상태 갱신 useEffect(() => { diff --git a/src/pages/Index.tsx b/src/pages/Index.tsx index c149b57..f652db0 100644 --- a/src/pages/Index.tsx +++ b/src/pages/Index.tsx @@ -7,17 +7,24 @@ import RecentTransactionsSection from '@/components/RecentTransactionsSection'; import Header from '@/components/Header'; import { useBudget } from '@/contexts/budget'; import SafeAreaContainer from '@/components/SafeAreaContainer'; +import { formatCurrency } from '@/utils/formatters'; const Index = () => { - const { transactions, budgetData } = useBudget(); + const { transactions, budgetData, handleBudgetGoalUpdate } = useBudget(); - // 페이지 마운트 시 데이터 로깅 (디버깅 용도) + // 데이터 구조 확인용 로깅 useEffect(() => { console.info('Index 페이지 마운트, 현재 데이터 상태:'); - console.info('트랜잭션:', transactions.length); + console.info('트랜잭션 수:', transactions?.length); console.info('예산 데이터:', budgetData); }, [transactions, budgetData]); + // 예산 퍼센트 계산 함수 + const calculatePercentage = (spent: number, target: number) => { + if (target <= 0) return 0; + return Math.min(100, Math.round((spent / target) * 100)); + }; + return (
@@ -30,11 +37,23 @@ const Index = () => { - + {budgetData && budgetData.monthly && ( + + handleBudgetGoalUpdate('monthly', amount, categoryBudgets) + } + /> + )} - + console.log('트랜잭션 업데이트', transaction)} + />