Files
kolaytercih/src/components/use-gorunum-olayi.ts
bilalgursen fa43392077 fix(analitik): görünüm hook'u callback ref + erken olay kuyruğu
useGorunumOlayi useRef + [ad, anahtarEki] deps'li effect kullanıyordu:
eleman ilk commit'te yoksa (kaydet-banner: mount sonrası açılır, portal
içinde) ya da sökülüp yeni düğümle geri geliyorsa (tadımlık satırı) gözlem
hiç kurulmuyordu → kaydet_banner_goruntulendi / tadimlik_goruntulendi = 0.
Hook artık callback ref döner; gözlem düğüm bağlanınca kurulur, sökülünce
React 19 ref temizliğiyle bırakılır. Çağıranlar yalnız ref={…} verdiği
için kullanım yerleri değişmedi.

olay(): Rybbit script'i afterInteractive; sert yüklemede mount anında
atılan olaylar window.rybbit henüz yokken sessizce düşüyordu. Artık en çok
20 olay, 500 ms aralıkla en çok 20 deneme (10 sn) kuyrukta bekler; script
gelmezse (reklam engelleyici, dev) kuyruk atılır.

olayBirKez(): hook'taki sessionStorage tekilleştirmesinin effect'ten
çağrılabilir hâli (anahtar biçimi aynı: kolaytercih.olay.<ad>[.<ek>]).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-21 04:47:24 +03:00

61 lines
2.3 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"use client";
import { useCallback, useEffect, useRef, type RefCallback } from "react";
import {
olayAnahtari,
olayBirKez,
type OlayAdi,
type Ozellikler,
} from "@/lib/analitik";
/**
* Bir elemanın viewport'a ilk girişinde analitik olayı atan ref hook'u.
* Gösterim olayları (hazir_panel_goruntulendi, kilit_goruntulendi vb.)
* oturum başına en fazla 1 kez sayılmalı; tekilleştirme sessionStorage
* anahtarıyla yapılır (bkz. olayBirKez). IntersectionObserver yoksa olay hiç
* atılmaz — "görüntülendi" ölçümünde görünürlüğü doğrulayamadığımız cihazı
* saymak veriyi şişirir.
*
* Callback ref döner (RefObject değil): gözlem effect'te değil, DOM düğümü
* bağlandığı anda kurulur. Eleman ilk commit'te yoksa (kaydet-banner: mount
* sonrası açılır, üstelik portal içinde) ya da sökülüp yeni bir düğümle geri
* geliyorsa (tadımlık satırı: tip uymayınca gizlenip fetch sonrası yeniden
* takılır) useRef + effect deseni gözlemi hiç kurmuyordu.
*/
export function useGorunumOlayi<T extends HTMLElement = HTMLElement>(
ad: OlayAdi,
ozellikler?: Ozellikler,
/** Aynı olayın farklı yüzeyleri için tekilleştirme eki ("satir", "kart"). */
anahtarEki?: string,
): RefCallback<T> {
// Özellikler her render sonrası tazelenir; callback ref yalnızca ad/anahtar
// değişiminde yeniden kurulur (deps'e obje koymamak için ref).
const ozelliklerRef = useRef(ozellikler);
useEffect(() => {
ozelliklerRef.current = ozellikler;
});
return useCallback(
(el: T | null) => {
if (!el || typeof IntersectionObserver === "undefined") return;
try {
if (window.sessionStorage.getItem(olayAnahtari(ad, anahtarEki))) return;
} catch {
// Storage engelliyse tekilleştirmeden vazgeç, olay yine atılabilir
}
const io = new IntersectionObserver((entries) => {
if (!entries.some((e) => e.isIntersecting)) return;
io.disconnect();
olayBirKez(ad, ozelliklerRef.current, anahtarEki);
});
io.observe(el);
// React 19 ref temizliği: düğüm sökülünce (ya da ad/anahtar değişince)
// gözlemci bırakılır; yeni düğüm bağlanınca callback baştan çalışır.
return () => io.disconnect();
},
[ad, anahtarEki],
);
}