"use client"; import { useEffect, useRef, useState } from "react"; import Link from "next/link"; import { ArrowRight, BookOpenText, Building2, GraduationCap, Search, X, } from "lucide-react"; import { Dialog, DialogContent, DialogDescription, DialogTitle, } from "@/components/ui/dialog"; type BolumSonucu = { href: string; ad: string; programSayisi: number; enIyiSira: number | null; seviye: string; }; type UniversiteSonucu = { href: string; ad: string; il: string | null; tur: string | null; programSayisi: number; fakulteSayisi: number; }; type AramaSonuclari = { bolumler: BolumSonucu[]; universiteler: UniversiteSonucu[]; }; const BOS_SONUCLAR: AramaSonuclari = { bolumler: [], universiteler: [] }; const sayi = (deger: number) => deger.toLocaleString("tr-TR"); export function KatalogArama() { const [acik, setAcik] = useState(false); const [sorgu, setSorgu] = useState(""); const [sonuclar, setSonuclar] = useState(BOS_SONUCLAR); const [yukleniyor, setYukleniyor] = useState(false); const inputRef = useRef(null); const temizSorgu = sorgu.trim(); const aramaAktif = temizSorgu.length >= 2; const sonucVar = sonuclar.bolumler.length > 0 || sonuclar.universiteler.length > 0; useEffect(() => { if (!acik || !aramaAktif) return; const controller = new AbortController(); const zamanlayici = window.setTimeout(async () => { setYukleniyor(true); try { const response = await fetch( `/api/katalog-ara?q=${encodeURIComponent(temizSorgu)}`, { signal: controller.signal }, ); if (!response.ok) throw new Error("Arama başarısız"); setSonuclar((await response.json()) as AramaSonuclari); } catch (hata) { if (!(hata instanceof DOMException && hata.name === "AbortError")) { setSonuclar(BOS_SONUCLAR); } } finally { if (!controller.signal.aborted) setYukleniyor(false); } }, 160); return () => { window.clearTimeout(zamanlayici); controller.abort(); }; }, [acik, aramaAktif, temizSorgu]); function modalDegisti(yeniAcik: boolean) { setAcik(yeniAcik); if (!yeniAcik) { setSorgu(""); setSonuclar(BOS_SONUCLAR); } } function kapat() { setAcik(false); } return ( <> { event.preventDefault(); inputRef.current?.focus(); }} className="max-h-[min(720px,calc(100dvh-2rem))] gap-0 overflow-hidden rounded-2xl bg-white p-0 duration-200 sm:max-w-2xl motion-reduce:data-open:zoom-in-100 motion-reduce:data-closed:zoom-out-100" > Bölüm ve üniversite ara YKS bölümlerini ve üniversiteleri tek yerden ara.
{ const yeniSorgu = event.target.value; setSorgu(yeniSorgu); setSonuclar(BOS_SONUCLAR); setYukleniyor(yeniSorgu.trim().length >= 2); }} placeholder="Bölüm veya üniversite ara..." aria-label="Bölüm veya üniversite ara" autoComplete="off" className="h-16 min-w-0 flex-1 bg-transparent text-base text-slate-950 outline-none placeholder:text-slate-400 sm:h-18 sm:text-lg" />
{!aramaAktif ? ( ) : yukleniyor ? ( ) : sonucVar ? (
{sonuclar.bolumler.length > 0 ? ( } > {sonuclar.bolumler.map((bolum) => ( ))} ) : null} {sonuclar.universiteler.length > 0 ? ( } > {sonuclar.universiteler.map((universite) => ( ))} ) : null}
) : (

"{temizSorgu}" için sonuç bulunamadı

Bölüm veya üniversite adını farklı yazarak tekrar dene.

)}
En az 2 harf yazarak ara Esc ile kapat
); } function BaslangicIcerigi({ onSec }: { onSec: () => void }) { return (

Keşfet

} baslik="Tüm bölümler" aciklama="Lisans ve önlisans" onSec={onSec} /> } baslik="Üniversiteler" aciklama="Devlet ve vakıf" onSec={onSec} /> } baslik="Tercih rehberi" aciklama="Sorularına yanıtlar" onSec={onSec} />

Neyi merak ediyorsun?

“Psikoloji” veya “Boğaziçi” gibi bir ad yaz; eşleşen sayfaları ve temel bilgilerini burada önizle.

); } function KesfetLinki({ href, ikon, baslik, aciklama, onSec, }: { href: string; ikon: React.ReactNode; baslik: string; aciklama: string; onSec: () => void; }) { return ( {ikon} {baslik} {aciklama} ); } function SonucGrubu({ baslik, ikon, children, }: { baslik: string; ikon: React.ReactNode; children: React.ReactNode; }) { return (

{ikon} {baslik}

{children}
); } function SonucLinki({ href, baslik, meta, detay, onSec, }: { href: string; baslik: string; meta: string; detay: string; onSec: () => void; }) { return ( {baslik} {meta} {detay} ); } function AramaIskeleti() { return (
{[0, 1, 2, 3].map((sira) => (
))}
); }