import { useCallback, MutableRefObject } from 'react'; import { Transaction } from '@/components/TransactionCard'; import { toast } from '@/hooks/useToast.wrapper'; import { handleDeleteStorage } from './deleteTransactionStorage'; /** * 트랜잭션 삭제 핵심 기능 - 심각한 버그 수정 */ export const useDeleteTransactionCore = ( transactions: Transaction[], setTransactions: React.Dispatch>, user: any, pendingDeletionRef: MutableRefObject> ) => { // 트랜잭션 삭제 - 안정성 개선 버전 return useCallback(async (id: string): Promise => { return new Promise(async (resolve) => { try { console.log('트랜잭션 삭제 작업 시작 - ID:', id); // 이미 삭제 중인지 확인 if (pendingDeletionRef.current.has(id)) { console.warn('이미 삭제 중인 트랜잭션:', id); // 이미 진행 중이면 true 반환하고 종료 resolve(true); return; } // pendingDeletion에 추가 pendingDeletionRef.current.add(id); // 전달된 ID로 트랜잭션 찾기 const transactionToDelete = transactions.find(t => t.id === id); // 트랜잭션이 존재하는지 확인 if (!transactionToDelete) { console.warn('삭제할 트랜잭션이 없음:', id); // 토스트 메시지 toast({ title: "삭제 실패", description: "해당 항목을 찾을 수 없습니다.", variant: "destructive", duration: 1500 }); // 삭제 중 표시 제거 pendingDeletionRef.current.delete(id); resolve(false); return; } // 1. UI 업데이트 단계 (트랜잭션 목록에서 제거) try { const updatedTransactions = transactions.filter(t => t.id !== id); setTransactions(updatedTransactions); // 삭제 성공 토스트 toast({ title: "삭제 완료", description: "지출 항목이 삭제되었습니다.", duration: 1500 }); // 2. 스토리지 업데이트 단계 try { // 스토리지 처리 (Promise 반환) const storageResult = await handleDeleteStorage( updatedTransactions, id, user, pendingDeletionRef ); // 이벤트 발생 window.dispatchEvent(new Event('transactionDeleted')); console.log('삭제 작업 완료:', id); resolve(true); } catch (storageError) { console.error('스토리지 작업 오류:', storageError); // 스토리지 오류가 있어도 UI는 이미 업데이트됨 if (pendingDeletionRef.current.has(id)) { pendingDeletionRef.current.delete(id); } resolve(true); } } catch (uiError) { console.error('UI 업데이트 단계 오류:', uiError); // 삭제 중 표시 제거 if (pendingDeletionRef.current.has(id)) { pendingDeletionRef.current.delete(id); } toast({ title: "삭제 실패", description: "지출 항목을 삭제하는 중 오류가 발생했습니다.", variant: "destructive", duration: 1500 }); resolve(false); } } catch (error) { console.error('트랜잭션 삭제 전체 오류:', error); // 삭제 중 표시 제거 if (pendingDeletionRef.current.has(id)) { pendingDeletionRef.current.delete(id); } toast({ title: "삭제 실패", description: "지출 삭제 중 오류가 발생했습니다.", duration: 1500, variant: "destructive" }); resolve(false); } }); }, [transactions, setTransactions, user, pendingDeletionRef]); };