56 lines
1.8 KiB
TypeScript
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]);
|
|
};
|