Migrates our analytics integration on Cloud from PostHog to Amplitude. This change updates the core AnalyticsHelper class to use the Amplitude SDK while maintaining the same tracking interface. Rest of all existing analytics calls throughout the codebase continue to work without modification. **Changes:** - Replace PostHog analytics with Amplitude SDK - Rename ANALYTICS_TOKEN to CLOUD_ANALYTICS_TOKEN for clarity - Fix bug in page() method signature that was causing malformed payloads
99 lines
2.4 KiB
JavaScript
99 lines
2.4 KiB
JavaScript
import * as amplitude from '@amplitude/analytics-browser';
|
|
|
|
/**
|
|
* AnalyticsHelper class to initialize and track user analytics
|
|
* @class AnalyticsHelper
|
|
*/
|
|
export class AnalyticsHelper {
|
|
/**
|
|
* @constructor
|
|
* @param {Object} [options={}] - options for analytics
|
|
* @param {string} [options.token] - analytics token
|
|
*/
|
|
constructor({ token: analyticsToken } = {}) {
|
|
this.analyticsToken = analyticsToken;
|
|
this.analytics = null;
|
|
this.user = {};
|
|
}
|
|
|
|
/**
|
|
* Initialize analytics
|
|
* @function
|
|
* @async
|
|
*/
|
|
async init() {
|
|
if (!this.analyticsToken) {
|
|
return;
|
|
}
|
|
|
|
amplitude.init(this.analyticsToken, {
|
|
defaultTracking: false,
|
|
});
|
|
this.analytics = amplitude;
|
|
}
|
|
|
|
/**
|
|
* Identify the user
|
|
* @function
|
|
* @param {Object} user - User object
|
|
*/
|
|
identify(user) {
|
|
if (!this.analytics || !user) {
|
|
return;
|
|
}
|
|
|
|
this.user = user;
|
|
this.analytics.setUserId(`user-${this.user.id.toString()}`);
|
|
|
|
const identifyEvent = new amplitude.Identify();
|
|
identifyEvent.set('email', this.user.email);
|
|
identifyEvent.set('name', this.user.name);
|
|
identifyEvent.set('avatar', this.user.avatar_url);
|
|
this.analytics.identify(identifyEvent);
|
|
|
|
const { accounts, account_id: accountId } = this.user;
|
|
const [currentAccount] = accounts.filter(
|
|
account => account.id === accountId
|
|
);
|
|
if (currentAccount) {
|
|
const groupId = `account-${currentAccount.id.toString()}`;
|
|
|
|
this.analytics.setGroup('company', groupId);
|
|
|
|
const groupIdentify = new amplitude.Identify();
|
|
groupIdentify.set('name', currentAccount.name);
|
|
this.analytics.groupIdentify('company', groupId, groupIdentify);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Track any event
|
|
* @function
|
|
* @param {string} eventName - event name
|
|
* @param {Object} [properties={}] - event properties
|
|
*/
|
|
track(eventName, properties = {}) {
|
|
if (!this.analytics) {
|
|
return;
|
|
}
|
|
this.analytics.track(eventName, properties);
|
|
}
|
|
|
|
/**
|
|
* Track the page views
|
|
* @function
|
|
* @param {string} pageName - Page name
|
|
* @param {Object} [properties={}] - Page view properties
|
|
*/
|
|
page(pageName, properties = {}) {
|
|
if (!this.analytics) {
|
|
return;
|
|
}
|
|
|
|
this.analytics.track('$pageview', { pageName, ...properties });
|
|
}
|
|
}
|
|
|
|
// This object is shared across, the init is called in app/javascript/entrypoints/dashboard.js
|
|
export default new AnalyticsHelper(window.analyticsConfig);
|