feat(olcum): /listem?uret=1 yollarına kaynak parametresi

Üretim denemesinin hangi yüzeyden başladığı ölçülebilsin diye dört yol
`&kaynak=` taşır: sihirbazın tamamlanması ve girişsiz callback'i
(sihirbaz), giriş dönüşündeki otomatik yönlendirme (giris_donusu), hazır
seçimler panelinin giriş CTA'sı (hazir_cta) ve paketi aktif kullanıcının
kartı (odeme_sonrasi).

Sabit href yerine listemUretHref(kaynak): `uret=1` her zaman ilk parametre
kalmalı, çünkü giris-karti.tsx:31 funnel metnini
callbackURL.startsWith("/listem?uret=1") ile seçiyor.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
bilalgursen
2026-09-22 01:18:24 +03:00
parent f60fbd135d
commit e6fbc62fe9
2 changed files with 15 additions and 6 deletions

View File

@@ -154,7 +154,7 @@ async function PaketCta() {
{/* ?uret=1: rapor varsa /listem raporu gösterir (bayrak yok
sayılır), yoksa bekleyen seçimlerle üretim başlar; seçim
de yoksa boş durum sihirbaza yönlendirir. */}
<Link href="/listem?uret=1" className="underline">
<Link href="/listem?uret=1&kaynak=odeme_sonrasi" className="underline">
listeni oluştur
</Link>
</div>

View File

@@ -17,7 +17,14 @@ import { SihirbazModal } from "./sihirbaz-modal";
// Üretim /listem'de koşar (bkz. listem/liste-uretici.tsx); sihirbaz
// tamamlanınca seçimler storage'a yazılıp kullanıcı buraya yönlendirilir.
const LISTEM_URET_HREF = "/listem?uret=1";
// `kaynak` denemenin hangi yüzeyden başladığını ölçer (bkz.
// rapor/components/uretim-basladi-olayi.tsx — izinli değerler orada).
// `uret=1` HER ZAMAN ilk parametre kalmalı: giris-karti.tsx:31 funnel
// metnini `callbackURL.startsWith("/listem?uret=1")` ile seçiyor, sıra
// bozulursa girişteki "Seçimlerin hazır" metni kaybolur.
function listemUretHref(kaynak: string) {
return `/listem?uret=1&kaynak=${kaynak}`;
}
// SSR'da false, client'ta true — storage'a ancak mount sonrası dokunuruz
const bosAbone = () => () => {};
@@ -182,10 +189,12 @@ export function SihirbazBolumu({
await modalCikisiniOynat();
setElleAcik(false);
if (!girisliMi) {
router.push(`/giris?callback=${encodeURIComponent(LISTEM_URET_HREF)}`);
router.push(
`/giris?callback=${encodeURIComponent(listemUretHref("sihirbaz"))}`,
);
return;
}
router.push(LISTEM_URET_HREF);
router.push(listemUretHref("sihirbaz"));
}
/**
@@ -213,7 +222,7 @@ export function SihirbazBolumu({
if (otomatikGonder && !otomatikBasladi.current) {
otomatikBasladi.current = true;
// replace: geri tuşu bu sayfaya dönünce tekrar /listem'e sekmesin
router.replace(LISTEM_URET_HREF);
router.replace(listemUretHref("giris_donusu"));
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [otomatikGonder]);
@@ -242,7 +251,7 @@ export function SihirbazBolumu({
// kaydedilmesi olarak sunulur. Girişten dönüşte üretim /listem'de başlar.
// Sinyal URL'den (?hazir=1) gelir ki SSR'da doğru panel render edilsin.
const girisBekliyor = Boolean(!girisliMi && secimlerHazir && !raporVar);
const girisUrl = `/giris?callback=${encodeURIComponent(LISTEM_URET_HREF)}`;
const girisUrl = `/giris?callback=${encodeURIComponent(listemUretHref("hazir_cta"))}`;
// Kapı 1 ölçümü: panel yalnızca girisBekliyor dalında render edilir; ref
// başka dalda bağlanmadığından observer da yalnızca o durumda kurulur.
const hazirPanelRef = useGorunumOlayi<HTMLElement>("hazir_panel_goruntulendi");