From 54fb72d18c7f2facbe42204b9dc8224905338738 Mon Sep 17 00:00:00 2001 From: bilalgursen Date: Tue, 22 Sep 2026 01:18:24 +0300 Subject: [PATCH 1/5] refactor(sezon): tercih takvimi tek kaynakta (lib/sezon.ts) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Üst banttaki elle gömülü 2026 başlangıç/bitiş damgaları `src/lib/sezon.ts` içindeki `SEZON_TAKVIMI`ye taşındı. Aşama hesabı (`sezonAsamasi`) ve geri sayım hedefi (`sezonHedefi`) artık oradan geliyor; `devam-ediyor` dalının davranışı birebir aynı. 2027 takvimi ÖSYM tarafından açıklanmadığı için `null` bırakıldı — tarih uydurulmadı. Co-Authored-By: Claude Opus 5 --- src/components/site-top-banner.tsx | 19 ++----- src/lib/sezon.ts | 86 ++++++++++++++++++++++++++++++ 2 files changed, 91 insertions(+), 14 deletions(-) create mode 100644 src/lib/sezon.ts diff --git a/src/components/site-top-banner.tsx b/src/components/site-top-banner.tsx index cb077ec..2a2357f 100644 --- a/src/components/site-top-banner.tsx +++ b/src/components/site-top-banner.tsx @@ -3,12 +3,10 @@ import { startTransition, useEffect, useState } from "react"; import NumberFlow, { NumberFlowGroup } from "@number-flow/react"; import { CalendarDays, Clock3 } from "lucide-react"; - -const TERCIH_BASLANGICI = new Date("2026-07-29T00:00:00+03:00").getTime(); -const TERCIH_BITISI = new Date("2026-08-10T23:59:59+03:00").getTime(); +import { sezonAsamasi, sezonHedefi, type SezonAsamasi } from "@/lib/sezon"; type GeriSayim = { - asama: "baslamadi" | "devam-ediyor" | "sona-erdi"; + asama: SezonAsamasi; gun: number; saat: number; dakika: number; @@ -16,16 +14,9 @@ type GeriSayim = { }; function geriSayimiHesapla(simdi: number): GeriSayim { - const asama = - simdi < TERCIH_BASLANGICI - ? "baslamadi" - : simdi <= TERCIH_BITISI - ? "devam-ediyor" - : "sona-erdi"; - - const hedef = - asama === "baslamadi" ? TERCIH_BASLANGICI : TERCIH_BITISI; - const kalan = Math.max(0, hedef - simdi); + const asama = sezonAsamasi(simdi); + const hedef = sezonHedefi(asama); + const kalan = hedef === null ? 0 : Math.max(0, hedef - simdi); return { asama, diff --git a/src/lib/sezon.ts b/src/lib/sezon.ts new file mode 100644 index 0000000..07028a1 --- /dev/null +++ b/src/lib/sezon.ts @@ -0,0 +1,86 @@ +/** + * Tercih sezonu takvimi — TEK KAYNAK. 2027 takvimi açıklanınca buraya yazılır; + * başka hiçbir yer değişmez. Saf: yalnız `veri-yillari` sabitlerini okur, yan + * etkisi yok — client, server ve betikler aynı dosyayı kullanabilir. + */ + +import { BASLIK_YILI, TERCIH_YILI } from "@/lib/veri-yillari"; + +/** Bir sezonun ÖSYM takvimi. ISO 8601, Türkiye saati (+03:00) ofsetiyle. */ +export type SezonAraligi = { + readonly baslangic: string; + readonly bitis: string; +}; + +/** + * Yıl → tercih dönemi aralığı. `null` = takvim henüz açıklanmadı; tarih + * UYDURULMAZ, sezon "takvim-belirsiz" davranışına düşer. + */ +export const SEZON_TAKVIMI: Readonly> = { + 2026: { + baslangic: "2026-07-29T00:00:00+03:00", + bitis: "2026-08-10T23:59:59+03:00", + }, + // ÖSYM 2027 tercih takvimini açıklamadı (22 Eyl 2026 itibarıyla). + 2027: null, +}; + +export type SezonAsamasi = + | "takvim-belirsiz" + | "baslamadi" + | "devam-ediyor" + | "sona-erdi"; + +/** Verilen anda sezonun hangi aşamada olduğu. */ +export function sezonAsamasi( + simdi: number, + yil: number = TERCIH_YILI, +): SezonAsamasi { + const takvim = SEZON_TAKVIMI[yil] ?? null; + + if (!takvim) { + return "takvim-belirsiz"; + } + + const baslangic = new Date(takvim.baslangic).getTime(); + const bitis = new Date(takvim.bitis).getTime(); + + return simdi < baslangic + ? "baslamadi" + : simdi <= bitis + ? "devam-ediyor" + : "sona-erdi"; +} + +/** + * Geri sayımın hedef zaman damgası: dönem başlamadıysa başlangıç, sürüyorsa + * bitiş. `null` dönen aşamalarda (takvim belirsiz ya da dönem kapandı) sayılacak + * bir şey yoktur — çağıran geri sayımı hiç render etmemelidir. + */ +export function sezonHedefi( + asama: SezonAsamasi, + yil: number = TERCIH_YILI, +): number | null { + const takvim = SEZON_TAKVIMI[yil] ?? null; + + if (!takvim) { + return null; + } + + if (asama === "baslamadi") { + return new Date(takvim.baslangic).getTime(); + } + + return asama === "devam-ediyor" ? new Date(takvim.bitis).getTime() : null; +} + +/** Üst bandın saat ikonunun yanındaki metin — aşama başına tek kaynak. */ +export const BANT_METNI: Record = { + "takvim-belirsiz": `${TERCIH_YILI} tercihine hazırlık · ${BASLIK_YILI} yerleştirme verisi yüklü`, + baslamadi: "Başlamasına", + "devam-ediyor": "Sona ermesine", + "sona-erdi": `${TERCIH_YILI} tercihleri tamamlandı`, +}; + +/** Üst bandın `aria-label`'ı. */ +export const BANT_ARIA = `${TERCIH_YILI} YKS tercih dönemi`; From 46efc7f86c3b92f791a10035e3a1bd49fb26acde Mon Sep 17 00:00:00 2001 From: bilalgursen Date: Tue, 22 Sep 2026 01:19:43 +0300 Subject: [PATCH 2/5] =?UTF-8?q?fix(icerik):=20=C3=BCst=20bant=20sezon=20d?= =?UTF-8?q?=C4=B1=C5=9F=C4=B1nda=20"sona=20erdi"=20demez,=20haz=C4=B1rl?= =?UTF-8?q?=C4=B1k=20=C3=A7er=C3=A7evesi=20kurar?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 2027 takvimi açıklanmadığı için bant artık "takvim-belirsiz" aşamasında: geri sayım ve `role="timer"` hiç render edilmiyor (boş "--" sayaçları yok), metin `BANT_METNI` üzerinden "2027 tercihine hazırlık · 2026 yerleştirme verisi yüklü" oluyor. Yıl ve aralık `TERCIH_YILI`/`VERI_ARALIGI`'ndan geliyor; takvim bilinmiyorsa `