feat(kvkk): çerez politikası, ölçümü kapatma ve ilk ziyaret bilgi bandı
All checks were successful
Deploy / deploy (push) Successful in 6m27s
All checks were successful
Deploy / deploy (push) Successful in 6m27s
- /cerez-politikasi: çerez aydınlatma metni (ad, amaç, süre, taraf), Rybbit ölçümünün kapsamı ve hukuki dayanağı (KVKK md. 5/2-f, Çerez Rehberi Temmuz 2025 §5.9) - OlcumTercihi: Rybbit'i tarayıcıda kapatan düğme (disable-rybbit) - CerezBilgi: ilk ziyarette bir kez görünen bilgilendirme (onay penceresi değil; rıza gerektiren çerez yok) - gizlilik: analitik bölümü kodla eşitlendi (e-posta/ad gönderilmiyor) - alt bilgi ve sitemap'e sayfa eklendi - docs: hukuki analiz ve meşru menfaat denge testi Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
312
src/app/cerez-politikasi/page.tsx
Normal file
312
src/app/cerez-politikasi/page.tsx
Normal file
@@ -0,0 +1,312 @@
|
||||
import type { Metadata } from "next";
|
||||
import Link from "next/link";
|
||||
import { Parallax } from "@/components/parallax";
|
||||
import { PagePixelDivider } from "@/components/pixel-decor";
|
||||
import { SiteFooter } from "@/components/site-footer";
|
||||
import { OlcumTercihi } from "@/components/olcum-tercihi";
|
||||
import { sayfaMetadata } from "@/lib/seo";
|
||||
|
||||
export const metadata: Metadata = sayfaMetadata({
|
||||
title: "Çerez Politikası",
|
||||
description:
|
||||
"KolayTercih çerez politikası ve çerez aydınlatma metni: hangi çerezler kullanılır, ziyaret ölçümü nasıl çalışır ve nasıl kapatılır.",
|
||||
path: "/cerez-politikasi",
|
||||
});
|
||||
|
||||
// Bu metin kodun ve Rybbit panel ayarlarının GERÇEKTE yaptığıyla birebir
|
||||
// örtüşmek zorunda. Aşağıdakilerden biri değişirse aynı commit'te güncellenir:
|
||||
// - çerez / localStorage / sessionStorage anahtarı eklenir ya da süresi değişir
|
||||
// (auth.ts, sihirbaz-profil.ts, liste-store.ts, tema-saglayici.tsx),
|
||||
// - layout.tsx'teki Rybbit betiğinin ayarı ya da paneldeki izleme ayarı
|
||||
// (kopyalama izleme, oturum kaydı, IP saklama) değişir,
|
||||
// - yeni bir üçüncü taraf betiği / gömülü içerik eklenir.
|
||||
// Açık rıza gerektiren bir çerez (reklam, yeniden hedefleme, üçüncü taraf
|
||||
// analitik, sosyal eklenti) eklenecekse ÖNCE onay penceresi kurulur.
|
||||
// Hukuki dayanak ve denge testi: docs/ekip-raporlari/2026-10-05/cerez-uyum.md
|
||||
|
||||
type Kayit = { ad: string; amac: string; sure: string };
|
||||
|
||||
const CEREZLER: Kayit[] = [
|
||||
{
|
||||
ad: "better-auth.session_token, better-auth.session_data",
|
||||
amac: "Giriş yaptığında oturumunu açık tutar. Giriş yapmadıysan oluşmaz.",
|
||||
sure: "Oturum çerezi 7 gün (kullandıkça yenilenir); önbellek çerezi 5 dakika",
|
||||
},
|
||||
{
|
||||
ad: "kolaytercih.profil",
|
||||
amac: "Sihirbazda girdiğin sıralama ve seçimleri (puan türü, alan, il, devlet/vakıf) taşır; sonuç sayfası senin sıralamana göre hazırlanır.",
|
||||
sure: "1 yıl ya da sen profilini silene kadar",
|
||||
},
|
||||
{
|
||||
ad: "kolaytercih.liste-sayi",
|
||||
amac: "Listende kaç program olduğunu taşır; sayfa açılırken liste düğmesi doğru sayıyla gelir.",
|
||||
sure: "1 yıl",
|
||||
},
|
||||
];
|
||||
|
||||
const DEPO: Kayit[] = [
|
||||
{
|
||||
ad: "kolaytercih.sihirbaz",
|
||||
amac: "Sıralaman ve sihirbaz seçimlerin; yeniden girmek zorunda kalmaman için.",
|
||||
sure: "Sen silene kadar",
|
||||
},
|
||||
{
|
||||
ad: "kolaytercih.manuel-liste.v1",
|
||||
amac: "Kendi eklediğin tercih listesi; giriş yapmadan da listen kaybolmasın diye.",
|
||||
sure: "Sen silene kadar",
|
||||
},
|
||||
{
|
||||
ad: "kt-tema",
|
||||
amac: "Açık / koyu tema tercihin.",
|
||||
sure: "Sen değiştirene kadar",
|
||||
},
|
||||
{
|
||||
ad: "kolaytercih.cerez-bilgi",
|
||||
amac: "Çerez bilgilendirmesini gördüğünü hatırlar; tekrar tekrar çıkmaz.",
|
||||
sure: "Sen silene kadar",
|
||||
},
|
||||
{
|
||||
ad: "disable-rybbit",
|
||||
amac: "Ölçümü kapattıysan bu tercihini hatırlar.",
|
||||
sure: "Sen ölçümü yeniden açana kadar",
|
||||
},
|
||||
{
|
||||
ad: "rybbit-user-id",
|
||||
amac: "Yalnız giriş yaptığında oluşur: hesabının rastgele kimlik numarası. Sihirbazdan girişe uzanan yolculuğun tek ziyaret olarak sayılmasını sağlar. E-postan ve adın bu kayda yazılmaz.",
|
||||
sure: "Çıkış yapana ya da ölçümü kapatana kadar",
|
||||
},
|
||||
{
|
||||
ad: "rybbit-visitor-id",
|
||||
amac: "Ölçüm betiğinin tarayıcında ürettiği rastgele sayı. Bugünkü ayarlarımızda sunucuya gönderilmez.",
|
||||
sure: "Sen silene ya da ölçümü kapatana kadar",
|
||||
},
|
||||
{
|
||||
ad: "Sekme süresince tutulanlar (kolaytercih.olay.*, kolaytercih.kaydet-banner-kapali, kolaytercih.liste-senkron.*, kolaytercih.liste-taban.*)",
|
||||
amac: "Aynı görüntülemenin iki kez sayılmaması, kapattığın hatırlatmanın geri gelmemesi ve listenin hesabınla bir kez eşitlenmesi için.",
|
||||
sure: "Sekmeyi kapatınca silinir",
|
||||
},
|
||||
];
|
||||
|
||||
function KayitListesi({ kayitlar }: { kayitlar: Kayit[] }) {
|
||||
return (
|
||||
<dl className="mt-3 space-y-3">
|
||||
{kayitlar.map((k) => (
|
||||
<div
|
||||
key={k.ad}
|
||||
className="rounded-2xl border border-slate-200 bg-card p-4"
|
||||
>
|
||||
<dt className="font-mono text-xs font-semibold break-words text-slate-900">
|
||||
{k.ad}
|
||||
</dt>
|
||||
<dd className="mt-1">{k.amac}</dd>
|
||||
<dd className="mt-1 text-slate-500">Süre: {k.sure}</dd>
|
||||
</div>
|
||||
))}
|
||||
</dl>
|
||||
);
|
||||
}
|
||||
|
||||
export default function CerezPolitikasiPage() {
|
||||
const baslik = "font-heading text-lg font-bold text-slate-900";
|
||||
return (
|
||||
<>
|
||||
<main className="mx-auto w-full max-w-2xl px-4 py-16">
|
||||
<Parallax fromStart strength={10}>
|
||||
<h1 className="font-heading text-3xl font-bold">Çerez Politikası</h1>
|
||||
<p className="mt-2 text-sm text-slate-500">
|
||||
Son güncelleme: 5 Ekim 2026
|
||||
</p>
|
||||
</Parallax>
|
||||
|
||||
<PagePixelDivider seed={53} className="mt-6" />
|
||||
|
||||
<div className="mt-8 space-y-6 text-sm leading-7 text-slate-700">
|
||||
<section className="rounded-2xl border border-slate-200 bg-slate-50 p-5">
|
||||
<h2 className={baslik}>Kısa özet</h2>
|
||||
<ul className="mt-2 list-disc space-y-1 pl-5">
|
||||
<li>
|
||||
Reklam çerezi, izleme çerezi ya da başka şirketlerin analitik
|
||||
çerezi kullanmıyoruz. Seni başka sitelerde takip eden hiçbir
|
||||
şey yok.
|
||||
</li>
|
||||
<li>
|
||||
Yalnız sitenin çalışması için gerekli çerezler var: oturumunu
|
||||
açık tutan, sıralamanı ve listeni hatırlayan çerezler.
|
||||
</li>
|
||||
<li>
|
||||
Hangi sayfaların okunduğunu saymak için kendi sunucumuzda
|
||||
çalışan, çerez kullanmayan bir ölçüm aracı (Rybbit)
|
||||
kullanıyoruz. İstersen aşağıdan tek tıkla kapatırsın.
|
||||
</li>
|
||||
<li>
|
||||
Bu yüzden karşına “çerezleri kabul et” penceresi
|
||||
çıkmıyor: onayını gerektiren bir çerez yok.
|
||||
</li>
|
||||
</ul>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h2 className={baslik}>Bu metin neyi anlatıyor?</h2>
|
||||
<p className="mt-2">
|
||||
Çerez, bir sitenin tarayıcına bıraktığı küçük bir metin
|
||||
dosyasıdır. Bu sayfa, kolaytercih.com’un tarayıcına ne
|
||||
yazdığını, ziyaretini nasıl ölçtüğünü ve bunları nasıl
|
||||
yönetebileceğini anlatır; 6698 sayılı Kişisel Verilerin Korunması
|
||||
Kanunu’nun (KVKK) 10. maddesi kapsamındaki çerez aydınlatma
|
||||
metnidir. Veri sorumlusu, diğer kişisel verilerin ve hakların
|
||||
için{" "}
|
||||
<Link href="/gizlilik" className="text-primary underline">
|
||||
Gizlilik ve KVKK
|
||||
</Link>{" "}
|
||||
sayfasına bak.
|
||||
</p>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h2 className={baslik}>Zorunlu çerezler</h2>
|
||||
<p className="mt-2">
|
||||
Bunlar olmadan giriş yapamaz, listeni göremezsin; senin istediğin
|
||||
hizmetin çalışması için gereklidir. Hepsi kolaytercih.com
|
||||
tarafından yazılır (birinci taraf). Hukuki dayanak: seninle
|
||||
kurulan hizmet sözleşmesinin ifası ve meşru menfaatimiz (KVKK md.
|
||||
5/2-c ve 5/2-f).
|
||||
</p>
|
||||
<KayitListesi kayitlar={CEREZLER} />
|
||||
<p className="mt-3">
|
||||
Google ile ya da e-postandaki bağlantıyla giriş yaparken, giriş
|
||||
tamamlanana kadar yaşayan kısa ömürlü güvenlik çerezleri de
|
||||
kullanılabilir. Tarayıcın güvenli bağlantıda bu adların başına{" "}
|
||||
<span className="font-mono text-xs">__Secure-</span> ekler.
|
||||
</p>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h2 className={baslik}>Tarayıcında tutulan diğer kayıtlar</h2>
|
||||
<p className="mt-2">
|
||||
Bunlar çerez değildir; tarayıcının kendi deposunda durur ve
|
||||
çerezlerden farklı olarak her istekte sunucuya gitmez. Yine de
|
||||
bilmen için listeliyoruz.
|
||||
</p>
|
||||
<KayitListesi kayitlar={DEPO} />
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h2 className={baslik}>Ziyaret ölçümü (Rybbit)</h2>
|
||||
<p className="mt-2">
|
||||
Siteyi geliştirebilmek için hangi sayfaların açıldığını ve
|
||||
sihirbazın hangi adımında bırakıldığını sayıyoruz. Bunun için
|
||||
açık kaynaklı Rybbit yazılımını Türkiye’deki kendi
|
||||
sunucumuzda çalıştırıyoruz; veriler başka bir şirkete, reklam
|
||||
ağına ya da yurt dışına gitmez.
|
||||
</p>
|
||||
<p className="mt-2">
|
||||
<strong>Ne kaydedilir:</strong> açtığın sayfanın adresi, hangi
|
||||
siteden geldiğin, tarayıcın, işletim sistemin, cihaz türün, ekran
|
||||
boyutun, tarayıcı dilin, yaklaşık konumun (ülke ve şehir
|
||||
düzeyinde), tıkladığın düğmeler ve dış bağlantılar, doldurduğun
|
||||
form alanının adı (içine yazdığın değer değil), sayfa hızı
|
||||
ölçümleri, tarayıcıda oluşan hata kayıtları ve sihirbaz adımı,
|
||||
liste oluşturma, ödeme başlatma gibi adımların gerçekleşip
|
||||
gerçekleşmediği.
|
||||
</p>
|
||||
<p className="mt-2">
|
||||
<strong>Ne kaydedilmez:</strong> IP adresin saklanmaz; ziyaretleri
|
||||
sayabilmek için IP adresin ve tarayıcı bilginden geri
|
||||
döndürülemeyen bir özet üretilir. Başarı sıralaman ham hâliyle
|
||||
gönderilmez, yalnız “50-100 bin” gibi geniş bir
|
||||
aralık olarak kaydedilir; sıralamanı ve sipariş numaranı taşıyan
|
||||
sayfa adresleri maskelenir. Forma ya da danışmana yazdıkların,
|
||||
kopyaladığın metinler ve ekran kaydı alınmaz. E-postan ve adın
|
||||
ölçüm aracına gönderilmez.
|
||||
</p>
|
||||
<p className="mt-2">
|
||||
<strong>Giriş yaptıysan:</strong> ziyaretin hesabının rastgele
|
||||
kimlik numarasıyla eşleştirilir. Böylece “sihirbazı
|
||||
dolduranların kaçı liste oluşturdu” gibi soruları
|
||||
yanıtlayabilir, bir sorun bildirdiğinde ne olduğunu
|
||||
inceleyebiliriz. Bu kayıt reklam, pazarlama ya da profilleme için
|
||||
kullanılmaz.
|
||||
</p>
|
||||
<p className="mt-2">
|
||||
<strong>Hukuki dayanak:</strong> siteyi yönetmek ve geliştirmek
|
||||
için ziyaretçi sayısını ve performansı ölçmeye yönelik meşru
|
||||
menfaatimiz (KVKK md. 5/2-f). Ölçüm yalnız bu sitede yapılır;
|
||||
başka sitelerdeki gezinmenle birleştirilmez. Bu ölçüme itiraz
|
||||
edebilirsin: aşağıdaki düğme ölçümü bu tarayıcıda tamamen kapatır.
|
||||
</p>
|
||||
<OlcumTercihi />
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h2 className={baslik}>Başka şirketlerin çerezleri</h2>
|
||||
<ul className="mt-2 list-disc space-y-2 pl-5">
|
||||
<li>
|
||||
<strong>iyzico (ödeme).</strong> Yalnız ödeme sayfasında, kart
|
||||
bilgilerini girdiğin form iyzico tarafından gösterilir. iyzico
|
||||
bu formda ödemenin güvenliği ve dolandırıcılığın önlenmesi için
|
||||
kendi çerezlerini kullanabilir. Paket satın almıyorsan bu
|
||||
sayfayı hiç görmezsin.
|
||||
</li>
|
||||
<li>
|
||||
<strong>Google ile giriş.</strong> Bu seçeneği kullanırsan
|
||||
Google’ın giriş sayfasına yönlendirilirsin; orada
|
||||
Google’ın kendi çerez politikası geçerlidir. Sitemizin
|
||||
içine Google betiği yüklenmez.
|
||||
</li>
|
||||
</ul>
|
||||
<p className="mt-2">
|
||||
Yazı tipleri, görseller ve ölçüm betiği kendi sunucularımızdan
|
||||
gelir. Sitede sosyal medya eklentisi, gömülü video ya da reklam
|
||||
yoktur.
|
||||
</p>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h2 className={baslik}>Çerezleri nasıl yönetirsin?</h2>
|
||||
<ul className="mt-2 list-disc space-y-1 pl-5">
|
||||
<li>Ölçümü yukarıdaki düğmeyle kapatabilirsin.</li>
|
||||
<li>
|
||||
Tarayıcının ayarlarından çerezleri ve site verilerini
|
||||
silebilir ya da tümüyle engelleyebilirsin. Silersen oturumun
|
||||
kapanır; giriş yapmadan oluşturduğun liste ve sihirbaz
|
||||
seçimlerin de silinir.
|
||||
</li>
|
||||
<li>
|
||||
Çerezleri tümüyle engellersen giriş yapamazsın; katalog ve
|
||||
rehber sayfalarını okumaya devam edebilirsin.
|
||||
</li>
|
||||
</ul>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h2 className={baslik}>Hakların ve iletişim</h2>
|
||||
<p className="mt-2">
|
||||
KVKK’nın 11. maddesindeki haklarını (bilgi isteme,
|
||||
düzeltme, silme, itiraz) kullanmak ya da bu sayfayla ilgili bir
|
||||
şey sormak için{" "}
|
||||
<Link href="/iletisim" className="text-primary underline">
|
||||
iletişim sayfasındaki
|
||||
</Link>{" "}
|
||||
e-posta adresine yaz; en geç 30 gün içinde yanıtlarız. Hakların
|
||||
tam listesi{" "}
|
||||
<Link href="/gizlilik" className="text-primary underline">
|
||||
Gizlilik ve KVKK
|
||||
</Link>{" "}
|
||||
sayfasında.
|
||||
</p>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h2 className={baslik}>Değişiklikler</h2>
|
||||
<p className="mt-2">
|
||||
Yeni bir çerez ya da ölçüm yöntemi eklersek bu sayfayı aynı gün
|
||||
güncelleriz. Onayını gerektiren bir çerez eklemeye karar verirsek
|
||||
önce sana sorarız; onay vermeden o çerez çalışmaz.
|
||||
</p>
|
||||
</section>
|
||||
</div>
|
||||
</main>
|
||||
<SiteFooter />
|
||||
</>
|
||||
);
|
||||
}
|
||||
@@ -233,19 +233,24 @@ export default function GizlilikPage() {
|
||||
<section>
|
||||
<h2 className={baslik}>Çerezler ve analitik</h2>
|
||||
<p className="mt-2">
|
||||
Yalnızca oturumunu açık tutmak için zorunlu çerezler kullanılır;
|
||||
reklam veya izleme çerezi kullanılmaz. Siteyi geliştirebilmek için
|
||||
hangi sayfaların görüntülendiğini ve hangi adımların tamamlandığını
|
||||
ölçen, çerez kullanmayan bir analitik aracı (Rybbit) çalıştırıyoruz;
|
||||
bu araç kendi sunucumuzda barındırılır, veriler üçüncü taraf bir
|
||||
reklam ağına gitmez. Giriş yaptığında ziyaretin hesabınla
|
||||
eşleştirilir; bunun için e-posta adresin ve hesabındaki adın
|
||||
(varsa) kendi sunucumuzdaki bu analitik aracına kaydedilir ve
|
||||
yalnızca sorun giderme ile destek amacıyla kullanılır. Başarı
|
||||
sıralaman analitiğe ham hâliyle
|
||||
gönderilmez; yalnızca “50-100 bin” gibi geniş bir
|
||||
aralık olarak kaydedilir. Danışman profilindeki değerler
|
||||
analitiğe gitmez; yalnız hangi alanın kaydedildiği sayılır.
|
||||
Yalnızca sitenin çalışması için zorunlu çerezler kullanılır
|
||||
(oturumun, sıralaman ve listen); reklam veya izleme çerezi
|
||||
kullanılmaz. Siteyi geliştirebilmek için hangi sayfaların
|
||||
görüntülendiğini ve hangi adımların tamamlandığını ölçen, çerez
|
||||
kullanmayan bir analitik aracı (Rybbit) çalıştırıyoruz; bu araç
|
||||
Türkiye’deki kendi sunucumuzda barındırılır, veriler üçüncü
|
||||
taraf bir reklam ağına ya da yurt dışına gitmez. IP adresin
|
||||
saklanmaz. Giriş yaptığında ziyaretin hesabının rastgele kimlik
|
||||
numarasıyla eşleştirilir; e-posta adresin ve adın analitiğe
|
||||
gönderilmez. Başarı sıralaman analitiğe ham hâliyle gönderilmez;
|
||||
yalnızca “50-100 bin” gibi geniş bir aralık olarak
|
||||
kaydedilir. Danışman profilindeki değerler analitiğe gitmez;
|
||||
yalnız hangi alanın kaydedildiği sayılır. Çerezlerin tam listesi,
|
||||
ölçümün ayrıntıları ve ölçümü kapatma düğmesi{" "}
|
||||
<Link href="/cerez-politikasi" className="text-primary underline">
|
||||
Çerez Politikası
|
||||
</Link>{" "}
|
||||
sayfasındadır.
|
||||
</p>
|
||||
</section>
|
||||
</Parallax>
|
||||
|
||||
@@ -11,6 +11,7 @@ import { TercihProfiliKapisiLazy } from "@/features/liste/components/tercih-prof
|
||||
import { HeaderGate } from "@/components/header-gate";
|
||||
import { DevPanelMount } from "@/components/dev/dev-panel-mount";
|
||||
import { ConsoleAsr } from "@/components/console-asr";
|
||||
import { CerezBilgi } from "@/components/cerez-bilgi";
|
||||
import { JsonLd, organizationJsonLd, webSiteJsonLd, SITE_URL } from "@/lib/seo";
|
||||
import "./globals.css";
|
||||
|
||||
@@ -117,6 +118,8 @@ export default function RootLayout({
|
||||
<KaydetBannerLazy />
|
||||
{/* İlk "+" için sıra + sihirbaz kapısı */}
|
||||
<TercihProfiliKapisiLazy />
|
||||
{/* İlk ziyarette bir kez: çerez bilgilendirmesi (onay penceresi değil) */}
|
||||
<CerezBilgi />
|
||||
<Toaster position="top-center" />
|
||||
{/* DevTools'u açan meraklıya piksel kum saati + Asr Sûresi */}
|
||||
<ConsoleAsr />
|
||||
|
||||
@@ -44,6 +44,11 @@ const staticEntries: MetadataRoute.Sitemap = [
|
||||
{ url: `${SITE_URL}/meraklisina`, priority: 0.6, changeFrequency: "monthly" },
|
||||
{ url: `${SITE_URL}/iletisim`, priority: 0.3, changeFrequency: "yearly" },
|
||||
{ url: `${SITE_URL}/gizlilik`, priority: 0.2, changeFrequency: "yearly" },
|
||||
{
|
||||
url: `${SITE_URL}/cerez-politikasi`,
|
||||
priority: 0.2,
|
||||
changeFrequency: "yearly",
|
||||
},
|
||||
{ url: `${SITE_URL}/kosullar`, priority: 0.2, changeFrequency: "yearly" },
|
||||
];
|
||||
|
||||
|
||||
80
src/components/cerez-bilgi.tsx
Normal file
80
src/components/cerez-bilgi.tsx
Normal file
@@ -0,0 +1,80 @@
|
||||
"use client";
|
||||
|
||||
// İlk ziyarette bir kez görünen çerez bilgilendirmesi. Onay penceresi DEĞİL:
|
||||
// sitede açık rıza gerektiren çerez yok (zorunlu çerezler + kendi
|
||||
// sunucumuzdaki ölçüm; bkz. /cerez-politikasi). KVKK Çerez Rehberi (Temmuz
|
||||
// 2025) §9, veri işleme şartından bağımsız olarak siteye girişte
|
||||
// bilgilendirme bekliyor; bu bant onu karşılar. Kabul/ret düğmesi yoktur,
|
||||
// çünkü sorulan bir rıza yoktur — ölçümü kapatma anahtarı politika
|
||||
// sayfasındadır. Kapatma kalıcıdır (localStorage).
|
||||
|
||||
import { useEffect, useState } from "react";
|
||||
import Link from "next/link";
|
||||
import { usePathname } from "next/navigation";
|
||||
import { Button } from "@/components/ui/button";
|
||||
import { ViewportPortal } from "@/components/viewport-portal";
|
||||
import { kromGizliMi } from "@/components/header-gate";
|
||||
|
||||
const GORULDU_KEY = "kolaytercih.cerez-bilgi";
|
||||
|
||||
export function CerezBilgi() {
|
||||
const pathname = usePathname();
|
||||
|
||||
// SSR/ilk boyada gizli başla; durum mount'ta okunur.
|
||||
const [goruldu, setGoruldu] = useState(true);
|
||||
useEffect(() => {
|
||||
try {
|
||||
// eslint-disable-next-line react-hooks/set-state-in-effect
|
||||
setGoruldu(Boolean(localStorage.getItem(GORULDU_KEY)));
|
||||
} catch {
|
||||
// Depolama kapalıysa "görüldü" saklanamaz; her sayfada çıkmasın.
|
||||
setGoruldu(true);
|
||||
}
|
||||
}, []);
|
||||
|
||||
if (goruldu) return null;
|
||||
// Giriş/ödeme gibi kromsuz akışlarda ve politikanın kendisinde gösterilmez.
|
||||
if (pathname && kromGizliMi(pathname)) return null;
|
||||
if (pathname === "/cerez-politikasi") return null;
|
||||
|
||||
function kapat() {
|
||||
setGoruldu(true);
|
||||
try {
|
||||
localStorage.setItem(GORULDU_KEY, "1");
|
||||
} catch {}
|
||||
}
|
||||
|
||||
return (
|
||||
<ViewportPortal>
|
||||
{/* z-45: KaydetBanner'ın (z-40) üstünde, modalların (z-50) altında */}
|
||||
<div className="pointer-events-none fixed inset-x-0 bottom-4 z-45 px-4 print:hidden">
|
||||
<section
|
||||
aria-label="Çerez bilgilendirmesi"
|
||||
className="pointer-events-auto mx-auto flex max-w-xl flex-wrap items-center gap-3 rounded-2xl border border-slate-200 bg-card p-4 shadow-xl sm:flex-nowrap sm:gap-4"
|
||||
>
|
||||
<p className="min-w-0 flex-1 text-sm leading-snug text-slate-700">
|
||||
Bu sitede reklam ya da izleme çerezi yok. Yalnız oturumun ve listen
|
||||
için gerekli çerezleri ve kendi sunucumuzda çalışan çerezsiz
|
||||
ziyaret ölçümünü kullanıyoruz.{" "}
|
||||
<Link
|
||||
href="/cerez-politikasi"
|
||||
onClick={kapat}
|
||||
className="font-semibold text-primary underline"
|
||||
>
|
||||
Ayrıntılar ve ölçümü kapatma
|
||||
</Link>
|
||||
</p>
|
||||
<Button
|
||||
type="button"
|
||||
variant="outline"
|
||||
size="lg"
|
||||
onClick={kapat}
|
||||
className="w-full cursor-pointer px-6 transition-[background-color,border-color,color,transform] duration-150 hover:border-orange-500 hover:bg-orange-50/60 hover:text-orange-500 active:scale-[0.97] sm:w-auto"
|
||||
>
|
||||
Tamam
|
||||
</Button>
|
||||
</section>
|
||||
</div>
|
||||
</ViewportPortal>
|
||||
);
|
||||
}
|
||||
72
src/components/olcum-tercihi.tsx
Normal file
72
src/components/olcum-tercihi.tsx
Normal file
@@ -0,0 +1,72 @@
|
||||
"use client";
|
||||
|
||||
// Kullanım ölçümünü (Rybbit) bu tarayıcıda kapatan/açan anahtar — KVKK
|
||||
// md. 11 itiraz hakkının arayüzü, /cerez-politikasi sayfasında durur.
|
||||
//
|
||||
// Rybbit betiği yüklenirken localStorage'da `disable-rybbit` anahtarını
|
||||
// görürse hiçbir şey göndermez (betiğin kendi vazgeçme kapısı). Betik
|
||||
// yüklendikten sonra durdurulamadığı için tercih değişince sayfa yenilenir.
|
||||
|
||||
import { useEffect, useState } from "react";
|
||||
import { Button } from "@/components/ui/button";
|
||||
|
||||
const KAPALI_KEY = "disable-rybbit";
|
||||
// Rybbit'in bu tarayıcıya yazdığı kimlikler; ölçüm kapanınca silinir.
|
||||
const RYBBIT_KIMLIK_KEYLERI = ["rybbit-user-id", "rybbit-visitor-id"];
|
||||
|
||||
export function OlcumTercihi() {
|
||||
// null = henüz okunmadı (SSR/ilk boya)
|
||||
const [kapali, setKapali] = useState<boolean | null>(null);
|
||||
const [hata, setHata] = useState(false);
|
||||
|
||||
useEffect(() => {
|
||||
try {
|
||||
// eslint-disable-next-line react-hooks/set-state-in-effect
|
||||
setKapali(localStorage.getItem(KAPALI_KEY) !== null);
|
||||
} catch {
|
||||
setKapali(false);
|
||||
}
|
||||
}, []);
|
||||
|
||||
function degistir() {
|
||||
try {
|
||||
if (kapali) {
|
||||
localStorage.removeItem(KAPALI_KEY);
|
||||
} else {
|
||||
localStorage.setItem(KAPALI_KEY, "1");
|
||||
for (const k of RYBBIT_KIMLIK_KEYLERI) localStorage.removeItem(k);
|
||||
}
|
||||
} catch {
|
||||
setHata(true);
|
||||
return;
|
||||
}
|
||||
window.location.reload();
|
||||
}
|
||||
|
||||
return (
|
||||
<div className="mt-3 flex flex-wrap items-center gap-3 rounded-2xl border border-slate-200 bg-card p-4 sm:flex-nowrap sm:gap-4">
|
||||
<div className="min-w-0 flex-1">
|
||||
<p className="font-heading text-base font-bold text-slate-900">
|
||||
{kapali ? "Ölçüm bu tarayıcıda kapalı" : "Ölçüm bu tarayıcıda açık"}
|
||||
</p>
|
||||
<p className="text-sm leading-snug text-slate-500" role="status">
|
||||
{hata
|
||||
? "Tarayıcın bu tercihi saklamaya izin vermiyor."
|
||||
: kapali
|
||||
? "Ziyaretlerin sayılmıyor. Site aynı şekilde çalışır."
|
||||
: "Kapatırsan ziyaretlerin sayılmaz; site aynı şekilde çalışır."}
|
||||
</p>
|
||||
</div>
|
||||
<Button
|
||||
type="button"
|
||||
variant="outline"
|
||||
size="lg"
|
||||
disabled={kapali === null}
|
||||
onClick={degistir}
|
||||
className="w-full cursor-pointer px-6 transition-[background-color,border-color,color,transform] duration-150 hover:border-orange-500 hover:bg-orange-50/60 hover:text-orange-500 active:scale-[0.97] sm:w-auto"
|
||||
>
|
||||
{kapali ? "Ölçümü aç" : "Ölçümü kapat"}
|
||||
</Button>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
@@ -180,6 +180,12 @@ export function SiteFooter() {
|
||||
>
|
||||
Gizlilik & KVKK
|
||||
</Link>
|
||||
<Link
|
||||
href="/cerez-politikasi"
|
||||
className="hover:text-slate-700 hover:underline"
|
||||
>
|
||||
Çerez politikası
|
||||
</Link>
|
||||
<Link
|
||||
href="/kosullar"
|
||||
className="hover:text-slate-700 hover:underline"
|
||||
|
||||
Reference in New Issue
Block a user