- lib/sihirbaz.ts ikiye ayrıldı: sihirbaz-sabitler.ts (şema + doğrulayıcılar + event/storage sabitleri + sonucHref/secimOzeti, izomorfik) ve sihirbaz-profil.ts (localStorage oku/yaz/sil); 25 tüketicinin importu sembol bazında bölünerek güncellendi, localStorage anahtar/event değerleri birebir aynı - sihirbaz-adimlar(+lazy), hero-form, cta-sira-form, il-secim-haritasi ve /sonuc'un sihirbaz-modal/sihirbaz-cagri-karti/sira-gerekli bileşenleri features/sihirbaz/components/ altına taşındı - sihirbaz-queries.ts ve async SihirbazBolumu sarmalayıcısı /sonuc sayfa dönüşümüyle birlikte Faz 9'da gelecek (o zamana dek ölü kod olurlardı) - Davranış değişikliği yok Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
105 lines
4.0 KiB
TypeScript
105 lines
4.0 KiB
TypeScript
import type { Metadata } from "next";
|
||
import { rankWindowFacets, searchByRank } from "@/lib/db";
|
||
import { PUAN_TURLERI, type PuanTuruKey } from "@/types/yokatlas";
|
||
import { getSession } from "@/lib/session";
|
||
import { kullanicininRaporu } from "@/lib/rapor-kaydi";
|
||
import { tadimlikSec } from "@/lib/tadimlik-havuzu";
|
||
import { SihirbazBolumu } from "@/features/sihirbaz/components/sihirbaz-cagri-karti";
|
||
import { TadimlikSatiri } from "./tadimlik-satiri";
|
||
import { ProgramTablosu } from "@/components/program-tablosu";
|
||
import { ManuelHarita } from "@/components/manuel-liste/manuel-harita";
|
||
import { SiteFooter } from "@/components/site-footer";
|
||
import { SiraGerekli } from "@/features/sihirbaz/components/sira-gerekli";
|
||
|
||
export const metadata: Metadata = {
|
||
title: "Tercih Listeni Kur",
|
||
// Param uzayı sonsuz + içerik sıralamaya göre kişisel: indexlenmez ama
|
||
// link değeri follow ile geri akar. robots.txt'te ENGELLEME — noindex'in
|
||
// görülebilmesi için sayfa taranabilir kalmalı.
|
||
robots: { index: false, follow: true },
|
||
};
|
||
|
||
export default async function SonucPage({
|
||
searchParams,
|
||
}: {
|
||
searchParams: Promise<{
|
||
sira?: string;
|
||
tur?: string;
|
||
sihirbaz?: string;
|
||
hazir?: string;
|
||
}>;
|
||
}) {
|
||
const params = await searchParams;
|
||
const sira = Number.parseInt(params.sira ?? "", 10);
|
||
const turKey: PuanTuruKey =
|
||
params.tur && params.tur in PUAN_TURLERI
|
||
? (params.tur as PuanTuruKey)
|
||
: "say";
|
||
|
||
if (!Number.isFinite(sira) || sira < 1 || sira > 4_000_000) {
|
||
return (
|
||
<>
|
||
<SiraGerekli />
|
||
<SiteFooter />
|
||
</>
|
||
);
|
||
}
|
||
|
||
// Sihirbaz için: kullanıcının kayıtlı raporu var mı? Listenin kendisi
|
||
// /listem'de yaşar; burada yalnızca CTA'nın hangi hâlde render edileceği
|
||
// için varlık bilgisi gerekir.
|
||
const session = await getSession();
|
||
const raporSatiri = session
|
||
? await kullanicininRaporu(session.user.id)
|
||
: null;
|
||
|
||
const facetler = rankWindowFacets(sira, turKey);
|
||
// Yapay Zeka'sız ham liste: yalnızca sıralamayla ulaşılabilen programlar (dilimli)
|
||
const hamSonuclar = searchByRank(sira, turKey, { limitPerBucket: 20 });
|
||
|
||
// Girişsiz tadımlık (İP-B): SSR'da kovaya uyan "genel" satır seçilir;
|
||
// sihirbaz kategorisi client'ta okunup /api/tadimlik ile kişiselleştirilir.
|
||
// Girişli kullanıcı gerçek ürünü zaten görebildiği için tadımlık almaz.
|
||
const tadimlik = session ? null : await tadimlikSec(sira, turKey);
|
||
|
||
return (
|
||
<div className="min-h-screen bg-slate-50 text-slate-900">
|
||
<main className="mx-auto max-w-4xl px-4 py-12">
|
||
{/* Sayfa hiyerarşisi: önce Türkiye haritası, sonra liste. Manuel
|
||
liste store'una abone olduğundan tablodan "+" ile eklenenler
|
||
buraya canlı yansır. */}
|
||
<ManuelHarita />
|
||
|
||
{/* Yapay Zeka'dan bağımsız ham tablo — haritanın hemen altında, sayfanın ana
|
||
gövdesi; puan türü navbar'daki sıralama rozetinden değiştirilir */}
|
||
<ProgramTablosu sonuclar={hamSonuclar} adaySira={sira} tur={turKey} />
|
||
|
||
{/* Girişsiz tadımlık: gerçek rapor satırı formatında tek örnek.
|
||
Havuzda içerik yoksa bileşen hiç render edilmez. */}
|
||
{!session ? (
|
||
<TadimlikSatiri sira={sira} tur={turKey} ilk={tadimlik} />
|
||
) : null}
|
||
|
||
{/* Sihirbaz akışı (CTA + modal) — üretim ve liste /listem'de yaşar,
|
||
burada yalnızca funnel kartları render edilir */}
|
||
<SihirbazBolumu
|
||
sira={sira}
|
||
tur={turKey}
|
||
facetler={facetler}
|
||
girisliMi={Boolean(session)}
|
||
raporVar={Boolean(raporSatiri?.result)}
|
||
otomatikAc={params.sihirbaz === "1"}
|
||
secimlerHazir={params.hazir === "1"}
|
||
/>
|
||
|
||
<p className="mt-10 text-center text-xs leading-relaxed text-slate-500">
|
||
Veriler resmî YÖK Atlas kaynağından derlenmiştir. KolayTercih bir karar
|
||
destek aracıdır; yerleşme garantisi vermez, tercih sorumluluğu adaya
|
||
aittir.
|
||
</p>
|
||
</main>
|
||
<SiteFooter />
|
||
</div>
|
||
);
|
||
}
|