merge(icerik/sezon-celiskisi): [Bilal] content(bant): sezon-dışı bant metni — B alternatifi
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
86
src/lib/sezon.ts
Normal file
86
src/lib/sezon.ts
Normal file
@@ -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<Record<number, SezonAraligi | null>> = {
|
||||
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<SezonAsamasi, string> = {
|
||||
"takvim-belirsiz": `${BASLIK_YILI} yerleştirme verileri yüklendi — ${TERCIH_YILI} tercih takvimi açıklanınca geri sayım burada başlar`,
|
||||
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`;
|
||||
Reference in New Issue
Block a user