mirror of
https://github.com/lingble/chatwoot.git
synced 2025-11-01 03:27:52 +00:00
Fixes https://chatwoot-p3.sentry.io/share/issue/aa6a3c0accb345e984ed80eaddc3efd5/ In the case where the user is redirected to the page from a redirect like google login, the analytics helper breaks. This PR fixes it by checking if the user is present. This does not break the user email tracking since the user is redirected anyway and the `AnalyticsHelper` is reinitialised
98 lines
2.1 KiB
JavaScript
98 lines
2.1 KiB
JavaScript
import { AnalyticsBrowser } from '@june-so/analytics-next';
|
|
|
|
/**
|
|
* 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;
|
|
}
|
|
|
|
let [analytics] = await AnalyticsBrowser.load({
|
|
writeKey: this.analyticsToken,
|
|
});
|
|
this.analytics = analytics;
|
|
}
|
|
|
|
/**
|
|
* Identify the user
|
|
* @function
|
|
* @param {Object} user - User object
|
|
*/
|
|
identify(user) {
|
|
if (!this.analytics || !user) {
|
|
return;
|
|
}
|
|
|
|
this.user = user;
|
|
this.analytics.identify(this.user.email, {
|
|
userId: this.user.id,
|
|
email: this.user.email,
|
|
name: this.user.name,
|
|
avatar: this.user.avatar_url,
|
|
});
|
|
|
|
const { accounts, account_id: accountId } = this.user;
|
|
const [currentAccount] = accounts.filter(
|
|
account => account.id === accountId
|
|
);
|
|
if (currentAccount) {
|
|
this.analytics.group(currentAccount.id, this.user.id, {
|
|
name: currentAccount.name,
|
|
});
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Track any event
|
|
* @function
|
|
* @param {string} eventName - event name
|
|
* @param {Object} [properties={}] - event properties
|
|
*/
|
|
track(eventName, properties = {}) {
|
|
if (!this.analytics) {
|
|
return;
|
|
}
|
|
|
|
this.analytics.track({
|
|
userId: this.user.id,
|
|
event: eventName,
|
|
properties,
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Track the page views
|
|
* @function
|
|
* @param {Object} params - Page view properties
|
|
*/
|
|
page(params) {
|
|
if (!this.analytics) {
|
|
return;
|
|
}
|
|
|
|
this.analytics.page(params);
|
|
}
|
|
}
|
|
|
|
// This object is shared across, the init is called in app/javascript/packs/application.js
|
|
export default new AnalyticsHelper(window.analyticsConfig);
|