diff --git a/src/components/AddTransactionButton.tsx b/src/components/AddTransactionButton.tsx index 73d3ad7..7cae1f3 100644 --- a/src/components/AddTransactionButton.tsx +++ b/src/components/AddTransactionButton.tsx @@ -1,45 +1,15 @@ + import React, { useState, useEffect } from 'react'; -import { PlusIcon, X, Coffee, Home, Car } from 'lucide-react'; -import { cn } from '@/lib/utils'; -import { useNavigate } from 'react-router-dom'; +import { PlusIcon } from 'lucide-react'; import { Dialog, DialogContent, DialogHeader, DialogTitle } from './ui/dialog'; -import { Form, FormField, FormItem, FormLabel, FormControl } from './ui/form'; -import { Input } from './ui/input'; -import { Button } from './ui/button'; -import { useForm } from 'react-hook-form'; -import { ToggleGroup, ToggleGroupItem } from './ui/toggle-group'; import { toast } from '@/components/ui/use-toast'; import { supabase } from '@/lib/supabase'; import { isSyncEnabled } from '@/utils/syncUtils'; - -interface ExpenseFormValues { - title: string; - amount: string; - category: string; -} - -// Define expense categories -const EXPENSE_CATEGORIES = ['식비', '생활비', '교통비']; - -// Define category icons mapping -const categoryIcons: Record = { - 식비: , - 생활비: , - 교통비: , -}; +import ExpenseForm, { ExpenseFormValues } from './expenses/ExpenseForm'; const AddTransactionButton = () => { const [showExpenseDialog, setShowExpenseDialog] = useState(false); const [userId, setUserId] = useState(null); - const navigate = useNavigate(); - - const form = useForm({ - defaultValues: { - title: '', - amount: '', - category: '식비', - } - }); useEffect(() => { // 현재 로그인한 사용자 가져오기 @@ -57,11 +27,6 @@ const AddTransactionButton = () => { const numericValue = value.replace(/[^0-9]/g, ''); return numericValue.replace(/\B(?=(\d{3})+(?!\d))/g, ','); }; - - const handleAmountChange = (e: React.ChangeEvent) => { - const formattedValue = formatWithCommas(e.target.value); - form.setValue('amount', formattedValue); - }; const onSubmit = async (data: ExpenseFormValues) => { // Remove commas before processing the amount @@ -108,8 +73,7 @@ const AddTransactionButton = () => { } } - // 폼을 초기화하고 다이얼로그를 닫습니다 - form.reset(); + // 다이얼로그를 닫습니다 setShowExpenseDialog(false); // 사용자에게 알림을 표시합니다 @@ -136,89 +100,10 @@ const AddTransactionButton = () => { 지출 추가 - -
- - ( - - 제목 - - - - - )} - /> - - ( - - 금액 - - - - - )} - /> - - ( - - 카테고리 - - { - if (value) field.onChange(value); - }} - > - {EXPENSE_CATEGORIES.map((category) => ( - -
- {categoryIcons[category]} -
- {category} -
- ))} -
-
-
- )} - /> - -
- - -
- - + setShowExpenseDialog(false)} + /> diff --git a/src/components/expenses/ExpenseCategorySelector.tsx b/src/components/expenses/ExpenseCategorySelector.tsx new file mode 100644 index 0000000..e8fc621 --- /dev/null +++ b/src/components/expenses/ExpenseCategorySelector.tsx @@ -0,0 +1,53 @@ + +import React from 'react'; +import { Coffee, Home, Car } from 'lucide-react'; +import { ToggleGroup, ToggleGroupItem } from '@/components/ui/toggle-group'; +import { FormControl } from '@/components/ui/form'; + +// Define expense categories +export const EXPENSE_CATEGORIES = ['식비', '생활비', '교통비']; + +// Define category icons mapping +export const categoryIcons: Record = { + 식비: , + 생활비: , + 교통비: , +}; + +interface ExpenseCategorySelectorProps { + value: string; + onValueChange: (value: string) => void; +} + +const ExpenseCategorySelector: React.FC = ({ + value, + onValueChange +}) => { + return ( + + { + if (value) onValueChange(value); + }} + > + {EXPENSE_CATEGORIES.map((category) => ( + +
+ {categoryIcons[category]} +
+ {category} +
+ ))} +
+
+ ); +}; + +export default ExpenseCategorySelector; diff --git a/src/components/expenses/ExpenseForm.tsx b/src/components/expenses/ExpenseForm.tsx new file mode 100644 index 0000000..e7cecea --- /dev/null +++ b/src/components/expenses/ExpenseForm.tsx @@ -0,0 +1,104 @@ + +import React from 'react'; +import { useForm } from 'react-hook-form'; +import { Form, FormField, FormItem, FormLabel } from '@/components/ui/form'; +import { Input } from '@/components/ui/input'; +import { Button } from '@/components/ui/button'; +import ExpenseCategorySelector from './ExpenseCategorySelector'; + +export interface ExpenseFormValues { + title: string; + amount: string; + category: string; +} + +interface ExpenseFormProps { + onSubmit: (data: ExpenseFormValues) => void; + onCancel: () => void; +} + +const ExpenseForm: React.FC = ({ onSubmit, onCancel }) => { + const form = useForm({ + defaultValues: { + title: '', + amount: '', + category: '식비', + } + }); + + // Format number with commas + const formatWithCommas = (value: string): string => { + // Remove commas first to avoid duplicates when typing + const numericValue = value.replace(/[^0-9]/g, ''); + return numericValue.replace(/\B(?=(\d{3})+(?!\d))/g, ','); + }; + + const handleAmountChange = (e: React.ChangeEvent) => { + const formattedValue = formatWithCommas(e.target.value); + form.setValue('amount', formattedValue); + }; + + return ( +
+ + ( + + 제목 + + + )} + /> + + ( + + 금액 + + + )} + /> + + ( + + 카테고리 + field.onChange(value)} + /> + + )} + /> + +
+ + +
+ + + ); +}; + +export default ExpenseForm;