import { useDeadlineClock } from '../hooks/useDeadlineClock'; import React, { useEffect, useState } from 'react'; import { useApp } from '../context/AppContext'; import { Database, PlusCircle, Eye, Layers, Trophy, TrendingDown } from 'lucide-react'; import { bugunEklendi, acikIhale } from '../services/ihaleTarih'; export const LiveStatsBar = () => { const now = useDeadlineClock(); const { liveStats, tenders } = useApp(); const yukluIhale = tenders.length; const takibimdeki = tenders.filter((t) => t.takipte).length; const kalemSayisi = tenders.reduce((s, t) => s + (t.items?.length || 0), 0); // Üst kartla (BUGÜN EKLENENLER) AYNI ölçüt: bugün yayımlanan ve süresi // geçmemiş ilanlar (ilan.gov.tr + DT). İki bant farklı sayı göstermesin. const bugunEklenen = tenders.length ? tenders.filter((t) => acikIhale(t, now) && bugunEklendi(t)).length : liveStats.bugunEklenen; // Havuz sağlığı: kaynak (ilan.gov.tr) sayısı 7 GÜNLÜK ORTALAMANIN çok altındaysa // bunu açıkça söyleriz — kullanıcı "veri mi kayboldu?" diye düşünmesin. // Ortalama, tek bir ölçüme kıyaslamaktan daha güvenilir: havuz yavaş yavaş // erirse de yakalar, tek seferlik dalgalanmada boşuna uyarı vermez. const [havuz, setHavuz] = useState(null); useEffect(() => { fetch('/api/health/havuz?limit=40') .then((r) => r.json()) .then((d) => setHavuz(d.success ? d : null)) .catch(() => {}); }, []); const dusuk = havuz?.yeterliVeri && havuz.ortalamayaOran != null && havuz.ortalamayaOran < 0.6; const stats = [ { deger: liveStats.toplamIhale, etiket: 'Canlı İhale Havuzu', renk: 'text-white', dot: true }, { deger: yukluIhale, etiket: 'Yüklü İhale', renk: 'text-white', icon: Database, iconRenk: 'text-blue-400' }, { deger: bugunEklenen, etiket: 'Bugün Eklenen', renk: 'text-emerald-400', icon: PlusCircle, iconRenk: 'text-emerald-400' }, { deger: kalemSayisi, etiket: 'Kalem', renk: 'text-white', icon: Layers, iconRenk: 'text-indigo-400' }, { deger: liveStats.arsiv, etiket: 'Sonuç Arşivi', renk: 'text-white', icon: Trophy, iconRenk: 'text-emerald-400' }, { deger: takibimdeki, etiket: 'Takibimdeki', renk: 'text-white', icon: Eye, iconRenk: 'text-amber-400' }, ]; return (