- AddTransactionButton.tsx: useEffect import 제거 - BudgetProgressCard.tsx: localBudgetData를 _localBudgetData로 변경 - Header.tsx: isMobile을 _isMobile로 변경 - RecentTransactionsSection.tsx: isDeleting을 _isDeleting로 변경 - TransactionCard.tsx: cn import 제거 - ExpenseForm.tsx: useState import 제거 - cacheStrategies.ts: QueryClient, Transaction import 제거 - Analytics.tsx: Separator import 제거, 미사용 변수들에 underscore prefix 추가 - Index.tsx: useMemo import 제거 - Login.tsx: setLoginError를 _setLoginError로 변경 - Register.tsx: useEffect dependency 수정 및 useCallback 추가 - Settings.tsx: toast, handleClick에 underscore prefix 추가 - authStore.ts: setError, setAppwriteInitialized에 underscore prefix 추가 - budgetStore.ts: ranges를 _ranges로 변경 - BudgetProgressCard.test.tsx: waitFor import 제거 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
84 lines
2.6 KiB
TypeScript
84 lines
2.6 KiB
TypeScript
import React from "react";
|
|
import { Transaction } from "@/contexts/budget/types";
|
|
import TransactionEditDialog from "./TransactionEditDialog";
|
|
import { ChevronRight } from "lucide-react";
|
|
import { useBudget } from "@/stores";
|
|
import { Link } from "react-router-dom";
|
|
import { useRecentTransactions } from "@/hooks/transactions/useRecentTransactions";
|
|
import { useRecentTransactionsDialog } from "@/hooks/transactions/useRecentTransactionsDialog";
|
|
import RecentTransactionItem from "./recent-transactions/RecentTransactionItem";
|
|
|
|
interface RecentTransactionsSectionProps {
|
|
transactions: Transaction[];
|
|
onUpdateTransaction?: (transaction: Transaction) => void;
|
|
}
|
|
|
|
const RecentTransactionsSection: React.FC<RecentTransactionsSectionProps> = ({
|
|
transactions,
|
|
onUpdateTransaction,
|
|
}) => {
|
|
const { updateTransaction, deleteTransaction } = useBudget();
|
|
|
|
// 트랜잭션 삭제 관련 로직은 커스텀 훅으로 분리
|
|
const { handleDeleteTransaction, isDeleting: _isDeleting } =
|
|
useRecentTransactions(deleteTransaction);
|
|
|
|
// 다이얼로그 관련 로직 분리
|
|
const {
|
|
selectedTransaction,
|
|
isDialogOpen,
|
|
handleTransactionClick,
|
|
setIsDialogOpen,
|
|
} = useRecentTransactionsDialog();
|
|
|
|
const handleUpdateTransaction = (updatedTransaction: Transaction) => {
|
|
if (onUpdateTransaction) {
|
|
onUpdateTransaction(updatedTransaction);
|
|
}
|
|
// 직접 컨텍스트를 통해 업데이트
|
|
updateTransaction(updatedTransaction);
|
|
};
|
|
|
|
return (
|
|
<div className="mt-4 mb-[50px]">
|
|
<div className="flex justify-between items-center mb-2">
|
|
<h2 className="text-lg font-semibold">최근 지출</h2>
|
|
<Link
|
|
to="/transactions"
|
|
className="text-sm text-neuro-income flex items-center"
|
|
>
|
|
더보기 <ChevronRight size={16} />
|
|
</Link>
|
|
</div>
|
|
|
|
<div className="neuro-card divide-y divide-gray-100 w-full">
|
|
{transactions.length > 0 ? (
|
|
transactions.map((transaction) => (
|
|
<RecentTransactionItem
|
|
key={transaction.id}
|
|
transaction={transaction}
|
|
onClick={() => handleTransactionClick(transaction)}
|
|
/>
|
|
))
|
|
) : (
|
|
<div className="py-3 text-center text-gray-500">
|
|
지출 내역이 없습니다
|
|
</div>
|
|
)}
|
|
</div>
|
|
|
|
{selectedTransaction && (
|
|
<TransactionEditDialog
|
|
transaction={selectedTransaction}
|
|
open={isDialogOpen}
|
|
onOpenChange={setIsDialogOpen}
|
|
onSave={handleUpdateTransaction}
|
|
onDelete={handleDeleteTransaction}
|
|
/>
|
|
)}
|
|
</div>
|
|
);
|
|
};
|
|
|
|
export default RecentTransactionsSection;
|