1/* PRD §4: pengukuran memakai analitik tanpa cookie dan tanpa data pribadi,
2 hanya hitungan peristiwa. Daftar ini tertutup dan dipakai klien maupun
3 server (src/lib/analytics.ts dan rute /api/events), supaya tidak ada nama
4 bebas yang bisa masuk basis data.
5
6 Pemetaannya ke ukuran PRD §4:
7 - "Alur dasar selesai tanpa bantuan": camera_granted -> download_png.
8 - "Gesture Snap benar-benar dipakai": photo_taken_gesture dibanding
9 photo_taken_gesture + photo_taken_button.
10 - "Estafet tuntas": relay_completed dibanding relay_created.
11 - "Strip Hidup menambah nilai": live_enabled dibanding customize_reached.
12 - "Cepat dipakai": bucket first_photo_* dari penanda waktu sesi.
13
14 Kueri SQL untuk lima rasio itu ada di docs/DECISIONS.md (M9). */
15
16export const EVENT_NAMES = [
17 "welcome_loaded",
18 "camera_granted",
19 "camera_denied",
20 "first_photo_under_15s",
21 "first_photo_15_30s",
22 "first_photo_30_60s",
23 "first_photo_over_60s",
24 "photo_taken_button",
25 "photo_taken_gesture",
26 "customize_reached",
27 "live_enabled",
28 "strip_link_created",
29 "relay_created",
30 "relay_completed",
31 "download_png",
32 "print_4r",
33] as const
34
35export type AnalyticsEvent = (typeof EVENT_NAMES)[number]
36
37/** Batas satu permintaan beacon; antrean klien mengirim jauh di bawah ini. */
38export const EVENT_BATCH_MAX = 20
39
40/** Antrean klien dikirim begitu mencapai jumlah ini, selain saat halaman
41 * disembunyikan atau ditinggalkan. */
42export const EVENT_BATCH_SIZE = 8
43
44/** Penanda waktu awal sesi (dimulai saat Welcome dimuat). Namanya berawalan
45 * snapme supaya tidak bertabrakan dengan kunci lain di sessionStorage. */
46export const SESSION_START_KEY = "snapme:t0"
47
48/** Bucket durasi Welcome sampai foto pertama (PRD §4: median di bawah 30
49 * detik). Ambangnya di sini, bukan di tempat pemanggil, supaya batas 15, 30,
50 * dan 60 detik hanya ditulis sekali. */
51export function firstPhotoBucket(ms: number): AnalyticsEvent {
52 if (ms < 15_000) {
53 return "first_photo_under_15s"
54 }
55 if (ms < 30_000) {
56 return "first_photo_15_30s"
57 }
58 if (ms < 60_000) {
59 return "first_photo_30_60s"
60 }
61 return "first_photo_over_60s"
62}
63