Integrate Rybbit analytics and enhance user tracking features
All checks were successful
Deploy / deploy (push) Successful in 16m7s
All checks were successful
Deploy / deploy (push) Successful in 16m7s
- Added Rybbit analytics configuration in .mcp.json for improved data collection. - Updated layout.tsx to conditionally load the Rybbit analytics script in production. - Enhanced user interaction tracking in various components, including GirisForm, RevizyonKutusu, and SatinAlForm, by logging specific events. - Updated privacy policy page to reflect new data handling practices and added a section on service providers and data transfer. - Improved user navigation and experience by integrating Rybbit's live visitor widget in the site footer.
This commit is contained in:
91
src/lib/analitik.ts
Normal file
91
src/lib/analitik.ts
Normal file
@@ -0,0 +1,91 @@
|
||||
/**
|
||||
* Rybbit analitiği için ince sarmalayıcı.
|
||||
*
|
||||
* Script yalnızca prod build'de yükleniyor (bkz. app/layout.tsx) ve reklam
|
||||
* engelleyiciler tarafından bloklanabiliyor; bu yüzden buradaki her çağrı
|
||||
* `window.rybbit` yoksa sessizce hiçbir şey yapmaz — çağıran taraf asla
|
||||
* varlık kontrolü yapmak zorunda kalmasın.
|
||||
*
|
||||
* KURAL: Öğrencinin ham başarı sıralaması analitiğe GÖNDERİLMEZ. Sıralama
|
||||
* her zaman `siraKovasi()` ile bantlanır.
|
||||
*/
|
||||
|
||||
/** Ölçtüğümüz huni olayları. Yeni olay eklerken bu birliği genişlet. */
|
||||
export type OlayAdi =
|
||||
| "sira_girildi"
|
||||
| "sihirbaz_adim"
|
||||
| "sihirbaz_tamamlandi"
|
||||
| "giris_denendi"
|
||||
| "liste_olusturuldu"
|
||||
| "liste_revize"
|
||||
| "program_eklendi"
|
||||
| "danisman_sorusu"
|
||||
| "katalog_arama"
|
||||
| "odeme_baslatildi";
|
||||
|
||||
type Ozellikler = Record<string, string | number>;
|
||||
|
||||
interface RybbitApi {
|
||||
event: (ad: string, ozellikler?: Ozellikler) => void;
|
||||
pageview: () => void;
|
||||
identify: (kullaniciId: string, traits?: Record<string, string>) => void;
|
||||
setTraits: (traits: Record<string, string>) => void;
|
||||
clearUserId: () => void;
|
||||
getUserId: () => string | null;
|
||||
}
|
||||
|
||||
declare global {
|
||||
interface Window {
|
||||
rybbit?: RybbitApi;
|
||||
}
|
||||
}
|
||||
|
||||
/** Özel olay gönderir. Script yoksa no-op. */
|
||||
export function olay(ad: OlayAdi, ozellikler?: Ozellikler): void {
|
||||
if (typeof window === "undefined") return;
|
||||
try {
|
||||
window.rybbit?.event(ad, ozellikler);
|
||||
} catch {
|
||||
// Analitik hiçbir koşulda kullanıcı akışını bozmaz
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Ham sıralamayı analitik için bantlar. Panelde "hangi sıralama bandı
|
||||
* dönüşüyor" sorusunu yanıtlar ama tekil öğrenciyi işaret etmez.
|
||||
*/
|
||||
export function siraKovasi(sira: number): string {
|
||||
if (sira <= 10_000) return "0-10 bin";
|
||||
if (sira <= 50_000) return "10-50 bin";
|
||||
if (sira <= 100_000) return "50-100 bin";
|
||||
if (sira <= 250_000) return "100-250 bin";
|
||||
if (sira <= 500_000) return "250-500 bin";
|
||||
return "500 bin+";
|
||||
}
|
||||
|
||||
/**
|
||||
* Giriş yapan kullanıcıyı eşler. İlk çağrıda o cihazdaki önceki anonim
|
||||
* olaylar geriye dönük olarak bu kullanıcıya bağlanır (sihirbazı doldurup
|
||||
* sonra giriş yapan öğrencinin yolculuğu tek profilde birleşsin diye).
|
||||
*/
|
||||
export function kullaniciTanit(
|
||||
kullaniciId: string,
|
||||
traits?: Record<string, string>,
|
||||
): void {
|
||||
if (typeof window === "undefined") return;
|
||||
try {
|
||||
window.rybbit?.identify(kullaniciId, traits);
|
||||
} catch {
|
||||
// yut
|
||||
}
|
||||
}
|
||||
|
||||
/** Çıkışta kimliği temizler. */
|
||||
export function kullaniciTemizle(): void {
|
||||
if (typeof window === "undefined") return;
|
||||
try {
|
||||
window.rybbit?.clearUserId();
|
||||
} catch {
|
||||
// yut
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user