Viewing File: /var/cpanel/customizations/ui-analytics/mixpanelSetup.js

/**
 * DEV NOTE: All the code in this file is moved to
 * ULC/ui/web-components/src/components/shared/cp-ui-analytics/mixpanel/mixpanel-utils.service.ts
 * BUT some parts of the code is retained to ensure the consent popup is able to enable/disable mixpanel analytics.
 * This file will removed as part of PHX-6(https://webpros.atlassian.net/browse/PHX-6).
 */

const mpUserSession = "mp_cp_user_session";
const mpResetSession = "mp_cp_reset_session";

/**
 * Enables analytics first time after login if user's consent is set to 'Allow' or 'on'
 * @param mixpanelConfig    An object that includes mixpanel specific data.
 */
var enableAnalyticsForFirstTime = function (mixpanelConfig) {
    // Store user logged in event when loaded the first time.
    if (!sessionStorage.getItem(mpUserSession)) {
        sessionStorage.setItem(mpUserSession, mixpanelConfig.loginUser);
    }
    // window["mixpanel"] is sent to make sure we are using the same mixpanel instance in both the places (here and web component.)
    _registerMixpanel(window["mixpanel"], mixpanelConfig.cpAnalyticsData);
}

/**
 * Registers Mixpanel for the workspace (cPanel, Webmail or WHM)
 * that calls this function.
 * Opts in analytics tracking.
 * Creates super properties and that can be accessed by all events.
 */
var _registerMixpanel = function (mixpanel, analyticsData) {
    if (Object.keys(analyticsData).length === 0){return;}

    // Call Mixpanel's opt-in method.
    if (!mixpanel.has_opted_in_tracking()) {
        // We don't want this to create an unnecessary event.
        mixpanel.opt_in_tracking({ "track": () => { } });
    }
    const tokenRegex = /\/cpsess\d+\//i;
    // Sanitize the url path.
    var path = _getUrlPath().replace( tokenRegex, '/' );
    var pageTitle = analyticsData.product_interface + '-' + (analyticsData.product_feature || path);

    // Register $current_url before the identify request to ensure it uses
    // the sanitized path in all requests.
    mixpanel.register({
        $current_url: path,
    });

    // Identify the user only if the UUID exists.
    if (analyticsData.UUID) {
        mixpanel.identify(analyticsData.UUID);
    } else if (!sessionStorage.getItem(mpResetSession)) {
        // When UUID doesn't exist, Mixpanel SDK uses the previous UUID
        // stored in the cookie. That may end up identifying the current user
        // with a previous user's login. To avoid such situation, we are clearing
        // old data and recreating the props for the current user IF UUID doesn't exist.
        mixpanel.reset();
        sessionStorage.setItem(mpResetSession, true);
    }

    // Identify the team user only if is_team_user is true and get roles
    if (analyticsData.is_team_user) {
        mixpanel.people.set({"team_user_roles" : analyticsData.team_user_roles});
    }

    // Register MixPanel. The properties set during registration are super properties.
    // These super properties are sent with all events tracked by Mixpanel.
    mixpanel.register({
        // analytics data
        ...analyticsData
    });

    mixpanel.set_group("company_id", analyticsData.company_id);

    mixpanel.people.set({
        "product_locale"                         : analyticsData.product_locale,
        "product_version"                        : analyticsData.product_version,
        "product_trial_status"                   : analyticsData.product_trial_status,
        "server_current_license_kind"            : analyticsData.server_current_license_kind,
        "server_main_ip"                         : analyticsData.server_main_ip,
        "server_operating_system"                : analyticsData.server_operating_system,
        "server_is_nat"                          : analyticsData.is_nat,
        "account_transferred_or_restored"        : analyticsData.TRANSFERRED_OR_RESTORED,
    });

    // Track Page view event.
    mixpanel.track(pageTitle, {});
}

/**
 * Opts out of analytics tracking for the
 * workspace (cPanel, Webmail or WHM)
 * from where this function is called.
 * Additionally, it also clears the super properties
 * that where set during the opt in phase.
 */
optOutOfAnalytics = function(){
    // window["mixpanel"] is explicitly set to make sure we are using the same mixpanel instance in both the places (here and web component.)
    var mxp = window["mixpanel"];
    if (mxp && mxp.has_opted_in_tracking()) {
        mxp.clear_opt_in_out_tracking();
        // Clear all the super properties before opting out.
        mxp.reset();
        mxp.opt_out_tracking();
    }
}

/**
 * Returns the sanitized path of the url.
 */
function _getUrlPath(){
    var path = window.location.pathname;
    if (path) {
        var wholepath = path.split('/');
        var custompath = wholepath.slice(2);
        path = '/' + custompath.join('/');
    }
    return path;
}
Back to Directory File Manager