"use client"; import Link from "next/link"; import { usePathname } from "next/navigation"; import { Button } from "@/components/ui/button"; /** * Navbar'ın "Giriş yap" butonu: giriş bitince kullanıcıyı **bulunduğu * sayfaya** geri döndürür (`/giris?callback=`). Callback verilmezse * `giris-karti.tsx` "/"'a düşürüyordu — rehber okuyan ziyaretçi girişten * sonra ana sayfada uyanıyordu. * * Callback neden sabit bir hedef (ör. `/listem`) değil: buton her sayfada * duruyor, sabit hedef bağlam kaybı olurdu; `/listem?uret=1` yazılsaydı * girişten dönüşte üretim kendiliğinden başlar ve kullanıcının ayrı onayı * olmadan 3 kredi yakardı. * * Callback yalnız pathname taşır: sorgu dizesini okuyan kanca tüm navbar'ı * Suspense zorunluluğuna sokardı. `usePathname` bu ağaçta zaten var * (`header-gate`), `UserNav` da site-header'da Suspense içinde render * ediliyor — cacheComponents açıkken dinamik parametreli rotalarda gereken * sınır hazır (next/dist/docs/.../use-pathname.md). */ /** * better-auth (1.6.23) callback'i kendi göreli-yol kalkanından geçiriyor: * `^\/(?!\/|\\|%2f|%5c)[\w\-.+/@]*(?:\?…)?$`. `\w` ASCII olduğu için * `/rehber/ösym` ya da yüzde-kodlanmış `/bolum/t%C4%B1p` gibi yollar * **403 INVALID_CALLBACK_URL** ile reddediliyor ve kullanıcı o sayfadan hiç * giriş yapamıyor (main'de callback hep "/" olduğu için bu yol yoktu). * Bu yüzden callback'i ancak auth katmanının da kabul edeceği yollarda * takıyoruz; gerisinde sade /giris'e düşüyoruz — bağlam kaybı, kırık giriş * akışına yeğdir. Kalkan daraltılırsa (tek yer) buradaki de gevşetilebilir. */ const AUTH_GUVENLI_YOL = /^\/(?!\/|\\)[\w\-./+@]*$/; export function GirisLinki() { const pathname = usePathname(); // /giris kendine callback veremez (döngü); pathname yoksa sade hedef. const href = pathname && !pathname.startsWith("/giris") && AUTH_GUVENLI_YOL.test(pathname) ? `/giris?callback=${encodeURIComponent(pathname)}` : "/giris"; return ( ); }