import { supabase } from '@/lib/supabase'; import { isSyncEnabled } from '../syncSettings'; import { toast } from '@/hooks/useToast.wrapper'; /** * 특정 트랜잭션 ID 삭제 처리 - 완전히 재구현된 안정성 개선 버전 * 타임아웃 처리 및 오류 회복력 강화 */ export const deleteTransactionFromServer = async (userId: string, transactionId: string): Promise => { if (!isSyncEnabled()) return; try { console.log(`트랜잭션 삭제 요청: ${transactionId}`); // AbortController를 사용한 타임아웃 처리 (3초) const controller = new AbortController(); const timeoutId = setTimeout(() => { console.warn(`트랜잭션 삭제 타임아웃 (ID: ${transactionId})`); controller.abort(); }, 3000); try { // Supabase 요청에 AbortSignal 추가 const { error } = await supabase .from('transactions') .delete() .eq('transaction_id', transactionId) .eq('user_id', userId) .abortSignal(controller.signal); // 요청 완료 후 타임아웃 해제 clearTimeout(timeoutId); if (error) { console.error('트랜잭션 삭제 실패:', error); throw error; } console.log(`트랜잭션 ${transactionId} 삭제 완료`); } catch (e) { // 타임아웃에 의한 중단인 경우 const error = e as Error & { code?: number }; if (error.name === 'AbortError' || error.code === 20) { console.warn(`트랜잭션 삭제 요청 타임아웃 (ID: ${transactionId})`); return; // 정상적으로 처리된 것으로 간주 } throw error; // 그 외 오류는 상위로 전파 } finally { clearTimeout(timeoutId); // 안전하게 항상 타임아웃 해제 } } catch (error) { console.error('트랜잭션 삭제 중 오류:', error); // 시각적 알림은 최소화 (사용자 경험 저하 방지) // 개발 모드나 로그에만 오류 기록 if (process.env.NODE_ENV === 'development') { toast({ title: "동기화 문제", description: "서버에서 삭제 중 문제가 발생했습니다. 로컬 데이터는 정상 처리되었습니다.", variant: "default", duration: 1500 }); } // UI 작업에는 영향을 주지 않도록 오류 무시 console.log('서버 동기화 오류 발생했으나 UI 작업은 계속 진행됨'); } };