Files
zellyy-finance/src/hooks/transactions/transactionOperations/updateTransaction.ts
gpt-engineer-app[bot] 71aebf8b5b Format dates for synchronization
Use ISO format for data synchronization and user-friendly format for display.
2025-03-17 23:47:05 +00:00

56 lines
1.8 KiB
TypeScript

import { useCallback } from 'react';
import { Transaction } from '@/components/TransactionCard';
import { useAuth } from '@/contexts/auth/AuthProvider';
import { toast } from '@/hooks/useToast.wrapper';
import { saveTransactionsToStorage } from '../storageUtils';
import { updateTransactionInSupabase } from '../supabaseUtils';
import { TransactionOperationProps } from './types';
import { normalizeDate } from '@/utils/sync/transaction/dateUtils';
/**
* 트랜잭션 업데이트 기능
* 로컬 스토리지와 Supabase에 트랜잭션을 업데이트합니다.
*/
export const useUpdateTransaction = (
transactions: Transaction[],
setTransactions: React.Dispatch<React.SetStateAction<Transaction[]>>
) => {
const { user } = useAuth();
return useCallback((updatedTransaction: Transaction) => {
const updatedTransactions = transactions.map(transaction =>
transaction.id === updatedTransaction.id ? updatedTransaction : transaction
);
// 로컬 스토리지 업데이트
saveTransactionsToStorage(updatedTransactions);
// 상태 업데이트
setTransactions(updatedTransactions);
// Supabase 업데이트 시도 (날짜 형식 변환 추가)
if (user) {
// ISO 형식으로 날짜 변환
const transactionWithIsoDate = {
...updatedTransaction,
dateForSync: normalizeDate(updatedTransaction.date)
};
updateTransactionInSupabase(user, transactionWithIsoDate);
}
// 이벤트 발생
window.dispatchEvent(new Event('transactionUpdated'));
// 약간의 지연을 두고 토스트 표시
setTimeout(() => {
toast({
title: "지출이 수정되었습니다",
description: `${updatedTransaction.title} 항목이 업데이트되었습니다.`,
duration: 3000
});
}, 100);
}, [transactions, setTransactions, user]);
};