"use client"; // Program satırındaki "netler" butonu: YÖK Atlas'ın "yerleşen son kişinin // netleri" verisini (data/yokatlas.db → netler tablosu, /api/netler) yıl // sütunlu kompakt bir modalde gösterir. Kadın-erkek dağılımı bilinçli olarak // yok: YÖK Atlas 2026 SPA'sına geçerken cinsiyet panelini yayından kaldırdı // (bkz. scripts/detay.ts). import { SATIR_DUGME_BOYU } from "@/components/liste-satiri"; import { useState } from "react"; import { ListChecks } from "lucide-react"; import type { ProgramNetSatiri } from "@/types/yokatlas"; import { olay } from "@/lib/analitik"; import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, DialogTrigger, } from "@/components/ui/dialog"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@/components/ui/table"; // Ders sırası ÖSYM oturum sırasıyla; max = testteki soru sayısı. const DERSLER: { alan: keyof Omit; etiket: string; max: number; }[] = [ { alan: "tytTrkNet", etiket: "TYT Türkçe", max: 40 }, { alan: "tytSosNet", etiket: "TYT Sosyal Bilimler", max: 20 }, { alan: "tytMatNet", etiket: "TYT Matematik", max: 40 }, { alan: "tytFenNet", etiket: "TYT Fen Bilimleri", max: 20 }, { alan: "aytMatNet", etiket: "AYT Matematik", max: 40 }, { alan: "aytFizNet", etiket: "AYT Fizik", max: 14 }, { alan: "aytKimNet", etiket: "AYT Kimya", max: 13 }, { alan: "aytBioNet", etiket: "AYT Biyoloji", max: 13 }, { alan: "aytTdeNet", etiket: "AYT Türk Dili ve Edebiyatı", max: 24 }, { alan: "aytTrh1Net", etiket: "AYT Tarih-1", max: 10 }, { alan: "aytCog1Net", etiket: "AYT Coğrafya-1", max: 6 }, { alan: "aytTrh2Net", etiket: "AYT Tarih-2", max: 11 }, { alan: "aytCog2Net", etiket: "AYT Coğrafya-2", max: 11 }, { alan: "aytDinNet", etiket: "AYT Din Kültürü", max: 6 }, { alan: "aytFelNet", etiket: "AYT Felsefe Grubu", max: 12 }, { alan: "ydtYdilNet", etiket: "YDT Yabancı Dil", max: 80 }, ]; const net = (n: number) => n.toLocaleString("tr-TR", { maximumFractionDigits: 2 }); type Durum = "bekliyor" | "yukleniyor" | "hazir" | "hata"; export function ProgramNetleriButonu({ programId, isim, universite, className = "", }: { programId: string; isim: string; universite?: string; className?: string; }) { const [durum, setDurum] = useState("bekliyor"); const [netler, setNetler] = useState([]); async function yukle() { setDurum("yukleniyor"); try { const res = await fetch(`/api/netler?id=${programId}`); if (!res.ok) throw new Error(String(res.status)); const veri = (await res.json()) as { netler: ProgramNetSatiri[] }; setNetler(veri.netler); setDurum("hazir"); } catch { setDurum("hata"); } } function acildi(acik: boolean) { if (!acik) return; olay("netler_goruntulendi"); if (durum === "bekliyor" || durum === "hata") yukle(); } return ( e.stopPropagation()} > Son yerleşenin netleri {isim} {universite ? ` · ${universite}` : ""} — bölüme en düşük puanla yerleşen adayın sınav netleri (YÖK Atlas). ); } function NetlerIcerik({ durum, netler, }: { durum: Durum; netler: ProgramNetSatiri[]; }) { if (durum === "yukleniyor" || durum === "bekliyor") { return (
{[0, 1, 2, 3, 4].map((i) => (
))}
); } if (durum === "hata") { return (

Netler yüklenemedi. Modalı kapatıp yeniden açmayı dene.

); } if (netler.length === 0) { return (

Bu program için YÖK Atlas'ta net verisi yayınlanmamış.

); } const dersler = DERSLER.filter((d) => netler.some((y) => y[d.alan] != null), ); return (
Ders {netler.map((y) => ( {y.yil} ))} {dersler.map((d) => ( {d.etiket} / {d.max} {netler.map((y) => { const deger = y[d.alan]; return ( {deger != null ? net(deger) : "—"} ); })} ))} OBP {netler.map((y) => ( {y.obp != null ? net(y.obp) : "—"} ))} Yerleşme puanı {netler.map((y) => ( {y.tabanPuan != null ? net(y.tabanPuan) : "—"} ))}
); }