"use client"; // Sihirbazın 3 adımlık seçim gövdesi. Hem ana sayfadaki hero modalında hem de // /sonuc'taki sihirbaz modalında kullanılır; seçim state'ini kendi tutar, // tamamlanınca onTamamla(secimler) çağırır. import { useState } from "react"; import { ArrowLeft, ArrowRight, Sparkles, X } from "lucide-react"; import { useReducedMotion } from "motion/react"; import useMeasure from "react-use-measure"; import { toast } from "sonner"; import { cities } from "turkey-map-react/lib/data"; import { TransitionPanel } from "@/components/core/transition-panel"; import { Button } from "@/components/ui/button"; import { IlSecimHaritasi } from "@/components/il-secim-haritasi"; import { normalizeIlAdi } from "@/lib/harita"; import type { SihirbazFacetleri } from "@/lib/db"; import { ONCELIKLER, UNIVERSITE_TIPI_ETIKET, type SihirbazSecimleri, type UniversiteTipi, } from "@/lib/sihirbaz"; export function Cip({ secili, onClick, children, }: { secili: boolean; onClick: () => void; children: React.ReactNode; }) { return ( ); } // Haritada karşılığı olan iller (KKTC/yurtdışı kampüsler çip olarak kalır) const HARITA_ILLERI = new Set(cities.map((c) => normalizeIlAdi(c.name))); export function SihirbazAdimlar({ facetler, baslangicSecimler, sonButonEtiketi, onTamamla, }: { facetler: SihirbazFacetleri; baslangicSecimler?: SihirbazSecimleri | null; sonButonEtiketi: string; onTamamla: (secimler: SihirbazSecimleri) => void; }) { const [adim, setAdim] = useState(0); const [yon, setYon] = useState(1); const [gecisBasladi, setGecisBasladi] = useState(false); const [panelRef, panelOlculeri] = useMeasure(); const hareketiAzalt = useReducedMotion(); const [kategoriler, setKategoriler] = useState( baslangicSecimler?.kategoriler ?? [], ); const [iller, setIller] = useState(baslangicSecimler?.iller ?? []); const [universiteTipi, setUniversiteTipi] = useState( baslangicSecimler?.universiteTipi ?? "farketmez", ); const [oncelikler, setOncelikler] = useState( baslangicSecimler?.oncelikler ?? [], ); function listeDegistir( liste: string[], setListe: (v: string[]) => void, deger: string, maks?: number, ) { if (liste.includes(deger)) { setListe(liste.filter((x) => x !== deger)); } else { if (maks && liste.length >= maks) { toast.info(`En fazla ${maks} seçebilirsin.`); return; } setListe([...liste, deger]); } } const adimGecerli = adim === 0 ? kategoriler.length > 0 : true; function adimaGit(yeniAdim: number) { setYon(yeniAdim > adim ? 1 : -1); setGecisBasladi(true); setAdim(yeniAdim); } const panelYuksekligi = gecisBasladi && panelOlculeri.height > 0 ? panelOlculeri.height : "auto"; return (
{[0, 1, 2].map((i) => ( ))} Adım {adim + 1}/3
({ x: hareketiAzalt ? 0 : gecisYonu > 0 ? "100%" : "-100%", opacity: 0, height: panelYuksekligi, position: "relative", }), center: { zIndex: 1, x: 0, opacity: 1, height: panelYuksekligi, }, exit: (gecisYonu: number) => ({ zIndex: 0, x: hareketiAzalt ? 0 : gecisYonu < 0 ? "100%" : "-100%", opacity: 0, position: "absolute", top: 0, left: 0, width: "100%", }), }} transition={ hareketiAzalt ? // Azaltılmış harekette yalnızca kısa çapraz solma; height/x // varsayılan spring'e düşüp oynamasın diye açıkça sıfırlanır. { opacity: { duration: 0.12 }, x: { duration: 0 }, height: { duration: 0 }, } : { x: { type: "spring", stiffness: 300, damping: 30 }, height: { type: "spring", stiffness: 300, damping: 30 }, opacity: { duration: 0.2 }, } } >

Hangi alanlara ilgi duyuyorsun?

Sıralamanla ulaşabileceğin alanlar. En az bir tane seç.

{facetler.kategoriler.map((k) => ( listeDegistir(kategoriler, setKategoriler, k.ad)} > {k.ad} {k.adet} ))}

Nerede okumak istersin?

En fazla 5 il seçebilirsin. İstersen boş bırak, fark etmez.

{/* Çipler birincil seçim yolu (haritadaki küçük iller mobilde güvenilir dokunma hedefi değil); tüm iller program sayısına göre sıralı listelenir. */}
{[...facetler.iller] .sort((a, b) => b.adet - a.adet) .map((i) => ( listeDegistir(iller, setIller, i.il, 5)} > {i.il.toLocaleLowerCase("tr-TR")} {i.adet} ))}
{iller.length > 0 ? (
Seçtiklerin: {iller.map((il) => ( ))}
) : null} {/* Harita geniş ekranda görsel destek olarak kalır */}
HARITA_ILLERI.has(i.il))} secili={iller} onToggle={(il) => listeDegistir(iller, setIller, il, 5)} />

Üniversite tipi & öncelikler

Bunlar listenin dengesini belirler.

Üniversite tipi

{facetler.uniturler.map((u) => ( setUniversiteTipi( universiteTipi === u.grup ? "farketmez" : u.grup, ) } > {UNIVERSITE_TIPI_ETIKET[u.grup]} {u.adet} ))} setUniversiteTipi("farketmez")} > Fark etmez

Senin için önemli olan

{ONCELIKLER.map((o) => ( listeDegistir(oncelikler, setOncelikler, o)} > {o} ))}
{adim < 2 ? ( ) : ( )}
); }