UNPKG

@atlaskit/editor-plugin-ncs-step-metrics

Version:

NcsStepMetrics plugin for @atlaskit/editor-core

100 lines (93 loc) 3.89 kB
import { NCS_STORAGE } from '@atlaskit/editor-common/ncs-step-metrics'; import { StorageClient } from '@atlaskit/frontend-utilities'; import { getPayload } from './analytics'; import { calculateP90Value } from './calculateP90Value'; const storageClient = new StorageClient(NCS_STORAGE.NCS_STORAGE_CLIENT_KEY); /** * This function transforms the NCS session step metrics * into a format suitable for analytics events. * @param metrics - The NCS session step metrics to be transformed. */ const transformSessionStepMetrics = metrics => { return { ncsSessionId: metrics.ncsSessionId, totalStepSize: metrics.totalStepSize, numberOfSteps: metrics.numberOfSteps, maxStepSize: metrics.maxStepSize, p90StepSize: calculateP90Value(metrics.stepSizeSumForP90) }; }; /** * Gets the current NCS session step metrics from storage. * @param sessionId - The session ID for which to retrieve the metrics. */ export const getNcsSessionStepMetrics = sessionId => { if (!sessionId) { return; } const ncsSessionStepMetrics = JSON.parse(storageClient.getItem(NCS_STORAGE.NCS_SESSION_STEP_METRICS) || '{}'); const current = ncsSessionStepMetrics[sessionId]; if (current) { return transformSessionStepMetrics(current); } return undefined; }; /** * Clears the NCS session step metrics and the active session from storage. * @param sessionId - The session ID for which to clear the metrics. */ export const clearNcsSessionStepMetrics = sessionId => { if (!sessionId) { return; } // Clear the current NCS session step metrics from storage const ncsSessionStepMetrics = JSON.parse(storageClient.getItem(NCS_STORAGE.NCS_SESSION_STEP_METRICS) || '{}'); if (ncsSessionStepMetrics[sessionId]) { delete ncsSessionStepMetrics[sessionId]; if (Object.keys(ncsSessionStepMetrics).length === 0) { storageClient.removeItem(NCS_STORAGE.NCS_SESSION_STEP_METRICS); } else { storageClient.setItemWithExpiry(NCS_STORAGE.NCS_SESSION_STEP_METRICS, JSON.stringify(ncsSessionStepMetrics)); } } // Clear the active session from storage clearNcsActiveSession(sessionId); }; /** * Clears the active NCS session from storage. * @param sessionId - The session ID for which to clear the active session. */ export const clearNcsActiveSession = sessionId => { if (!sessionId) { return; } const activeSessions = JSON.parse(storageClient.getItem(NCS_STORAGE.NCS_ACTIVE_SESSIONS) || '{}'); if (activeSessions[sessionId]) { delete activeSessions[sessionId]; if (Object.keys(activeSessions).length === 0) { storageClient.removeItem(NCS_STORAGE.NCS_ACTIVE_SESSIONS); } else { storageClient.setItemWithExpiry(NCS_STORAGE.NCS_ACTIVE_SESSIONS, JSON.stringify(activeSessions)); } } }; /** * This function checks for any unfinished NCS sessions * If it finds any, and the session is not active, it sends the analytics event * @param api - The public plugin API to access the analytics plugin. */ export const checkForUnfinishedNcsSessions = api => { const ncsSessionStepMetrics = JSON.parse(storageClient.getItem(NCS_STORAGE.NCS_SESSION_STEP_METRICS) || '{}'); const activeNcsSessions = JSON.parse(storageClient.getItem(NCS_STORAGE.NCS_ACTIVE_SESSIONS) || '{}'); Object.keys(ncsSessionStepMetrics).forEach(id => { if (!activeNcsSessions[id]) { const metrics = transformSessionStepMetrics(ncsSessionStepMetrics[id]); if (metrics) { var _api$analytics, _api$analytics$action; const payload = getPayload(metrics); api === null || api === void 0 ? void 0 : (_api$analytics = api.analytics) === null || _api$analytics === void 0 ? void 0 : (_api$analytics$action = _api$analytics.actions) === null || _api$analytics$action === void 0 ? void 0 : _api$analytics$action.fireAnalyticsEvent(payload); clearNcsSessionStepMetrics(id); } } }); };