Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
51 changes: 35 additions & 16 deletions src/modules/analytics.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ import type { AuthModule } from "./auth.types";
import { generateUuid } from "../utils/common";

export const USER_HEARTBEAT_EVENT_NAME = "__user_heartbeat_event__";
export const ANALYTICS_CONFIG_WINDOW_KEY = "base44_analytics_config";
export const ANALYTICS_CONFIG_URL_PARAM_KEY = "analytics-disable";
export const ANALYTICS_SESSION_ID_LOCAL_STORAGE_KEY =
"base44_analytics_session_id";

Expand All @@ -40,7 +40,7 @@ const analyticsSharedState = getSharedInstance(
sessionContext: null as SessionContext | null,
config: {
...defaultConfiguration,
...getAnalyticsModuleOptionsFromWindow(),
...getAnalyticsConfigFromUrlParams(),
} as Required<AnalyticsModuleOptions>,
})
);
Expand Down Expand Up @@ -81,23 +81,27 @@ export const createAnalyticsModule = ({
} as AnalyticsApiBatchRequest);
};

const flush = async (eventsData: TrackEventData[]) => {
const sessionContext_ = await getSessionContext(userAuthModule);
const events = eventsData.map(
transformEventDataToApiRequestData(sessionContext_)
);
const beaconRequest = async (events: AnalyticsApiRequestData[]) => {
const beaconPayload = JSON.stringify({ events });
try {
if (
const blob = new Blob([beaconPayload], { type: "application/json" });
return (
typeof navigator === "undefined" ||
beaconPayload.length > 60000 ||
!navigator.sendBeacon(trackBatchUrl, beaconPayload)
) {
// beacon didn't work, fallback to axios
await batchRequestFallback(events);
}
!navigator.sendBeacon(trackBatchUrl, blob)
);
} catch {
// TODO: think about retries if needed
return false;
}
};

const flush = async (eventsData: TrackEventData[]) => {
const sessionContext_ = await getSessionContext(userAuthModule);
const events = eventsData.map(
transformEventDataToApiRequestData(sessionContext_)
);
if (!(await beaconRequest(events))) {
return batchRequestFallback(events);
}
};

Expand Down Expand Up @@ -256,11 +260,26 @@ async function getSessionContext(
return analyticsSharedState.sessionContext;
}

export function getAnalyticsModuleOptionsFromWindow():
export function getAnalyticsConfigFromUrlParams():
| AnalyticsModuleOptions
| undefined {
if (typeof window === "undefined") return undefined;
return (window as any)[ANALYTICS_CONFIG_WINDOW_KEY];
const urlParams = new URLSearchParams(window.location.search);
const analyticsDisable = urlParams.get(ANALYTICS_CONFIG_URL_PARAM_KEY);

// if the url param is not set, return undefined //
if (analyticsDisable == null || !analyticsDisable.length) return undefined;

// remove the url param from the url //
const newUrlParams = new URLSearchParams(window.location.search);
newUrlParams.delete(ANALYTICS_CONFIG_URL_PARAM_KEY);
const newUrl =
window.location.pathname +
(newUrlParams.toString() ? "?" + newUrlParams.toString() : "");
window.history.replaceState({}, "", newUrl);

// return the config object //
return analyticsDisable === "true" ? { enabled: false } : undefined;
}

export function getAnalyticsSessionId(): string {
Expand Down