import React, { useState, useEffect } from 'react'; import { Globe2, Loader2, ExternalLink, Building2, Calendar, Trophy, AlertTriangle, RefreshCw } from 'lucide-react'; const MODLAR = [ { id: 'acik', label: 'Açık AB İhaleleri', aciklama: 'Türkiye’deki idarelerin AB’de yayımladığı, hâlen teklif verilebilir ihaleler.' }, { id: 'turkiye', label: 'Tüm Türkiye Kayıtları', aciklama: 'TR idareler + TR kazananlar + TR teklif verenler.' }, { id: 'kazanan', label: 'AB’de Kazanan TR Firmaları', aciklama: 'Türk firmalarının AB ihalelerinde kazandığı sözleşmeler.' }, ]; const ULKE_TR = { TUR: 'Türkiye', DEU: 'Almanya', FRA: 'Fransa', ITA: 'İtalya', ESP: 'İspanya', NLD: 'Hollanda', BEL: 'Belçika', AUT: 'Avusturya', POL: 'Polonya', ROU: 'Romanya', BGR: 'Bulgaristan', GRC: 'Yunanistan', HRV: 'Hırvatistan', HUN: 'Macaristan', CZE: 'Çekya', SVK: 'Slovakya', SVN: 'Slovenya', PRT: 'Portekiz', SWE: 'İsveç', DNK: 'Danimarka', FIN: 'Finlandiya', NOR: 'Norveç', IRL: 'İrlanda', LTU: 'Litvanya', LVA: 'Letonya', EST: 'Estonya', CYP: 'Kıbrıs', MLT: 'Malta', LUX: 'Lüksemburg', CHE: 'İsviçre', GBR: 'İngiltere', SRB: 'Sırbistan', MKD: 'K. Makedonya', ALB: 'Arnavutluk', BIH: 'Bosna-Hersek', MNE: 'Karadağ', XKX: 'Kosova', UKR: 'Ukrayna', MDA: 'Moldova', ISL: 'İzlanda', }; export const TedTenders = () => { const [mod, setMod] = useState('acik'); const [data, setData] = useState(null); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); // Çeviriler sunucuda arka planda tamamlanır; "bekleniyor" geldiği sürece // sessizce (yükleniyor göstergesi olmadan) birkaç kez yeniden çekilir. const yenidenDeneme = React.useRef(0); const yukle = (m, sessiz = false) => { if (!sessiz) { setLoading(true); setError(null); yenidenDeneme.current = 0; } fetch(`/api/ted?mod=${m}&limit=30`) .then((r) => r.json()) .then((d) => { if (!d.success) { if (!sessiz) setError(d.error); return; } setData(d); if (d.ceviriBekleniyor && yenidenDeneme.current < 12) { yenidenDeneme.current += 1; setTimeout(() => yukle(m, true), 7000); } }) .catch((e) => { if (!sessiz) setError(e.message); }) .finally(() => { if (!sessiz) setLoading(false); }); }; useEffect(() => { yukle(mod); }, [mod]); const aktifMod = MODLAR.find((m) => m.id === mod); return (

AB İhaleleri — TED

Tenders Electronic Daily (AB resmi ihale yayını) üzerinden Türkiye ile ilgili ihaleler.

{/* Mod seçici */}
{MODLAR.map((m) => ( ))}

{aktifMod?.aciklama}

{data && ( {data.totalCount.toLocaleString('tr-TR')} kayıt )}
{error && (

TED verisi alınamadı

{error}

)} {loading && !data && (

TED'den çekiliyor…

)} {data?.ceviriBekleniyor && (

Başlıklar Türkçeye çevriliyor, birkaç saniye içinde güncellenir…

)} {data && (
{data.tenders.length === 0 && (

Bu filtrede kayıt bulunamadı

)} {data.tenders.map((t) => (

{t.baslikTr || t.baslik}

{t.baslikTr && t.baslikTr !== t.baslik && (

{t.baslik}

)}
{t.link && ( )}
{t.kurum} {t.sehir && {t.sehir}} {t.ulke && {ULKE_TR[t.ulke] || t.ulke}} {t.sonTeklifTarihi ? `Son teklif: ${t.sonTeklifTarihi}` : t.yayimTarihi} {t.alimTuru} {t.sonucIlani && Sonuç İlanı}
{(t.aciklamaTr || t.aciklama) && (

{t.aciklamaTr || t.aciklama}

)} {(t.kazananFirma || t.yaklasikMaliyet != null) && (
{t.kazananFirma && ( {t.kazananFirma} {t.kazananUlke && ({ULKE_TR[t.kazananUlke] || t.kazananUlke})} )} {t.yaklasikMaliyet != null && ( {t.yaklasikMaliyet.toLocaleString('tr-TR')} {t.paraBirimi || ''} )}
)}
))}
)}

Kaynak: Tenders Electronic Daily (ted.europa.eu) — Avrupa Birliği resmi ihale yayını.

); };