Przebudowa - code review aplikaacji, podział na moduły.
This commit is contained in:
@@ -0,0 +1,93 @@
|
||||
import { endpoints } from "./config.js";
|
||||
import {
|
||||
getAnalyticsSessionId,
|
||||
getHashParam,
|
||||
getIsStaffPreview,
|
||||
getTableParam,
|
||||
setAnalyticsSessionId,
|
||||
} from "./state.js";
|
||||
|
||||
const analyticsSessionKey = "karczma_analytics_session_id";
|
||||
|
||||
function getOrCreateAnalyticsSessionId() {
|
||||
let existing = localStorage.getItem(analyticsSessionKey);
|
||||
if (existing) return existing;
|
||||
|
||||
let newId = "";
|
||||
if (window.crypto && crypto.randomUUID) {
|
||||
newId = crypto.randomUUID();
|
||||
} else {
|
||||
newId = `sess_${Date.now()}_${Math.random().toString(36).slice(2, 10)}`;
|
||||
}
|
||||
localStorage.setItem(analyticsSessionKey, newId);
|
||||
return newId;
|
||||
}
|
||||
|
||||
setAnalyticsSessionId(getOrCreateAnalyticsSessionId());
|
||||
|
||||
function detectDeviceType() {
|
||||
const ua = navigator.userAgent || "";
|
||||
if (/iPad|iPhone|iPod/.test(ua) || (navigator.platform === "MacIntel" && navigator.maxTouchPoints > 1)) return "ios";
|
||||
if (/Android/i.test(ua)) return "android";
|
||||
return "other";
|
||||
}
|
||||
|
||||
function detectBrowser() {
|
||||
const ua = navigator.userAgent || "";
|
||||
if (/Edg\//.test(ua)) return "edge";
|
||||
if (/OPR\//.test(ua)) return "opera";
|
||||
if (/Chrome\//.test(ua)) return "chrome";
|
||||
if (/Safari\//.test(ua)) return "safari";
|
||||
if (/Firefox\//.test(ua)) return "firefox";
|
||||
return "other";
|
||||
}
|
||||
|
||||
function deriveZoneFromTable(tableValue) {
|
||||
const raw = String(tableValue || "").trim().toLowerCase();
|
||||
if (!raw) return null;
|
||||
|
||||
if (raw.startsWith("t") || raw.includes("taras")) return "taras";
|
||||
if (raw.startsWith("k") || raw.includes("karczma")) return "karczma";
|
||||
return null;
|
||||
}
|
||||
|
||||
export function trackEvent(eventName, payload = {}) {
|
||||
if (getIsStaffPreview()) {
|
||||
return;
|
||||
}
|
||||
|
||||
const tableParam = getTableParam();
|
||||
const hashParam = getHashParam();
|
||||
|
||||
const body = {
|
||||
eventName,
|
||||
sessionId: getAnalyticsSessionId(),
|
||||
tableId: tableParam || null,
|
||||
zone: deriveZoneFromTable(tableParam),
|
||||
qrHash: hashParam || null,
|
||||
deviceType: detectDeviceType(),
|
||||
browser: detectBrowser(),
|
||||
payload
|
||||
};
|
||||
|
||||
const bodyString = JSON.stringify(body);
|
||||
|
||||
try {
|
||||
if (navigator.sendBeacon) {
|
||||
const blob = new Blob([bodyString], { type: "application/json" });
|
||||
navigator.sendBeacon(endpoints.analytics, blob);
|
||||
return;
|
||||
}
|
||||
} catch {
|
||||
// fallback to fetch below
|
||||
}
|
||||
|
||||
fetch(endpoints.analytics, {
|
||||
method: "POST",
|
||||
headers: { "Content-Type": "application/json" },
|
||||
body: bodyString,
|
||||
keepalive: true
|
||||
}).catch(() => {
|
||||
// best effort - ignore analytics errors
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user