fix: expose tender detail loading errors and retry

This commit is contained in:
2026-09-06 09:23:13 +03:00
parent a34b758430
commit e07be66e7f
5 changed files with 73 additions and 15 deletions
+21 -6
View File
@@ -12,12 +12,27 @@ export async function fetchLiveTenders({ refresh = false } = {}) {
return data;
}
export async function fetchTenderDetail(tenderId) {
const res = await fetch(`/api/tenders/${tenderId}/detail`);
if (!res.ok) throw new Error(`Detay API hatası: HTTP ${res.status}`);
const data = await res.json();
if (!data.success) throw new Error(data.error || 'Detay alınamadı');
return data;
export async function fetchTenderDetail(tenderId, {signal, timeoutMs = 30000} = {}) {
const controller = new AbortController();
const cancel = () => controller.abort();
if (signal?.aborted) cancel();
else signal?.addEventListener('abort',cancel,{once:true});
let timedOut = false;
const timer = setTimeout(()=>{timedOut=true;controller.abort();},timeoutMs);
try {
const res = await fetch(`/api/tenders/${encodeURIComponent(tenderId)}/detail`, {signal:controller.signal});
if (!res.ok) throw new Error(`Detay API hatası: HTTP ${res.status}`);
const data = await res.json();
if (!data.success) throw new Error(data.error || 'Detay alınamadı');
if (typeof data.aciklama !== 'string' || !data.aciklama.trim())
throw new Error('Kaynak ilan metni alınamadı. Yeniden deneyin veya asıl ilanı kontrol edin.');
return data;
} catch (error) {
if (timedOut) throw new Error('İlan metni yüklenirken zaman aşımı oluştu. Yeniden deneyin.');
throw error;
} finally {
clearTimeout(timer); signal?.removeEventListener('abort',cancel);
}
}
// Kullanıcının ihale üzerindeki durumunu (kanban, takip vb.) canlı veriyle birleştirir.