From 39a0e50745e2653231cd717e33c7d97dce21ecef Mon Sep 17 00:00:00 2001 From: stvn Date: Tue, 3 Mar 2020 12:49:18 -0500 Subject: [PATCH] Add logging events for sequence navigation to mirror existing behavior in `edx-platform` [2][3][4]. This adds support for the following events: - `edx.ui.lms.sequence.next_selected` - `edx.ui.lms.sequence.previous_selected` - `edx.ui.lms.sequence.tab_selected` ** Outstanding Events - `edx.ui.lms.outline.*` - `edx.ui.lms.link_clicked` ** References - [1] https://openedx.atlassian.net/browse/TNL-7066 - [2] https://edx.readthedocs.io/projects/devdata/en/latest/internal_data_formats/tracking_logs/student_event_types.html#course-navigation-events - [3] https://github.com/edx/edx-platform/blob/master/common/lib/xmodule/xmodule/js/src/sequence/display.js#L315-321 - [4] https://github.com/edx/edx-platform/blob/master/common/lib/xmodule/xmodule/js/src/sequence/display.js#L373-378 --- src/courseware/sequence/Sequence.jsx | 43 ++++++++++++++++++++++++---- 1 file changed, 38 insertions(+), 5 deletions(-) diff --git a/src/courseware/sequence/Sequence.jsx b/src/courseware/sequence/Sequence.jsx index 71bfcf5e..73f3ab46 100644 --- a/src/courseware/sequence/Sequence.jsx +++ b/src/courseware/sequence/Sequence.jsx @@ -3,6 +3,7 @@ import React, { useEffect, useContext, Suspense, useState, } from 'react'; import PropTypes from 'prop-types'; +import { sendTrackEvent } from '@edx/frontend-platform/analytics'; import { injectIntl, intlShape, FormattedMessage } from '@edx/frontend-platform/i18n'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { faChevronLeft, faChevronRight } from '@fortawesome/free-solid-svg-icons'; @@ -54,6 +55,23 @@ function Sequence({ onNavigateUnit(unitId); }; + const logEvent = (eventName, widgetPlacement, targetUnitId) => { + // Note: tabs are tracked with a 1-indexed position + // as opposed to a 0-index used throughout this MFE + const currentIndex = unitIds.indexOf(activeUnitId); + const payload = { + current_tab: currentIndex + 1, + id: activeUnitId, + tab_count: unitIds.length, + widget_placement: widgetPlacement, + }; + if (targetUnitId) { + const targetIndex = unitIds.indexOf(targetUnitId); + payload.target_tab = targetIndex + 1; + } + sendTrackEvent(eventName, payload); + }; + const { add, remove } = useContext(UserMessagesContext); useEffect(() => { let id = null; @@ -85,9 +103,18 @@ function Sequence({ <> { + logEvent('edx.ui.lms.sequence.next_selected', 'top'); + handleNext(); + }} + onNavigate={(unitId) => { + logEvent('edx.ui.lms.sequence.tab_selected', 'top', unitId); + handleNavigate(unitId); + }} + onPrevious={() => { + logEvent('edx.ui.lms.sequence.previous_selected', 'top'); + handlePrevious(); + }} unitIds={unitIds} activeUnitId={activeUnitId} isLocked={isGated} @@ -122,7 +149,10 @@ function Sequence({