diff --git a/src/components/TransactionCard.tsx b/src/components/TransactionCard.tsx index 75d6ed3..b4a0fa6 100644 --- a/src/components/TransactionCard.tsx +++ b/src/components/TransactionCard.tsx @@ -1,8 +1,10 @@ import React, { useState } from 'react'; -import { ArrowDownIcon, Coffee, Home, Car } from 'lucide-react'; import { cn } from '@/lib/utils'; import TransactionEditDialog from './TransactionEditDialog'; +import TransactionIcon from './transaction/TransactionIcon'; +import TransactionDetails from './transaction/TransactionDetails'; +import TransactionAmount from './transaction/TransactionAmount'; export type Transaction = { id: string; @@ -13,12 +15,6 @@ export type Transaction = { type: 'expense' | 'income'; }; -const categoryIcons: Record = { - 식비: , - 생활비: , - 교통비: , -}; - interface TransactionCardProps { transaction: Transaction; onUpdate?: (updatedTransaction: Transaction) => void; @@ -31,12 +27,6 @@ const TransactionCard: React.FC = ({ const [isEditDialogOpen, setIsEditDialogOpen] = useState(false); const { title, amount, date, category, type } = transaction; - const formattedAmount = new Intl.NumberFormat('ko-KR', { - style: 'currency', - currency: 'KRW', - maximumFractionDigits: 0 - }).format(amount); - const handleSaveTransaction = (updatedTransaction: Transaction) => { if (onUpdate) { onUpdate(updatedTransaction); @@ -51,22 +41,11 @@ const TransactionCard: React.FC = ({ >
-
- {categoryIcons[category] || } -
- -
-

{title}

-

{date}

-
+ +
-
- - - {formattedAmount} - -
+
diff --git a/src/components/TransactionEditDialog.tsx b/src/components/TransactionEditDialog.tsx index debc7f8..966a89b 100644 --- a/src/components/TransactionEditDialog.tsx +++ b/src/components/TransactionEditDialog.tsx @@ -16,7 +16,8 @@ import { Form } from '@/components/ui/form'; import { toast } from '@/components/ui/use-toast'; import TransactionFormFields, { transactionFormSchema, - formatWithCommas + formatWithCommas, + TransactionFormValues } from './transaction/TransactionFormFields'; import TransactionDeleteAlert from './transaction/TransactionDeleteAlert'; @@ -35,16 +36,16 @@ const TransactionEditDialog: React.FC = ({ onSave, onDelete }) => { - const form = useForm({ + const form = useForm({ resolver: zodResolver(transactionFormSchema), defaultValues: { title: transaction.title, amount: formatWithCommas(transaction.amount.toString()), - category: transaction.category as any, + category: transaction.category as '식비' | '생활비' | '교통비', }, }); - const handleSubmit = (values: any) => { + const handleSubmit = (values: TransactionFormValues) => { // Remove commas from amount string and convert to number const cleanAmount = values.amount.replace(/,/g, ''); diff --git a/src/components/transaction/TransactionAmount.tsx b/src/components/transaction/TransactionAmount.tsx new file mode 100644 index 0000000..916d490 --- /dev/null +++ b/src/components/transaction/TransactionAmount.tsx @@ -0,0 +1,26 @@ + +import React from 'react'; +import { ArrowDownIcon } from 'lucide-react'; + +interface TransactionAmountProps { + amount: number; +} + +const TransactionAmount: React.FC = ({ amount }) => { + const formattedAmount = new Intl.NumberFormat('ko-KR', { + style: 'currency', + currency: 'KRW', + maximumFractionDigits: 0 + }).format(amount); + + return ( +
+ + + {formattedAmount} + +
+ ); +}; + +export default TransactionAmount; diff --git a/src/components/transaction/TransactionDetails.tsx b/src/components/transaction/TransactionDetails.tsx new file mode 100644 index 0000000..8cfe9a4 --- /dev/null +++ b/src/components/transaction/TransactionDetails.tsx @@ -0,0 +1,18 @@ + +import React from 'react'; + +interface TransactionDetailsProps { + title: string; + date: string; +} + +const TransactionDetails: React.FC = ({ title, date }) => { + return ( +
+

{title}

+

{date}

+
+ ); +}; + +export default TransactionDetails; diff --git a/src/components/transaction/TransactionIcon.tsx b/src/components/transaction/TransactionIcon.tsx new file mode 100644 index 0000000..98e73da --- /dev/null +++ b/src/components/transaction/TransactionIcon.tsx @@ -0,0 +1,23 @@ + +import React from 'react'; +import { Coffee, Home, Car } from 'lucide-react'; + +export const categoryIcons: Record = { + 식비: , + 생활비: , + 교통비: , +}; + +interface TransactionIconProps { + category: string; +} + +const TransactionIcon: React.FC = ({ category }) => { + return ( +
+ {categoryIcons[category] || } +
+ ); +}; + +export default TransactionIcon;