import { useCallback, useRef, useEffect } from 'react'; import { Transaction } from '@/components/TransactionCard'; import { useAuth } from '@/contexts/auth/AuthProvider'; import { useDeleteTransactionCore } from './transactionOperations/deleteTransactionCore'; import { toast } from '@/hooks/useToast.wrapper'; /** * 트랜잭션 삭제 기능 - 완전히 새롭게 작성된 최적화 버전 */ export const useDeleteTransaction = ( transactions: Transaction[], setTransactions: React.Dispatch> ) => { // 삭제 중인 트랜잭션 추적 const pendingDeletionRef = useRef>(new Set()); const { user } = useAuth(); // 삭제 요청 타임스탬프 (중복 방지) const lastDeleteTimeRef = useRef>({}); // 삭제 핵심 함수 const deleteTransactionCore = useDeleteTransactionCore( transactions, setTransactions, user, pendingDeletionRef ); // 삭제 함수 (안정성 최적화) const deleteTransaction = useCallback((id: string): Promise => { return new Promise((resolve) => { try { const now = Date.now(); // 중복 요청 방지 (100ms 내 동일 ID) if (lastDeleteTimeRef.current[id] && (now - lastDeleteTimeRef.current[id] < 100)) { console.warn('중복 삭제 요청 무시:', id); resolve(true); return; } // 타임스탬프 업데이트 lastDeleteTimeRef.current[id] = now; // 이미 삭제 중인지 확인 if (pendingDeletionRef.current.has(id)) { console.warn('이미 삭제 중인 트랜잭션:', id); resolve(true); return; } // 안전장치: 최대 1초 타임아웃 const timeoutId = setTimeout(() => { console.warn('삭제 전체 타임아웃 - 강제 종료'); // pending 상태 정리 pendingDeletionRef.current.delete(id); // 타임아웃 처리 resolve(true); }, 1000); // 실제 삭제 실행 deleteTransactionCore(id) .then(result => { clearTimeout(timeoutId); resolve(result); }) .catch(error => { console.error('삭제 작업 실패:', error); clearTimeout(timeoutId); resolve(true); // UI 응답성 유지 }); } catch (error) { console.error('삭제 함수 오류:', error); // 항상 pending 상태 제거 if (pendingDeletionRef.current.has(id)) { pendingDeletionRef.current.delete(id); } // 오류 알림 toast({ title: "오류 발생", description: "처리 중 문제가 발생했습니다.", variant: "destructive", duration: 1500 }); resolve(false); } }); }, [deleteTransactionCore]); // 컴포넌트 언마운트 시 모든 상태 정리 useEffect(() => { return () => { pendingDeletionRef.current.clear(); console.log('삭제 상태 정리 완료'); }; }, []); return deleteTransaction; };