@edx/frontend-plugin-advertisements 2.21.0 → 2.22.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
exports.default = void 0;
|
|
7
7
|
var _react = _interopRequireWildcard(require("react"));
|
|
8
8
|
var _propTypes = _interopRequireDefault(require("prop-types"));
|
|
9
|
+
var _reactSdk = require("@optimizely/react-sdk");
|
|
9
10
|
var _analytics = require("@edx/frontend-platform/analytics");
|
|
10
11
|
var _auth = require("@edx/frontend-platform/auth");
|
|
11
12
|
var _i18n = require("@edx/frontend-platform/i18n");
|
|
@@ -23,12 +24,65 @@ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t =
|
|
|
23
24
|
function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
|
|
24
25
|
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
|
|
25
26
|
function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } /* eslint import/no-unresolved: 0 */
|
|
26
|
-
const AUDIT_EXPIRY_LOG_VERSION = 'audit-expiry-
|
|
27
|
-
const
|
|
27
|
+
const AUDIT_EXPIRY_LOG_VERSION = 'audit-expiry-v9';
|
|
28
|
+
const initializeOptimizelyExperimentContext = async (optimizely, experimentKey, variant) => {
|
|
29
|
+
(0, _logging.logInfo)('AuditExpiry experimentContext start', {
|
|
30
|
+
debugVersion: AUDIT_EXPIRY_LOG_VERSION,
|
|
31
|
+
experimentKey,
|
|
32
|
+
variant,
|
|
33
|
+
hasOptimizely: Boolean(optimizely)
|
|
34
|
+
});
|
|
35
|
+
if (!optimizely) {
|
|
36
|
+
(0, _logging.logInfo)('AuditExpiry experimentContext no optimizely', {
|
|
37
|
+
debugVersion: AUDIT_EXPIRY_LOG_VERSION,
|
|
38
|
+
experimentKey,
|
|
39
|
+
variant
|
|
40
|
+
});
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
if (typeof optimizely.onReady === 'function') {
|
|
44
|
+
const readyResult = await optimizely.onReady();
|
|
45
|
+
(0, _logging.logInfo)('AuditExpiry experimentContext onReady result', {
|
|
46
|
+
debugVersion: AUDIT_EXPIRY_LOG_VERSION,
|
|
47
|
+
experimentKey,
|
|
48
|
+
variant,
|
|
49
|
+
readySuccess: readyResult?.success,
|
|
50
|
+
readyReason: readyResult?.reason
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
if (typeof optimizely.setForcedVariation !== 'function') {
|
|
54
|
+
(0, _logging.logInfo)('AuditExpiry experimentContext missing setForcedVariation', {
|
|
55
|
+
debugVersion: AUDIT_EXPIRY_LOG_VERSION,
|
|
56
|
+
experimentKey,
|
|
57
|
+
variant
|
|
58
|
+
});
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
61
|
+
const forced = optimizely.setForcedVariation(experimentKey, variant);
|
|
62
|
+
(0, _logging.logInfo)('AuditExpiry experimentContext forced variation result', {
|
|
63
|
+
debugVersion: AUDIT_EXPIRY_LOG_VERSION,
|
|
64
|
+
experimentKey,
|
|
65
|
+
variant,
|
|
66
|
+
forced
|
|
67
|
+
});
|
|
68
|
+
if (!forced) {
|
|
69
|
+
return false;
|
|
70
|
+
}
|
|
71
|
+
if (typeof optimizely.activate === 'function') {
|
|
72
|
+
const activatedVariation = optimizely.activate(experimentKey);
|
|
73
|
+
(0, _logging.logInfo)('AuditExpiry experimentContext activate result', {
|
|
74
|
+
debugVersion: AUDIT_EXPIRY_LOG_VERSION,
|
|
75
|
+
experimentKey,
|
|
76
|
+
variant,
|
|
77
|
+
activatedVariation
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
return true;
|
|
81
|
+
};
|
|
82
|
+
const trackOptimizelyEvent = (optimizely, eventKey, eventTags) => {
|
|
28
83
|
(0, _logging.logInfo)('AuditExpiry trackOptimizelyEvent start', {
|
|
29
84
|
debugVersion: AUDIT_EXPIRY_LOG_VERSION,
|
|
30
85
|
eventKey,
|
|
31
|
-
userId,
|
|
32
86
|
hasOptimizely: Boolean(optimizely),
|
|
33
87
|
eventTags
|
|
34
88
|
});
|
|
@@ -51,32 +105,24 @@ const trackOptimizelyEvent = (optimizely, eventKey, userId, eventTags) => {
|
|
|
51
105
|
(0, _logging.logInfo)('AuditExpiry trackOptimizelyEvent calling track', {
|
|
52
106
|
debugVersion: AUDIT_EXPIRY_LOG_VERSION,
|
|
53
107
|
eventKey,
|
|
54
|
-
userId,
|
|
55
108
|
eventTags,
|
|
56
109
|
hasOnReady: typeof optimizely.onReady === 'function'
|
|
57
110
|
});
|
|
58
|
-
optimizely.track(eventKey,
|
|
111
|
+
optimizely.track(eventKey, undefined, undefined, eventTags);
|
|
59
112
|
(0, _logging.logInfo)('AuditExpiry trackOptimizelyEvent track called', {
|
|
60
113
|
debugVersion: AUDIT_EXPIRY_LOG_VERSION,
|
|
61
114
|
eventKey
|
|
62
115
|
});
|
|
63
116
|
return true;
|
|
64
117
|
};
|
|
65
|
-
|
|
66
|
-
/**
|
|
67
|
-
* Access Expiration top-of-courseware banner.
|
|
68
|
-
*
|
|
69
|
-
* This is the plugin-architecture equivalent of the Learning MFE's
|
|
70
|
-
* `src/alerts/access-expiration-alert/AccessExpirationAlert.jsx`.
|
|
71
|
-
*
|
|
72
|
-
* It renders directly as a plugin widget (does NOT use the Learning MFE alert registration system).
|
|
73
|
-
*/
|
|
74
|
-
const AccessExpirationAlert = _ref => {
|
|
118
|
+
const AccessExpirationAlertInnerBase = _ref => {
|
|
75
119
|
let {
|
|
76
|
-
courseId
|
|
120
|
+
courseId,
|
|
121
|
+
optimizely
|
|
77
122
|
} = _ref;
|
|
78
123
|
const intl = (0, _i18n.useIntl)();
|
|
79
124
|
const hasTrackedBannerView = (0, _react.useRef)(false);
|
|
125
|
+
const [isExperimentContextReady, setIsExperimentContextReady] = (0, _react.useState)(false);
|
|
80
126
|
const {
|
|
81
127
|
org,
|
|
82
128
|
userTimezone
|
|
@@ -91,45 +137,75 @@ const AccessExpirationAlert = _ref => {
|
|
|
91
137
|
const expiryDays = accessExpiration?.expiryDays;
|
|
92
138
|
const variant = accessExpiration?.variant;
|
|
93
139
|
(0, _react.useEffect)(() => {
|
|
94
|
-
|
|
140
|
+
let isMounted = true;
|
|
141
|
+
const setupExperimentContext = async () => {
|
|
142
|
+
if (!experimentKey || !variant || !optimizely) {
|
|
143
|
+
setIsExperimentContextReady(false);
|
|
144
|
+
(0, _logging.logInfo)('AuditExpiry experimentContext skipped', {
|
|
145
|
+
debugVersion: AUDIT_EXPIRY_LOG_VERSION,
|
|
146
|
+
courseId,
|
|
147
|
+
experimentKey,
|
|
148
|
+
variant,
|
|
149
|
+
hasOptimizely: Boolean(optimizely)
|
|
150
|
+
});
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
try {
|
|
154
|
+
const isReady = await initializeOptimizelyExperimentContext(optimizely, experimentKey, variant);
|
|
155
|
+
if (isMounted) {
|
|
156
|
+
setIsExperimentContextReady(isReady);
|
|
157
|
+
}
|
|
158
|
+
(0, _logging.logInfo)('AuditExpiry experimentContext ready state', {
|
|
159
|
+
debugVersion: AUDIT_EXPIRY_LOG_VERSION,
|
|
160
|
+
courseId,
|
|
161
|
+
experimentKey,
|
|
162
|
+
variant,
|
|
163
|
+
isExperimentContextReady: isReady
|
|
164
|
+
});
|
|
165
|
+
} catch (error) {
|
|
166
|
+
if (isMounted) {
|
|
167
|
+
setIsExperimentContextReady(false);
|
|
168
|
+
}
|
|
169
|
+
(0, _logging.logError)(error, {
|
|
170
|
+
debugVersion: AUDIT_EXPIRY_LOG_VERSION,
|
|
171
|
+
source: 'AuditExpiry experimentContext setup',
|
|
172
|
+
courseId,
|
|
173
|
+
experimentKey,
|
|
174
|
+
variant
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
};
|
|
178
|
+
setupExperimentContext();
|
|
179
|
+
return () => {
|
|
180
|
+
isMounted = false;
|
|
181
|
+
};
|
|
182
|
+
}, [courseId, experimentKey, optimizely, variant]);
|
|
183
|
+
(0, _react.useEffect)(() => {
|
|
184
|
+
(0, _logging.logInfo)('AuditExpiry bannerTrack effect entered', {
|
|
95
185
|
debugVersion: AUDIT_EXPIRY_LOG_VERSION,
|
|
96
186
|
courseId,
|
|
97
187
|
experimentKey,
|
|
98
188
|
variant,
|
|
99
189
|
expiryDays,
|
|
100
|
-
alreadyTracked: hasTrackedBannerView.current
|
|
190
|
+
alreadyTracked: hasTrackedBannerView.current,
|
|
191
|
+
hasOptimizely: Boolean(optimizely),
|
|
192
|
+
isExperimentContextReady
|
|
101
193
|
});
|
|
102
|
-
if (!experimentKey || !variant || hasTrackedBannerView.current) {
|
|
103
|
-
(0, _logging.logInfo)('AuditExpiry
|
|
194
|
+
if (!experimentKey || !variant || hasTrackedBannerView.current || !isExperimentContextReady) {
|
|
195
|
+
(0, _logging.logInfo)('AuditExpiry bannerTrack effect skipped', {
|
|
104
196
|
debugVersion: AUDIT_EXPIRY_LOG_VERSION,
|
|
105
197
|
courseId,
|
|
106
198
|
experimentKey,
|
|
107
199
|
variant,
|
|
108
|
-
alreadyTracked: hasTrackedBannerView.current
|
|
200
|
+
alreadyTracked: hasTrackedBannerView.current,
|
|
201
|
+
isExperimentContextReady
|
|
109
202
|
});
|
|
110
203
|
return undefined;
|
|
111
204
|
}
|
|
112
205
|
let isMounted = true;
|
|
113
206
|
const trackBannerShown = async () => {
|
|
114
207
|
try {
|
|
115
|
-
const
|
|
116
|
-
(0, _logging.logInfo)('AuditExpiry trackBannerShown getOptimizely', {
|
|
117
|
-
debugVersion: AUDIT_EXPIRY_LOG_VERSION,
|
|
118
|
-
hasOptimizely: Boolean(optimizely),
|
|
119
|
-
hasOnReady: typeof optimizely?.onReady === 'function',
|
|
120
|
-
hasTrack: typeof optimizely?.track === 'function'
|
|
121
|
-
});
|
|
122
|
-
if (!optimizely) {
|
|
123
|
-
return;
|
|
124
|
-
}
|
|
125
|
-
const {
|
|
126
|
-
userId
|
|
127
|
-
} = (0, _auth.getAuthenticatedUser)();
|
|
128
|
-
(0, _logging.logInfo)('AuditExpiry trackBannerShown user', {
|
|
129
|
-
debugVersion: AUDIT_EXPIRY_LOG_VERSION,
|
|
130
|
-
userId
|
|
131
|
-
});
|
|
132
|
-
const didTrack = trackOptimizelyEvent(optimizely, 'audit_expiry_urgency_banner_shown', userId.toString(), {
|
|
208
|
+
const didTrack = trackOptimizelyEvent(optimizely, 'audit_expiry_urgency_banner_shown', {
|
|
133
209
|
experimentKey,
|
|
134
210
|
variant,
|
|
135
211
|
expiryDays,
|
|
@@ -152,16 +228,13 @@ const AccessExpirationAlert = _ref => {
|
|
|
152
228
|
experimentKey,
|
|
153
229
|
variant
|
|
154
230
|
});
|
|
155
|
-
// Never break the banner experience if analytics fails.
|
|
156
231
|
}
|
|
157
232
|
};
|
|
158
233
|
trackBannerShown();
|
|
159
234
|
return () => {
|
|
160
235
|
isMounted = false;
|
|
161
236
|
};
|
|
162
|
-
}, [courseId, experimentKey, expiryDays, variant]);
|
|
163
|
-
|
|
164
|
-
// Match original MFE logic.
|
|
237
|
+
}, [courseId, experimentKey, expiryDays, isExperimentContextReady, optimizely, variant]);
|
|
165
238
|
if (!accessExpiration || accessExpiration.masqueradingExpiredCourse) {
|
|
166
239
|
return null;
|
|
167
240
|
}
|
|
@@ -176,10 +249,9 @@ const AccessExpirationAlert = _ref => {
|
|
|
176
249
|
courseId,
|
|
177
250
|
experimentKey,
|
|
178
251
|
variant,
|
|
179
|
-
expiryDays
|
|
252
|
+
expiryDays,
|
|
253
|
+
isExperimentContextReady
|
|
180
254
|
});
|
|
181
|
-
// Keep analytics identical to the temporary in-course wiring:
|
|
182
|
-
// analyticsPageName === 'in_course'
|
|
183
255
|
const analyticsPageName = 'in_course';
|
|
184
256
|
(0, _analytics.sendTrackEvent)('edx.bi.ecommerce.upsell_links_clicked', {
|
|
185
257
|
org_key: org,
|
|
@@ -189,40 +261,31 @@ const AccessExpirationAlert = _ref => {
|
|
|
189
261
|
linkType: 'link',
|
|
190
262
|
pageName: analyticsPageName
|
|
191
263
|
});
|
|
192
|
-
if (experimentKey
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
}
|
|
217
|
-
(0, _logging.logError)(error, {
|
|
218
|
-
debugVersion: AUDIT_EXPIRY_LOG_VERSION,
|
|
219
|
-
source: 'AuditExpiry logClick',
|
|
220
|
-
courseId,
|
|
221
|
-
experimentKey,
|
|
222
|
-
variant
|
|
223
|
-
});
|
|
224
|
-
// Never block the click-through path if analytics fails.
|
|
225
|
-
}
|
|
264
|
+
if (!experimentKey || !variant || !optimizely || !isExperimentContextReady) {
|
|
265
|
+
(0, _logging.logInfo)('AuditExpiry logClick skipped Optimizely track', {
|
|
266
|
+
debugVersion: AUDIT_EXPIRY_LOG_VERSION,
|
|
267
|
+
courseId,
|
|
268
|
+
experimentKey,
|
|
269
|
+
variant,
|
|
270
|
+
isExperimentContextReady
|
|
271
|
+
});
|
|
272
|
+
return;
|
|
273
|
+
}
|
|
274
|
+
try {
|
|
275
|
+
trackOptimizelyEvent(optimizely, 'audit_expiry_urgency_upgrade_clicked', {
|
|
276
|
+
experimentKey,
|
|
277
|
+
variant,
|
|
278
|
+
expiryDays,
|
|
279
|
+
courseId
|
|
280
|
+
});
|
|
281
|
+
} catch (error) {
|
|
282
|
+
(0, _logging.logError)(error, {
|
|
283
|
+
debugVersion: AUDIT_EXPIRY_LOG_VERSION,
|
|
284
|
+
source: 'AuditExpiry logClick',
|
|
285
|
+
courseId,
|
|
286
|
+
experimentKey,
|
|
287
|
+
variant
|
|
288
|
+
});
|
|
226
289
|
}
|
|
227
290
|
};
|
|
228
291
|
let deadlineMessage = null;
|
|
@@ -284,6 +347,58 @@ const AccessExpirationAlert = _ref => {
|
|
|
284
347
|
}), deadlineMessage]
|
|
285
348
|
});
|
|
286
349
|
};
|
|
350
|
+
const AccessExpirationAlertInner = (0, _reactSdk.withOptimizely)(AccessExpirationAlertInnerBase);
|
|
351
|
+
AccessExpirationAlertInnerBase.propTypes = {
|
|
352
|
+
courseId: _propTypes.default.string.isRequired,
|
|
353
|
+
optimizely: _propTypes.default.shape({
|
|
354
|
+
activate: _propTypes.default.func,
|
|
355
|
+
onReady: _propTypes.default.func,
|
|
356
|
+
setForcedVariation: _propTypes.default.func,
|
|
357
|
+
track: _propTypes.default.func
|
|
358
|
+
})
|
|
359
|
+
};
|
|
360
|
+
AccessExpirationAlertInnerBase.defaultProps = {
|
|
361
|
+
optimizely: null
|
|
362
|
+
};
|
|
363
|
+
const AccessExpirationAlert = _ref2 => {
|
|
364
|
+
let {
|
|
365
|
+
courseId
|
|
366
|
+
} = _ref2;
|
|
367
|
+
const optimizely = (0, _optimizely.getOptimizely)();
|
|
368
|
+
const {
|
|
369
|
+
userId
|
|
370
|
+
} = (0, _auth.getAuthenticatedUser)();
|
|
371
|
+
const {
|
|
372
|
+
enrollmentMode
|
|
373
|
+
} = (0, _modelStore.useModel)('coursewareMeta', courseId);
|
|
374
|
+
if (!optimizely) {
|
|
375
|
+
return /*#__PURE__*/(0, _jsxRuntime.jsx)(AccessExpirationAlertInnerBase, {
|
|
376
|
+
courseId: courseId,
|
|
377
|
+
optimizely: null
|
|
378
|
+
});
|
|
379
|
+
}
|
|
380
|
+
(0, _logging.logInfo)('AuditExpiry provider setup', {
|
|
381
|
+
debugVersion: AUDIT_EXPIRY_LOG_VERSION,
|
|
382
|
+
courseId,
|
|
383
|
+
hasOptimizely: true,
|
|
384
|
+
enrollmentMode,
|
|
385
|
+
userId
|
|
386
|
+
});
|
|
387
|
+
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactSdk.OptimizelyProvider, {
|
|
388
|
+
optimizely: optimizely,
|
|
389
|
+
user: {
|
|
390
|
+
id: userId.toString(),
|
|
391
|
+
attributes: _objectSpread({
|
|
392
|
+
lms_language_preference: (0, _i18n.getLocale)()
|
|
393
|
+
}, enrollmentMode ? {
|
|
394
|
+
lms_enrollment_mode: enrollmentMode
|
|
395
|
+
} : {})
|
|
396
|
+
},
|
|
397
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(AccessExpirationAlertInner, {
|
|
398
|
+
courseId: courseId
|
|
399
|
+
})
|
|
400
|
+
});
|
|
401
|
+
};
|
|
287
402
|
AccessExpirationAlert.propTypes = {
|
|
288
403
|
courseId: _propTypes.default.string.isRequired
|
|
289
404
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AccessExpirationAlert.js","names":["_react","_interopRequireWildcard","require","_propTypes","_interopRequireDefault","_analytics","_auth","_i18n","_logging","_paragon","_icons","_modelStore","_optimizely","_messages","_jsxRuntime","e","__esModule","default","t","WeakMap","r","n","o","i","f","__proto__","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","ownKeys","keys","getOwnPropertySymbols","filter","enumerable","push","apply","_objectSpread","arguments","length","forEach","_defineProperty","getOwnPropertyDescriptors","defineProperties","_toPropertyKey","value","configurable","writable","_toPrimitive","Symbol","toPrimitive","TypeError","String","Number","AUDIT_EXPIRY_LOG_VERSION","trackOptimizelyEvent","optimizely","eventKey","userId","eventTags","logInfo","debugVersion","hasOptimizely","Boolean","track","hasTrack","hasOnReady","onReady","undefined","AccessExpirationAlert","_ref","courseId","intl","useIntl","hasTrackedBannerView","useRef","org","userTimezone","useModel","accessExpiration","timezoneFormatArgs","timeZone","experimentKey","expiryDays","variant","useEffect","alreadyTracked","current","isMounted","trackBannerShown","getOptimizely","getAuthenticatedUser","didTrack","toString","error","logError","source","masqueradingExpiredCourse","expirationDate","upgradeDeadline","upgradeUrl","logClick","analyticsPageName","sendTrackEvent","org_key","courserun_key","linkCategory","linkName","linkType","pageName","deadlineMessage","jsxs","Fragment","children","jsx","FormattedMessage","id","defaultMessage","description","values","date","FormattedDate","day","month","year","Hyperlink","className","style","textDecoration","destination","onClick","formatMessage","messages","upgradeNow","Alert","icon","Info","propTypes","PropTypes","string","isRequired","_default","exports"],"sources":["../../src/access-expiration-alert/AccessExpirationAlert.jsx"],"sourcesContent":["/* eslint import/no-unresolved: 0 */\nimport React, { useEffect, useRef } from 'react';\nimport PropTypes from 'prop-types';\n\nimport { sendTrackEvent } from '@edx/frontend-platform/analytics';\nimport { getAuthenticatedUser } from '@edx/frontend-platform/auth';\nimport { FormattedMessage, FormattedDate, useIntl } from '@edx/frontend-platform/i18n';\nimport { logError, logInfo } from '@edx/frontend-platform/logging';\nimport { Alert, Hyperlink } from '@openedx/paragon';\nimport { Info } from '@openedx/paragon/icons';\n\nimport { useModel } from '@src/generic/model-store';\nimport { getOptimizely } from '../data/optimizely';\n\nimport messages from './messages';\n\nconst AUDIT_EXPIRY_LOG_VERSION = 'audit-expiry-v4';\n\nconst trackOptimizelyEvent = (optimizely, eventKey, userId, eventTags) => {\n logInfo('AuditExpiry trackOptimizelyEvent start', {\n debugVersion: AUDIT_EXPIRY_LOG_VERSION,\n eventKey,\n userId,\n hasOptimizely: Boolean(optimizely),\n eventTags,\n });\n\n if (!optimizely) {\n logInfo('AuditExpiry trackOptimizelyEvent no optimizely', {\n debugVersion: AUDIT_EXPIRY_LOG_VERSION,\n eventKey,\n });\n return false;\n }\n\n if (typeof optimizely.track !== 'function') {\n logInfo('AuditExpiry trackOptimizelyEvent missing track method', {\n debugVersion: AUDIT_EXPIRY_LOG_VERSION,\n eventKey,\n hasTrack: typeof optimizely.track === 'function',\n hasOnReady: typeof optimizely.onReady === 'function',\n });\n return false;\n }\n\n logInfo('AuditExpiry trackOptimizelyEvent calling track', {\n debugVersion: AUDIT_EXPIRY_LOG_VERSION,\n eventKey,\n userId,\n eventTags,\n hasOnReady: typeof optimizely.onReady === 'function',\n });\n optimizely.track(eventKey, userId, undefined, eventTags);\n logInfo('AuditExpiry trackOptimizelyEvent track called', {\n debugVersion: AUDIT_EXPIRY_LOG_VERSION,\n eventKey,\n });\n return true;\n};\n\n/**\n * Access Expiration top-of-courseware banner.\n *\n * This is the plugin-architecture equivalent of the Learning MFE's\n * `src/alerts/access-expiration-alert/AccessExpirationAlert.jsx`.\n *\n * It renders directly as a plugin widget (does NOT use the Learning MFE alert registration system).\n */\nconst AccessExpirationAlert = ({\n courseId,\n}) => {\n const intl = useIntl();\n const hasTrackedBannerView = useRef(false);\n\n const { org, userTimezone } = useModel('courseHomeMeta', courseId);\n const { accessExpiration } = useModel('coursewareMeta', courseId);\n\n const timezoneFormatArgs = userTimezone ? { timeZone: userTimezone } : {};\n const experimentKey = accessExpiration?.experimentKey;\n const expiryDays = accessExpiration?.expiryDays;\n const variant = accessExpiration?.variant;\n\n useEffect(() => {\n logInfo('AuditExpiry useEffect entered', {\n debugVersion: AUDIT_EXPIRY_LOG_VERSION,\n courseId,\n experimentKey,\n variant,\n expiryDays,\n alreadyTracked: hasTrackedBannerView.current,\n });\n\n if (!experimentKey || !variant || hasTrackedBannerView.current) {\n logInfo('AuditExpiry useEffect skipped', {\n debugVersion: AUDIT_EXPIRY_LOG_VERSION,\n courseId,\n experimentKey,\n variant,\n alreadyTracked: hasTrackedBannerView.current,\n });\n return undefined;\n }\n\n let isMounted = true;\n\n const trackBannerShown = async () => {\n try {\n const optimizely = getOptimizely();\n logInfo('AuditExpiry trackBannerShown getOptimizely', {\n debugVersion: AUDIT_EXPIRY_LOG_VERSION,\n hasOptimizely: Boolean(optimizely),\n hasOnReady: typeof optimizely?.onReady === 'function',\n hasTrack: typeof optimizely?.track === 'function',\n });\n if (!optimizely) {\n return;\n }\n\n const { userId } = getAuthenticatedUser();\n logInfo('AuditExpiry trackBannerShown user', {\n debugVersion: AUDIT_EXPIRY_LOG_VERSION,\n userId,\n });\n const didTrack = trackOptimizelyEvent(\n optimizely,\n 'audit_expiry_urgency_banner_shown',\n userId.toString(),\n {\n experimentKey,\n variant,\n expiryDays,\n courseId,\n },\n );\n\n if (didTrack && isMounted) {\n hasTrackedBannerView.current = true;\n logInfo('AuditExpiry trackBannerShown marked tracked', {\n debugVersion: AUDIT_EXPIRY_LOG_VERSION,\n courseId,\n experimentKey,\n variant,\n });\n }\n } catch (error) {\n logError(error, {\n debugVersion: AUDIT_EXPIRY_LOG_VERSION,\n source: 'AuditExpiry trackBannerShown',\n courseId,\n experimentKey,\n variant,\n });\n // Never break the banner experience if analytics fails.\n }\n };\n\n trackBannerShown();\n\n return () => {\n isMounted = false;\n };\n }, [courseId, experimentKey, expiryDays, variant]);\n\n // Match original MFE logic.\n if (!accessExpiration || accessExpiration.masqueradingExpiredCourse) {\n return null;\n }\n\n const {\n expirationDate,\n upgradeDeadline,\n upgradeUrl,\n } = accessExpiration;\n\n const logClick = () => {\n logInfo('AuditExpiry logClick entered', {\n debugVersion: AUDIT_EXPIRY_LOG_VERSION,\n courseId,\n experimentKey,\n variant,\n expiryDays,\n });\n // Keep analytics identical to the temporary in-course wiring:\n // analyticsPageName === 'in_course'\n const analyticsPageName = 'in_course';\n sendTrackEvent('edx.bi.ecommerce.upsell_links_clicked', {\n org_key: org,\n courserun_key: courseId,\n linkCategory: 'FBE_banner',\n linkName: `${analyticsPageName}_audit_access_expires`,\n linkType: 'link',\n pageName: analyticsPageName,\n });\n\n if (experimentKey && variant) {\n try {\n const optimizely = getOptimizely();\n logInfo('AuditExpiry logClick getOptimizely', {\n debugVersion: AUDIT_EXPIRY_LOG_VERSION,\n hasOptimizely: Boolean(optimizely),\n hasOnReady: typeof optimizely?.onReady === 'function',\n hasTrack: typeof optimizely?.track === 'function',\n });\n if (optimizely) {\n const { userId } = getAuthenticatedUser();\n logInfo('AuditExpiry logClick user', {\n debugVersion: AUDIT_EXPIRY_LOG_VERSION,\n userId,\n });\n trackOptimizelyEvent(\n optimizely,\n 'audit_expiry_urgency_upgrade_clicked',\n userId.toString(),\n {\n experimentKey,\n variant,\n expiryDays,\n courseId,\n },\n );\n }\n } catch (error) {\n logError(error, {\n debugVersion: AUDIT_EXPIRY_LOG_VERSION,\n source: 'AuditExpiry logClick',\n courseId,\n experimentKey,\n variant,\n });\n // Never block the click-through path if analytics fails.\n }\n }\n };\n\n let deadlineMessage = null;\n if (upgradeDeadline && upgradeUrl) {\n deadlineMessage = (\n <>\n <br />\n <FormattedMessage\n id=\"learning.accessExpiration.deadline\"\n defaultMessage=\"Upgrade by {date} to get unlimited access to the course as long as it exists on the site.\"\n description=\"Warning shown to learner to upgrade while they are enrolled on the audit version and it's possible to upgrade\"\n values={{\n date: (\n <FormattedDate\n key=\"accessExpirationUpgradeDeadline\"\n day=\"numeric\"\n month=\"short\"\n year=\"numeric\"\n value={upgradeDeadline}\n {...timezoneFormatArgs}\n />\n ),\n }}\n />\n \n <Hyperlink\n className=\"font-weight-bold\"\n style={{ textDecoration: 'underline' }}\n destination={upgradeUrl}\n onClick={logClick}\n >\n {intl.formatMessage(messages.upgradeNow)}\n </Hyperlink>\n </>\n );\n }\n\n return (\n <Alert variant=\"info\" icon={Info}>\n <span className=\"font-weight-bold\">\n <FormattedMessage\n id=\"learning.accessExpiration.header\"\n defaultMessage=\"Audit Access Expires {date}\"\n description=\"Headline for auditing deadline\"\n values={{\n date: (\n <FormattedDate\n key=\"accessExpirationHeaderDate\"\n day=\"numeric\"\n month=\"short\"\n year=\"numeric\"\n value={expirationDate}\n {...timezoneFormatArgs}\n />\n ),\n }}\n />\n </span>\n <br />\n <FormattedMessage\n id=\"learning.accessExpiration.body\"\n defaultMessage=\"You lose all access to this course, including your progress, on {date}.\"\n description=\"Message body to tell learner the consequences of course expiration.\"\n values={{\n date: (\n <FormattedDate\n key=\"accessExpirationBodyDate\"\n day=\"numeric\"\n month=\"short\"\n year=\"numeric\"\n value={expirationDate}\n {...timezoneFormatArgs}\n />\n ),\n }}\n />\n {deadlineMessage}\n </Alert>\n );\n};\n\nAccessExpirationAlert.propTypes = {\n courseId: PropTypes.string.isRequired,\n};\n\nexport default AccessExpirationAlert;\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"AccessExpirationAlert.js","names":["_react","_interopRequireWildcard","require","_propTypes","_interopRequireDefault","_reactSdk","_analytics","_auth","_i18n","_logging","_paragon","_icons","_modelStore","_optimizely","_messages","_jsxRuntime","e","__esModule","default","t","WeakMap","r","n","o","i","f","__proto__","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","ownKeys","keys","getOwnPropertySymbols","filter","enumerable","push","apply","_objectSpread","arguments","length","forEach","_defineProperty","getOwnPropertyDescriptors","defineProperties","_toPropertyKey","value","configurable","writable","_toPrimitive","Symbol","toPrimitive","TypeError","String","Number","AUDIT_EXPIRY_LOG_VERSION","initializeOptimizelyExperimentContext","optimizely","experimentKey","variant","logInfo","debugVersion","hasOptimizely","Boolean","onReady","readyResult","readySuccess","success","readyReason","reason","setForcedVariation","forced","activate","activatedVariation","trackOptimizelyEvent","eventKey","eventTags","track","hasTrack","hasOnReady","undefined","AccessExpirationAlertInnerBase","_ref","courseId","intl","useIntl","hasTrackedBannerView","useRef","isExperimentContextReady","setIsExperimentContextReady","useState","org","userTimezone","useModel","accessExpiration","timezoneFormatArgs","timeZone","expiryDays","useEffect","isMounted","setupExperimentContext","isReady","error","logError","source","alreadyTracked","current","trackBannerShown","didTrack","masqueradingExpiredCourse","expirationDate","upgradeDeadline","upgradeUrl","logClick","analyticsPageName","sendTrackEvent","org_key","courserun_key","linkCategory","linkName","linkType","pageName","deadlineMessage","jsxs","Fragment","children","jsx","FormattedMessage","id","defaultMessage","description","values","date","FormattedDate","day","month","year","Hyperlink","className","style","textDecoration","destination","onClick","formatMessage","messages","upgradeNow","Alert","icon","Info","AccessExpirationAlertInner","withOptimizely","propTypes","PropTypes","string","isRequired","shape","func","defaultProps","AccessExpirationAlert","_ref2","getOptimizely","userId","getAuthenticatedUser","enrollmentMode","OptimizelyProvider","user","toString","attributes","lms_language_preference","getLocale","lms_enrollment_mode","_default","exports"],"sources":["../../src/access-expiration-alert/AccessExpirationAlert.jsx"],"sourcesContent":["/* eslint import/no-unresolved: 0 */\nimport React, { useEffect, useRef, useState } from 'react';\nimport PropTypes from 'prop-types';\nimport { OptimizelyProvider, withOptimizely } from '@optimizely/react-sdk';\n\nimport { sendTrackEvent } from '@edx/frontend-platform/analytics';\nimport { getAuthenticatedUser } from '@edx/frontend-platform/auth';\nimport {\n FormattedMessage, FormattedDate, getLocale, useIntl,\n} from '@edx/frontend-platform/i18n';\nimport { logError, logInfo } from '@edx/frontend-platform/logging';\nimport { Alert, Hyperlink } from '@openedx/paragon';\nimport { Info } from '@openedx/paragon/icons';\n\nimport { useModel } from '@src/generic/model-store';\nimport { getOptimizely } from '../data/optimizely';\n\nimport messages from './messages';\n\nconst AUDIT_EXPIRY_LOG_VERSION = 'audit-expiry-v9';\n\nconst initializeOptimizelyExperimentContext = async (optimizely, experimentKey, variant) => {\n logInfo('AuditExpiry experimentContext start', {\n debugVersion: AUDIT_EXPIRY_LOG_VERSION,\n experimentKey,\n variant,\n hasOptimizely: Boolean(optimizely),\n });\n\n if (!optimizely) {\n logInfo('AuditExpiry experimentContext no optimizely', {\n debugVersion: AUDIT_EXPIRY_LOG_VERSION,\n experimentKey,\n variant,\n });\n return false;\n }\n\n if (typeof optimizely.onReady === 'function') {\n const readyResult = await optimizely.onReady();\n logInfo('AuditExpiry experimentContext onReady result', {\n debugVersion: AUDIT_EXPIRY_LOG_VERSION,\n experimentKey,\n variant,\n readySuccess: readyResult?.success,\n readyReason: readyResult?.reason,\n });\n }\n\n if (typeof optimizely.setForcedVariation !== 'function') {\n logInfo('AuditExpiry experimentContext missing setForcedVariation', {\n debugVersion: AUDIT_EXPIRY_LOG_VERSION,\n experimentKey,\n variant,\n });\n return false;\n }\n\n const forced = optimizely.setForcedVariation(experimentKey, variant);\n logInfo('AuditExpiry experimentContext forced variation result', {\n debugVersion: AUDIT_EXPIRY_LOG_VERSION,\n experimentKey,\n variant,\n forced,\n });\n\n if (!forced) {\n return false;\n }\n\n if (typeof optimizely.activate === 'function') {\n const activatedVariation = optimizely.activate(experimentKey);\n logInfo('AuditExpiry experimentContext activate result', {\n debugVersion: AUDIT_EXPIRY_LOG_VERSION,\n experimentKey,\n variant,\n activatedVariation,\n });\n }\n\n return true;\n};\n\nconst trackOptimizelyEvent = (optimizely, eventKey, eventTags) => {\n logInfo('AuditExpiry trackOptimizelyEvent start', {\n debugVersion: AUDIT_EXPIRY_LOG_VERSION,\n eventKey,\n hasOptimizely: Boolean(optimizely),\n eventTags,\n });\n\n if (!optimizely) {\n logInfo('AuditExpiry trackOptimizelyEvent no optimizely', {\n debugVersion: AUDIT_EXPIRY_LOG_VERSION,\n eventKey,\n });\n return false;\n }\n\n if (typeof optimizely.track !== 'function') {\n logInfo('AuditExpiry trackOptimizelyEvent missing track method', {\n debugVersion: AUDIT_EXPIRY_LOG_VERSION,\n eventKey,\n hasTrack: typeof optimizely.track === 'function',\n hasOnReady: typeof optimizely.onReady === 'function',\n });\n return false;\n }\n\n logInfo('AuditExpiry trackOptimizelyEvent calling track', {\n debugVersion: AUDIT_EXPIRY_LOG_VERSION,\n eventKey,\n eventTags,\n hasOnReady: typeof optimizely.onReady === 'function',\n });\n\n optimizely.track(eventKey, undefined, undefined, eventTags);\n\n logInfo('AuditExpiry trackOptimizelyEvent track called', {\n debugVersion: AUDIT_EXPIRY_LOG_VERSION,\n eventKey,\n });\n return true;\n};\n\nconst AccessExpirationAlertInnerBase = ({\n courseId,\n optimizely,\n}) => {\n const intl = useIntl();\n const hasTrackedBannerView = useRef(false);\n const [isExperimentContextReady, setIsExperimentContextReady] = useState(false);\n\n const { org, userTimezone } = useModel('courseHomeMeta', courseId);\n const { accessExpiration } = useModel('coursewareMeta', courseId);\n\n const timezoneFormatArgs = userTimezone ? { timeZone: userTimezone } : {};\n const experimentKey = accessExpiration?.experimentKey;\n const expiryDays = accessExpiration?.expiryDays;\n const variant = accessExpiration?.variant;\n\n useEffect(() => {\n let isMounted = true;\n\n const setupExperimentContext = async () => {\n if (!experimentKey || !variant || !optimizely) {\n setIsExperimentContextReady(false);\n logInfo('AuditExpiry experimentContext skipped', {\n debugVersion: AUDIT_EXPIRY_LOG_VERSION,\n courseId,\n experimentKey,\n variant,\n hasOptimizely: Boolean(optimizely),\n });\n return;\n }\n\n try {\n const isReady = await initializeOptimizelyExperimentContext(optimizely, experimentKey, variant);\n if (isMounted) {\n setIsExperimentContextReady(isReady);\n }\n logInfo('AuditExpiry experimentContext ready state', {\n debugVersion: AUDIT_EXPIRY_LOG_VERSION,\n courseId,\n experimentKey,\n variant,\n isExperimentContextReady: isReady,\n });\n } catch (error) {\n if (isMounted) {\n setIsExperimentContextReady(false);\n }\n logError(error, {\n debugVersion: AUDIT_EXPIRY_LOG_VERSION,\n source: 'AuditExpiry experimentContext setup',\n courseId,\n experimentKey,\n variant,\n });\n }\n };\n\n setupExperimentContext();\n\n return () => {\n isMounted = false;\n };\n }, [courseId, experimentKey, optimizely, variant]);\n\n useEffect(() => {\n logInfo('AuditExpiry bannerTrack effect entered', {\n debugVersion: AUDIT_EXPIRY_LOG_VERSION,\n courseId,\n experimentKey,\n variant,\n expiryDays,\n alreadyTracked: hasTrackedBannerView.current,\n hasOptimizely: Boolean(optimizely),\n isExperimentContextReady,\n });\n\n if (!experimentKey || !variant || hasTrackedBannerView.current || !isExperimentContextReady) {\n logInfo('AuditExpiry bannerTrack effect skipped', {\n debugVersion: AUDIT_EXPIRY_LOG_VERSION,\n courseId,\n experimentKey,\n variant,\n alreadyTracked: hasTrackedBannerView.current,\n isExperimentContextReady,\n });\n return undefined;\n }\n\n let isMounted = true;\n\n const trackBannerShown = async () => {\n try {\n const didTrack = trackOptimizelyEvent(\n optimizely,\n 'audit_expiry_urgency_banner_shown',\n {\n experimentKey,\n variant,\n expiryDays,\n courseId,\n },\n );\n\n if (didTrack && isMounted) {\n hasTrackedBannerView.current = true;\n logInfo('AuditExpiry trackBannerShown marked tracked', {\n debugVersion: AUDIT_EXPIRY_LOG_VERSION,\n courseId,\n experimentKey,\n variant,\n });\n }\n } catch (error) {\n logError(error, {\n debugVersion: AUDIT_EXPIRY_LOG_VERSION,\n source: 'AuditExpiry trackBannerShown',\n courseId,\n experimentKey,\n variant,\n });\n }\n };\n\n trackBannerShown();\n\n return () => {\n isMounted = false;\n };\n }, [courseId, experimentKey, expiryDays, isExperimentContextReady, optimizely, variant]);\n\n if (!accessExpiration || accessExpiration.masqueradingExpiredCourse) {\n return null;\n }\n\n const {\n expirationDate,\n upgradeDeadline,\n upgradeUrl,\n } = accessExpiration;\n\n const logClick = () => {\n logInfo('AuditExpiry logClick entered', {\n debugVersion: AUDIT_EXPIRY_LOG_VERSION,\n courseId,\n experimentKey,\n variant,\n expiryDays,\n isExperimentContextReady,\n });\n\n const analyticsPageName = 'in_course';\n sendTrackEvent('edx.bi.ecommerce.upsell_links_clicked', {\n org_key: org,\n courserun_key: courseId,\n linkCategory: 'FBE_banner',\n linkName: `${analyticsPageName}_audit_access_expires`,\n linkType: 'link',\n pageName: analyticsPageName,\n });\n\n if (!experimentKey || !variant || !optimizely || !isExperimentContextReady) {\n logInfo('AuditExpiry logClick skipped Optimizely track', {\n debugVersion: AUDIT_EXPIRY_LOG_VERSION,\n courseId,\n experimentKey,\n variant,\n isExperimentContextReady,\n });\n return;\n }\n\n try {\n trackOptimizelyEvent(\n optimizely,\n 'audit_expiry_urgency_upgrade_clicked',\n {\n experimentKey,\n variant,\n expiryDays,\n courseId,\n },\n );\n } catch (error) {\n logError(error, {\n debugVersion: AUDIT_EXPIRY_LOG_VERSION,\n source: 'AuditExpiry logClick',\n courseId,\n experimentKey,\n variant,\n });\n }\n };\n\n let deadlineMessage = null;\n if (upgradeDeadline && upgradeUrl) {\n deadlineMessage = (\n <>\n <br />\n <FormattedMessage\n id=\"learning.accessExpiration.deadline\"\n defaultMessage=\"Upgrade by {date} to get unlimited access to the course as long as it exists on the site.\"\n description=\"Warning shown to learner to upgrade while they are enrolled on the audit version and it's possible to upgrade\"\n values={{\n date: (\n <FormattedDate\n key=\"accessExpirationUpgradeDeadline\"\n day=\"numeric\"\n month=\"short\"\n year=\"numeric\"\n value={upgradeDeadline}\n {...timezoneFormatArgs}\n />\n ),\n }}\n />\n \n <Hyperlink\n className=\"font-weight-bold\"\n style={{ textDecoration: 'underline' }}\n destination={upgradeUrl}\n onClick={logClick}\n >\n {intl.formatMessage(messages.upgradeNow)}\n </Hyperlink>\n </>\n );\n }\n\n return (\n <Alert variant=\"info\" icon={Info}>\n <span className=\"font-weight-bold\">\n <FormattedMessage\n id=\"learning.accessExpiration.header\"\n defaultMessage=\"Audit Access Expires {date}\"\n description=\"Headline for auditing deadline\"\n values={{\n date: (\n <FormattedDate\n key=\"accessExpirationHeaderDate\"\n day=\"numeric\"\n month=\"short\"\n year=\"numeric\"\n value={expirationDate}\n {...timezoneFormatArgs}\n />\n ),\n }}\n />\n </span>\n <br />\n <FormattedMessage\n id=\"learning.accessExpiration.body\"\n defaultMessage=\"You lose all access to this course, including your progress, on {date}.\"\n description=\"Message body to tell learner the consequences of course expiration.\"\n values={{\n date: (\n <FormattedDate\n key=\"accessExpirationBodyDate\"\n day=\"numeric\"\n month=\"short\"\n year=\"numeric\"\n value={expirationDate}\n {...timezoneFormatArgs}\n />\n ),\n }}\n />\n {deadlineMessage}\n </Alert>\n );\n};\n\nconst AccessExpirationAlertInner = withOptimizely(AccessExpirationAlertInnerBase);\n\nAccessExpirationAlertInnerBase.propTypes = {\n courseId: PropTypes.string.isRequired,\n optimizely: PropTypes.shape({\n activate: PropTypes.func,\n onReady: PropTypes.func,\n setForcedVariation: PropTypes.func,\n track: PropTypes.func,\n }),\n};\n\nAccessExpirationAlertInnerBase.defaultProps = {\n optimizely: null,\n};\n\nconst AccessExpirationAlert = ({\n courseId,\n}) => {\n const optimizely = getOptimizely();\n const { userId } = getAuthenticatedUser();\n const { enrollmentMode } = useModel('coursewareMeta', courseId);\n\n if (!optimizely) {\n return <AccessExpirationAlertInnerBase courseId={courseId} optimizely={null} />;\n }\n\n logInfo('AuditExpiry provider setup', {\n debugVersion: AUDIT_EXPIRY_LOG_VERSION,\n courseId,\n hasOptimizely: true,\n enrollmentMode,\n userId,\n });\n\n return (\n <OptimizelyProvider\n optimizely={optimizely}\n user={{\n id: userId.toString(),\n attributes: {\n lms_language_preference: getLocale(),\n ...(enrollmentMode ? { lms_enrollment_mode: enrollmentMode } : {}),\n },\n }}\n >\n <AccessExpirationAlertInner courseId={courseId} />\n </OptimizelyProvider>\n );\n};\n\nAccessExpirationAlert.propTypes = {\n courseId: PropTypes.string.isRequired,\n};\n\nexport default AccessExpirationAlert;\n"],"mappings":"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","ignoreList":[]}
|