import { MutableRefObject } from 'react'; import { Transaction } from '@/components/TransactionCard'; import { saveTransactionsToStorage } from '../../storageUtils'; import { deleteTransactionFromSupabase } from '../../supabaseUtils'; import { toast } from '@/hooks/useToast.wrapper'; /** * 스토리지 및 Supabase 삭제 처리 - 완전히 개선된 버전 */ export const handleDeleteStorage = ( updatedTransactions: Transaction[], id: string, user: any, pendingDeletionRef: MutableRefObject> ): Promise => { return new Promise((resolve) => { // 연속 호출 방지 (이미 완료된 요청일 경우 처리하지 않음) if (!pendingDeletionRef.current.has(id)) { console.warn('삭제 요청이 이미 완료되었습니다. ID:', id); resolve(true); return; } try { // 로컬 스토리지 동기 처리 (즉시 처리) try { saveTransactionsToStorage(updatedTransactions); console.log('로컬 스토리지 저장 완료 (ID: ' + id + ')'); } catch (storageError) { console.error('로컬 스토리지 저장 실패:', storageError); } // Supabase 처리 (비동기) if (user) { // 최대 3초 타임아웃 (UI 블로킹 방지) const timeoutId = setTimeout(() => { console.log('Supabase 삭제 타임아웃 - UI 정상화 처리'); pendingDeletionRef.current.delete(id); resolve(true); }, 3000); // Supabase 호출 시도 try { deleteTransactionFromSupabase(user, id) .then(() => { console.log('Supabase 삭제 완료:', id); clearTimeout(timeoutId); // 타임아웃 제거 pendingDeletionRef.current.delete(id); resolve(true); }) .catch(error => { console.error('Supabase 삭제 오류:', error); clearTimeout(timeoutId); // 타임아웃 제거 pendingDeletionRef.current.delete(id); resolve(true); // UI는 이미 업데이트되어 있으므로 true 반환 }); } catch (e) { console.error('Supabase 작업 시작 실패:', e); clearTimeout(timeoutId); pendingDeletionRef.current.delete(id); resolve(true); } } else { // 로그인하지 않은 경우 바로 완료 처리 pendingDeletionRef.current.delete(id); resolve(true); } } catch (error) { console.error('스토리지 작업 중 일반 오류:', error); pendingDeletionRef.current.delete(id); // 항상 pending 상태 제거 resolve(false); } }); };