@edx/frontend-plugin-advertisements 1.20.0 → 1.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.
Files changed (41) hide show
  1. package/dist/data/__factories__/defaultUpgradeNotificationData.factory.js +18 -0
  2. package/dist/data/__factories__/defaultUpgradeNotificationData.factory.js.map +1 -0
  3. package/dist/data/__factories__/index.js +1 -0
  4. package/dist/data/__factories__/index.js.map +1 -1
  5. package/dist/data/index.js +6 -0
  6. package/dist/data/index.js.map +1 -1
  7. package/dist/data/optimizely.js +9 -1
  8. package/dist/data/optimizely.js.map +1 -1
  9. package/dist/index.js +7 -0
  10. package/dist/index.js.map +1 -1
  11. package/dist/index.scss +4 -0
  12. package/dist/paywall/ExperimentalLockPaywall.js +2 -2
  13. package/dist/paywall/ExperimentalLockPaywall.js.map +1 -1
  14. package/dist/upgrade-modal/DefaultUpgradeModal.js +51 -0
  15. package/dist/upgrade-modal/DefaultUpgradeModal.js.map +1 -0
  16. package/dist/upgrade-modal/ExperimentalUpgradeModal.js +105 -0
  17. package/dist/upgrade-modal/ExperimentalUpgradeModal.js.map +1 -0
  18. package/dist/upgrade-modal/NextButton.js +68 -0
  19. package/dist/upgrade-modal/NextButton.js.map +1 -0
  20. package/dist/upgrade-modal/UpgradeModal.js +234 -0
  21. package/dist/upgrade-modal/UpgradeModal.js.map +1 -0
  22. package/dist/upgrade-modal/UpgradeModalWrapper.js +26 -0
  23. package/dist/upgrade-modal/UpgradeModalWrapper.js.map +1 -0
  24. package/dist/upgrade-modal/hooks.js +70 -0
  25. package/dist/upgrade-modal/hooks.js.map +1 -0
  26. package/dist/upgrade-modal/index.js +17 -0
  27. package/dist/upgrade-modal/index.js.map +1 -0
  28. package/dist/upgrade-notification/DefaultUpgradeNotification.js +463 -37
  29. package/dist/upgrade-notification/DefaultUpgradeNotification.js.map +1 -1
  30. package/dist/upgrade-notification/ExperimentalUpgradeNotification.js +7 -9
  31. package/dist/upgrade-notification/ExperimentalUpgradeNotification.js.map +1 -1
  32. package/dist/upgrade-notification/certificate-preview/CertificatePreview.js +3 -2
  33. package/dist/upgrade-notification/certificate-preview/CertificatePreview.js.map +1 -1
  34. package/dist/upsell-bullets/ExperimentalUpsellBullets.js +39 -0
  35. package/dist/upsell-bullets/ExperimentalUpsellBullets.js.map +1 -0
  36. package/dist/upsell-bullets/UpsellBullets.js +101 -16
  37. package/dist/upsell-bullets/UpsellBullets.js.map +1 -1
  38. package/dist/upsell-bullets/UpsellBullets.scss +11 -0
  39. package/dist/upsell-bullets/index.js +50 -0
  40. package/dist/upsell-bullets/index.js.map +1 -0
  41. package/package.json +1 -1
@@ -4,36 +4,271 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = void 0;
7
+ var _react = _interopRequireWildcard(require("react"));
7
8
  var _propTypes = _interopRequireDefault(require("prop-types"));
9
+ var _classnames = _interopRequireDefault(require("classnames"));
10
+ var _i18n = require("@edx/frontend-platform/i18n");
11
+ var _analytics = require("@edx/frontend-platform/analytics");
12
+ var _paragon = require("@openedx/paragon");
13
+ var _icons = require("@openedx/paragon/icons");
14
+ var _localStorage = require("@src/data/localStorage");
15
+ var _upgradeButton = require("@src/generic/upgrade-button");
8
16
  var _modelStore = require("@src/generic/model-store");
9
- var _UpgradeNotification = _interopRequireDefault(require("@src/generic/upgrade-notification/UpgradeNotification"));
17
+ var _upsellBullets = require("../upsell-bullets");
18
+ var _certificatePreview = _interopRequireDefault(require("./certificate-preview"));
10
19
  var _jsxRuntime = require("react/jsx-runtime");
11
20
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
21
+ function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
22
+ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
12
23
  function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
13
24
  function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
14
25
  function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
15
26
  function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
16
- 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-disable import/no-unresolved */
17
- const DefaultUpgradeNotification = props => {
18
- /*
19
- NOTE: The following props are expected to be passed in from the parent.
20
- - courseId
21
- - from all PluginSlots
22
- - notificationCurrentState
23
- - from notification_widget_slot and notification_tray_plugin PluginSlots but not
24
- outline_tab_notifications_plugin PluginSlot
25
- - NOTE: not currently in use by these widgets
26
- - setNotificationCurrentState
27
- - from notification_widget_slot and notification_tray_plugin PluginSlots but not
28
- outline_tab_notifications_plugin PluginSlot
29
- - toggleSidebar
30
- - from notification_widget_slot PluginSlot but not notification_tray_plugin and
31
- outline_tab_notifications_plugin PluginSlots
32
- */
33
- const {
27
+ 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 */
28
+ const UpsellNoFBECardContent = () => /*#__PURE__*/(0, _jsxRuntime.jsxs)("ul", {
29
+ className: "fa-ul upgrade-notification-ul pt-0",
30
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_upsellBullets.VerifiedCertBullet, {}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_upsellBullets.SupportMissionBullet, {})]
31
+ });
32
+ const UpsellFBEFarAwayCardContent = () => /*#__PURE__*/(0, _jsxRuntime.jsxs)("ul", {
33
+ className: "fa-ul upgrade-notification-ul",
34
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_upsellBullets.VerifiedCertBullet, {}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_upsellBullets.UnlockGradedBullet, {}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_upsellBullets.FullAccessBullet, {}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_upsellBullets.SupportMissionBullet, {})]
35
+ });
36
+ const UpsellFBESoonCardContent = _ref => {
37
+ let {
38
+ accessExpirationDate,
39
+ timezoneFormatArgs
40
+ } = _ref;
41
+ const includingAnyProgress = /*#__PURE__*/(0, _jsxRuntime.jsx)("span", {
42
+ className: "font-weight-bold",
43
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_i18n.FormattedMessage, {
44
+ id: "advertisements.upgradeNotification.expirationAccessLoss.progress",
45
+ defaultMessage: "including any progress"
46
+ })
47
+ });
48
+ const date = /*#__PURE__*/(0, _jsxRuntime.jsx)(_i18n.FormattedDate, _objectSpread({
49
+ day: "numeric",
50
+ month: "long",
51
+ value: new Date(accessExpirationDate)
52
+ }, timezoneFormatArgs), "accessDate");
53
+ const benefitsOfUpgrading = /*#__PURE__*/(0, _jsxRuntime.jsx)("a", {
54
+ className: "inline-link-underline font-weight-bold",
55
+ rel: "noopener noreferrer",
56
+ target: "_blank",
57
+ href: "https://support.edx.org/hc/en-us/articles/360013426573-What-are-the-differences-between-audit-free-and-verified-paid-courses-",
58
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_i18n.FormattedMessage, {
59
+ id: "advertisements.upgradeNotification.expirationVerifiedCert.benefits",
60
+ defaultMessage: "benefits of upgrading"
61
+ })
62
+ });
63
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
64
+ className: "upgrade-notification-text",
65
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("p", {
66
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_i18n.FormattedMessage, {
67
+ id: "advertisements.upgradeNotification.expirationAccessLoss",
68
+ defaultMessage: "You will lose all access to this course, {includingAnyProgress}, on {date}.",
69
+ values: {
70
+ includingAnyProgress,
71
+ date
72
+ }
73
+ })
74
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)("p", {
75
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_i18n.FormattedMessage, {
76
+ id: "advertisements.upgradeNotification.expirationVerifiedCert",
77
+ defaultMessage: "Upgrading your course enables you to pursue a verified certificate and unlocks numerous features. Learn more about the {benefitsOfUpgrading}.",
78
+ values: {
79
+ benefitsOfUpgrading
80
+ }
81
+ })
82
+ })]
83
+ });
84
+ };
85
+ UpsellFBESoonCardContent.propTypes = {
86
+ accessExpirationDate: _propTypes.default.PropTypes.instanceOf(Date).isRequired,
87
+ timezoneFormatArgs: _propTypes.default.shape({
88
+ timeZone: _propTypes.default.string
89
+ })
90
+ };
91
+ UpsellFBESoonCardContent.defaultProps = {
92
+ timezoneFormatArgs: {}
93
+ };
94
+ const PastExpirationCardContent = () => /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
95
+ className: "upgrade-notification-text",
96
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)("p", {
97
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_i18n.FormattedMessage, {
98
+ id: "advertisements.upgradeNotification.pastExpiration.content",
99
+ defaultMessage: "The upgrade deadline for this course passed. To upgrade, enroll in the next available session."
100
+ })
101
+ })
102
+ });
103
+ const ExpirationCountdown = _ref2 => {
104
+ let {
105
+ courseId,
106
+ hoursToExpiration,
107
+ setupgradeNotificationCurrentState,
108
+ type
109
+ } = _ref2;
110
+ let expirationText;
111
+ if (hoursToExpiration >= 24) {
112
+ // More than 1 day left
113
+ // setupgradeNotificationCurrentState is available in NotificationTray (not course home)
114
+ if (setupgradeNotificationCurrentState) {
115
+ if (type === 'access') {
116
+ setupgradeNotificationCurrentState('accessDaysLeft');
117
+ (0, _localStorage.setLocalStorage)(`upgradeNotificationCurrentState.${courseId}`, 'accessDaysLeft');
118
+ }
119
+ if (type === 'offer') {
120
+ setupgradeNotificationCurrentState('FPDdaysLeft');
121
+ (0, _localStorage.setLocalStorage)(`upgradeNotificationCurrentState.${courseId}`, 'FPDdaysLeft');
122
+ }
123
+ }
124
+ expirationText = /*#__PURE__*/(0, _jsxRuntime.jsx)(_i18n.FormattedMessage, {
125
+ id: "advertisements.upgradeNotification.expirationDays",
126
+ defaultMessage: `{dayCount, number} {dayCount, plural,
127
+ one {day}
128
+ other {days}} left`,
129
+ values: {
130
+ dayCount: Math.floor(hoursToExpiration / 24)
131
+ }
132
+ });
133
+ } else if (hoursToExpiration >= 1) {
134
+ // More than 1 hour left
135
+ // setupgradeNotificationCurrentState is available in NotificationTray (not course home)
136
+ if (setupgradeNotificationCurrentState) {
137
+ if (type === 'access') {
138
+ setupgradeNotificationCurrentState('accessHoursLeft');
139
+ (0, _localStorage.setLocalStorage)(`upgradeNotificationCurrentState.${courseId}`, 'accessHoursLeft');
140
+ }
141
+ if (type === 'offer') {
142
+ setupgradeNotificationCurrentState('FPDHoursLeft');
143
+ (0, _localStorage.setLocalStorage)(`upgradeNotificationCurrentState.${courseId}`, 'FPDHoursLeft');
144
+ }
145
+ }
146
+ expirationText = /*#__PURE__*/(0, _jsxRuntime.jsx)(_i18n.FormattedMessage, {
147
+ id: "advertisements.upgradeNotification.expirationHours",
148
+ defaultMessage: `{hourCount, number} {hourCount, plural,
149
+ one {hour}
150
+ other {hours}} left`,
151
+ values: {
152
+ hourCount: hoursToExpiration
153
+ }
154
+ });
155
+ } else {
156
+ // Less than 1 hour
157
+ // setupgradeNotificationCurrentState is available in NotificationTray (not course home)
158
+ if (setupgradeNotificationCurrentState) {
159
+ if (type === 'access') {
160
+ setupgradeNotificationCurrentState('accessLastHour');
161
+ (0, _localStorage.setLocalStorage)(`upgradeNotificationCurrentState.${courseId}`, 'accessLastHour');
162
+ }
163
+ if (type === 'offer') {
164
+ setupgradeNotificationCurrentState('FPDLastHour');
165
+ (0, _localStorage.setLocalStorage)(`upgradeNotificationCurrentState.${courseId}`, 'FPDLastHour');
166
+ }
167
+ }
168
+ expirationText = /*#__PURE__*/(0, _jsxRuntime.jsx)(_i18n.FormattedMessage, {
169
+ id: "advertisements.upgradeNotification.expirationMinutes",
170
+ defaultMessage: "Less than 1 hour left"
171
+ });
172
+ }
173
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
174
+ className: "upsell-warning",
175
+ children: expirationText
176
+ });
177
+ };
178
+ ExpirationCountdown.propTypes = {
179
+ courseId: _propTypes.default.string.isRequired,
180
+ hoursToExpiration: _propTypes.default.number.isRequired,
181
+ setupgradeNotificationCurrentState: _propTypes.default.func,
182
+ type: _propTypes.default.string
183
+ };
184
+ ExpirationCountdown.defaultProps = {
185
+ setupgradeNotificationCurrentState: null,
186
+ type: null
187
+ };
188
+ const AccessExpirationDateBanner = _ref3 => {
189
+ let {
190
+ courseId,
191
+ accessExpirationDate,
192
+ timezoneFormatArgs,
193
+ setupgradeNotificationCurrentState
194
+ } = _ref3;
195
+ if (setupgradeNotificationCurrentState) {
196
+ setupgradeNotificationCurrentState('accessDateView');
197
+ (0, _localStorage.setLocalStorage)(`upgradeNotificationCurrentState.${courseId}`, 'accessDateView');
198
+ }
199
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
200
+ className: "upsell-warning-light",
201
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_i18n.FormattedMessage, {
202
+ id: "advertisements.upgradeNotification.expiration",
203
+ defaultMessage: "Course access will expire {date}",
204
+ values: {
205
+ date: /*#__PURE__*/(0, _jsxRuntime.jsx)(_i18n.FormattedDate, _objectSpread({
206
+ day: "numeric",
207
+ month: "long",
208
+ value: accessExpirationDate
209
+ }, timezoneFormatArgs), "accessExpireDate")
210
+ }
211
+ })
212
+ });
213
+ };
214
+ AccessExpirationDateBanner.propTypes = {
215
+ courseId: _propTypes.default.string.isRequired,
216
+ accessExpirationDate: _propTypes.default.PropTypes.instanceOf(Date).isRequired,
217
+ timezoneFormatArgs: _propTypes.default.shape({
218
+ timeZone: _propTypes.default.string
219
+ }),
220
+ setupgradeNotificationCurrentState: _propTypes.default.func
221
+ };
222
+ AccessExpirationDateBanner.defaultProps = {
223
+ timezoneFormatArgs: {},
224
+ setupgradeNotificationCurrentState: null
225
+ };
226
+ const PastExpirationDateBanner = _ref4 => {
227
+ let {
34
228
  courseId,
35
- id: pluginLocationId
36
- } = props;
229
+ accessExpirationDate,
230
+ timezoneFormatArgs,
231
+ setupgradeNotificationCurrentState
232
+ } = _ref4;
233
+ if (setupgradeNotificationCurrentState) {
234
+ setupgradeNotificationCurrentState('PastExpirationDate');
235
+ (0, _localStorage.setLocalStorage)(`upgradeNotificationCurrentState.${courseId}`, 'PastExpirationDate');
236
+ }
237
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
238
+ className: "upsell-warning",
239
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_i18n.FormattedMessage, {
240
+ id: "advertisements.upgradeNotification.pastExpiration.banner",
241
+ defaultMessage: "Upgrade deadline passed on {date}",
242
+ values: {
243
+ date: /*#__PURE__*/(0, _jsxRuntime.jsx)(_i18n.FormattedDate, _objectSpread({
244
+ day: "numeric",
245
+ month: "long",
246
+ value: accessExpirationDate
247
+ }, timezoneFormatArgs), "accessExpireDate")
248
+ }
249
+ })
250
+ });
251
+ };
252
+ PastExpirationDateBanner.propTypes = {
253
+ courseId: _propTypes.default.string.isRequired,
254
+ accessExpirationDate: _propTypes.default.PropTypes.instanceOf(Date).isRequired,
255
+ timezoneFormatArgs: _propTypes.default.shape({
256
+ timeZone: _propTypes.default.string
257
+ }),
258
+ setupgradeNotificationCurrentState: _propTypes.default.func
259
+ };
260
+ PastExpirationDateBanner.defaultProps = {
261
+ timezoneFormatArgs: {},
262
+ setupgradeNotificationCurrentState: null
263
+ };
264
+ const DefaultUpgradeNotification = _ref5 => {
265
+ let {
266
+ id,
267
+ courseId,
268
+ setNotificationCurrentState,
269
+ toggleSidebar
270
+ } = _ref5;
271
+ const pluginLocationId = id;
37
272
  const {
38
273
  org,
39
274
  userTimezone,
@@ -46,27 +281,218 @@ const DefaultUpgradeNotification = props => {
46
281
  offer,
47
282
  timeOffsetMillis
48
283
  } = (0, _modelStore.useModel)('coursewareMeta', courseId);
284
+ const dateNow = Date.now();
285
+ const timezoneFormatArgs = userTimezone ? {
286
+ timeZone: userTimezone
287
+ } : {};
288
+ const correctedTime = new Date(dateNow + timeOffsetMillis);
289
+ const accessExpirationDate = accessExpiration ? new Date(accessExpiration.expirationDate) : null;
290
+ const pastExpirationDeadline = accessExpiration ? new Date(dateNow) > accessExpirationDate : false;
49
291
  const shouldDisplayBorder = pluginLocationId !== 'outline_tab_notifications';
50
292
  const upsellPageName = pluginLocationId === 'outline_tab_notifications' ? 'course_home' : 'in_course';
293
+ const setupgradeNotificationCurrentState = setNotificationCurrentState;
294
+ const eventProperties = {
295
+ org_key: org,
296
+ courserun_key: courseId
297
+ };
298
+ const promotionEventProperties = _objectSpread({
299
+ creative: 'sidebarupsell',
300
+ name: 'In-Course Verification Prompt',
301
+ position: 'sidebar-message',
302
+ promotion_id: 'courseware_verified_certificate_upsell'
303
+ }, eventProperties);
304
+ (0, _react.useEffect)(() => {
305
+ (0, _analytics.sendTrackingLogEvent)('edx.bi.course.upgrade.sidebarupsell.displayed', eventProperties);
306
+ (0, _analytics.sendTrackEvent)('Promotion Viewed', promotionEventProperties);
307
+ // eslint-disable-next-line react-hooks/exhaustive-deps
308
+ }, []);
309
+ if (!verifiedMode) {
310
+ return null;
311
+ }
312
+ const logClick = () => {
313
+ (0, _analytics.sendTrackingLogEvent)('edx.bi.course.upgrade.sidebarupsell.clicked', eventProperties);
314
+ (0, _analytics.sendTrackingLogEvent)('edx.course.enrollment.upgrade.clicked', _objectSpread(_objectSpread({}, eventProperties), {}, {
315
+ location: 'sidebar-message'
316
+ }));
317
+ (0, _analytics.sendTrackEvent)('Promotion Clicked', promotionEventProperties);
318
+ (0, _analytics.sendTrackEvent)('edx.bi.ecommerce.upsell_links_clicked', _objectSpread(_objectSpread({}, eventProperties), {}, {
319
+ linkCategory: 'green_upgrade',
320
+ linkName: `${upsellPageName}_green`,
321
+ linkType: 'button',
322
+ pageName: upsellPageName
323
+ }));
324
+ };
325
+ const logClickPastExpiration = () => {
326
+ (0, _analytics.sendTrackEvent)('edx.bi.ecommerce.upgrade_notification.past_expiration.button_clicked', _objectSpread(_objectSpread({}, eventProperties), {}, {
327
+ linkCategory: 'upgrade_notification',
328
+ linkName: `${upsellPageName}_course_details`,
329
+ linkType: 'button',
330
+ pageName: upsellPageName
331
+ }));
332
+ };
51
333
 
52
- // WARNING: This component renders the default UpgradeNotification feature. Do not modify the render function
53
- // without considering the impact to this experience.
54
- return /*#__PURE__*/(0, _jsxRuntime.jsx)(_UpgradeNotification.default, _objectSpread(_objectSpread({}, props), {}, {
55
- accessExpiration: accessExpiration,
56
- contentTypeGatingEnabled: contentTypeGatingEnabled,
57
- marketingUrl: marketingUrl,
58
- offer: offer,
59
- org: org,
60
- shouldDisplayBorder: shouldDisplayBorder,
61
- timeOffsetMillis: timeOffsetMillis,
62
- upsellPageName: upsellPageName,
63
- userTimezone: userTimezone,
64
- verifiedMode: verifiedMode
65
- }));
334
+ /*
335
+ There are 5 parts that change in the upgrade card:
336
+ upgradeNotificationHeaderText
337
+ expirationBanner
338
+ upsellMessage
339
+ callToActionButton
340
+ offerCode
341
+ */
342
+ let upgradeNotificationHeaderText;
343
+ let expirationBanner;
344
+ let upsellMessage;
345
+ let callToActionButton;
346
+ let offerCode;
347
+ if (!!accessExpiration && !!contentTypeGatingEnabled) {
348
+ const hoursToAccessExpiration = Math.floor((accessExpirationDate - correctedTime) / 1000 / 60 / 60);
349
+ if (hoursToAccessExpiration >= 7 * 24) {
350
+ if (offer) {
351
+ // countdown to the first purchase discount if there is one
352
+ const hoursToDiscountExpiration = Math.floor((new Date(offer.expirationDate) - correctedTime) / 1000 / 60 / 60);
353
+ upgradeNotificationHeaderText = /*#__PURE__*/(0, _jsxRuntime.jsx)(_i18n.FormattedMessage, {
354
+ id: "advertisements.upgradeNotification.firstTimeLearnerDiscount",
355
+ defaultMessage: "{percentage}% First-Time Learner Discount",
356
+ values: {
357
+ percentage: offer.percentage
358
+ }
359
+ });
360
+ expirationBanner = /*#__PURE__*/(0, _jsxRuntime.jsx)(ExpirationCountdown, {
361
+ courseId: courseId,
362
+ hoursToExpiration: hoursToDiscountExpiration,
363
+ setupgradeNotificationCurrentState: setupgradeNotificationCurrentState,
364
+ type: "offer"
365
+ });
366
+ } else {
367
+ upgradeNotificationHeaderText = /*#__PURE__*/(0, _jsxRuntime.jsx)(_i18n.FormattedMessage, {
368
+ id: "advertisements.upgradeNotification.accessExpiration",
369
+ defaultMessage: "Upgrade your course today"
370
+ });
371
+ expirationBanner = /*#__PURE__*/(0, _jsxRuntime.jsx)(AccessExpirationDateBanner, {
372
+ courseId: courseId,
373
+ accessExpirationDate: accessExpirationDate,
374
+ timezoneFormatArgs: timezoneFormatArgs,
375
+ setupgradeNotificationCurrentState: setupgradeNotificationCurrentState
376
+ });
377
+ }
378
+ upsellMessage = /*#__PURE__*/(0, _jsxRuntime.jsx)(UpsellFBEFarAwayCardContent, {});
379
+ } else if (hoursToAccessExpiration < 7 * 24 && hoursToAccessExpiration >= 0) {
380
+ // more urgent messaging if there's less than 7 days left to access expiration
381
+ upgradeNotificationHeaderText = /*#__PURE__*/(0, _jsxRuntime.jsx)(_i18n.FormattedMessage, {
382
+ id: "advertisements.upgradeNotification.accessExpirationUrgent",
383
+ defaultMessage: "Course Access Expiration"
384
+ });
385
+ expirationBanner = /*#__PURE__*/(0, _jsxRuntime.jsx)(ExpirationCountdown, {
386
+ courseId: courseId,
387
+ hoursToExpiration: hoursToAccessExpiration,
388
+ setupgradeNotificationCurrentState: setupgradeNotificationCurrentState,
389
+ type: "access"
390
+ });
391
+ upsellMessage = /*#__PURE__*/(0, _jsxRuntime.jsx)(UpsellFBESoonCardContent, {
392
+ accessExpirationDate: accessExpirationDate,
393
+ timezoneFormatArgs: timezoneFormatArgs
394
+ });
395
+ } else {
396
+ // access expiration deadline has passed
397
+ upgradeNotificationHeaderText = /*#__PURE__*/(0, _jsxRuntime.jsx)(_i18n.FormattedMessage, {
398
+ id: "advertisements.upgradeNotification.accessExpirationPast",
399
+ defaultMessage: "Course Access Expiration"
400
+ });
401
+ expirationBanner = /*#__PURE__*/(0, _jsxRuntime.jsx)(PastExpirationDateBanner, {
402
+ courseId: courseId,
403
+ accessExpirationDate: accessExpirationDate,
404
+ timezoneFormatArgs: timezoneFormatArgs,
405
+ setupgradeNotificationCurrentState: setupgradeNotificationCurrentState
406
+ });
407
+ upsellMessage = /*#__PURE__*/(0, _jsxRuntime.jsx)(PastExpirationCardContent, {});
408
+ }
409
+ } else {
410
+ // FBE is turned off
411
+ upgradeNotificationHeaderText = /*#__PURE__*/(0, _jsxRuntime.jsx)(_i18n.FormattedMessage, {
412
+ id: "advertisements.upgradeNotification.pursueAverifiedCertificate",
413
+ defaultMessage: "Pursue a verified certificate"
414
+ });
415
+ upsellMessage = /*#__PURE__*/(0, _jsxRuntime.jsx)(UpsellNoFBECardContent, {});
416
+ }
417
+ if (pastExpirationDeadline) {
418
+ callToActionButton = /*#__PURE__*/(0, _jsxRuntime.jsx)(_paragon.Button, {
419
+ variant: "primary",
420
+ onClick: logClickPastExpiration,
421
+ href: marketingUrl,
422
+ block: true,
423
+ children: "View Course Details"
424
+ });
425
+ } else {
426
+ callToActionButton = /*#__PURE__*/(0, _jsxRuntime.jsx)(_upgradeButton.UpgradeButton, {
427
+ offer: offer,
428
+ onClick: logClick,
429
+ verifiedMode: verifiedMode,
430
+ block: true
431
+ });
432
+ }
433
+ if (offer) {
434
+ // if there's a first purchase discount, message the code at the bottom
435
+ offerCode = /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
436
+ className: "text-center discount-info",
437
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_i18n.FormattedMessage, {
438
+ id: "advertisements.upgradeNotification.code",
439
+ defaultMessage: "Use code {code} at checkout",
440
+ values: {
441
+ code: /*#__PURE__*/(0, _jsxRuntime.jsx)("span", {
442
+ className: "font-weight-bold",
443
+ children: offer.code
444
+ })
445
+ }
446
+ })
447
+ });
448
+ }
449
+ const closeAltText = /*#__PURE__*/(0, _jsxRuntime.jsx)(_i18n.FormattedMessage, {
450
+ id: "advertisements.close",
451
+ defaultMessage: "Close"
452
+ });
453
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)("section", {
454
+ className: (0, _classnames.default)('upgrade-notification small', {
455
+ 'card mb-4': shouldDisplayBorder
456
+ }),
457
+ children: /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
458
+ id: "courseHome-upgradeNotification",
459
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_certificatePreview.default, {
460
+ courseId: courseId
461
+ }), /*#__PURE__*/(0, _jsxRuntime.jsxs)("h2", {
462
+ className: (0, _classnames.default)('h5 upgrade-notification-header', {
463
+ 'd-flex align-items-center mr-2 ml-4 my-1.5 font-size-18': !!toggleSidebar
464
+ }),
465
+ id: "outline-sidebar-upgrade-header",
466
+ children: [upgradeNotificationHeaderText, !!toggleSidebar && /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
467
+ className: "d-inline-flex ml-auto",
468
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_paragon.IconButton, {
469
+ src: _icons.Close,
470
+ size: "sm",
471
+ iconAs: _paragon.Icon,
472
+ onClick: toggleSidebar,
473
+ className: "icon-hover",
474
+ alt: closeAltText
475
+ })
476
+ })]
477
+ }), expirationBanner, /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
478
+ className: "upgrade-notification-message",
479
+ children: upsellMessage
480
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
481
+ className: "upgrade-notification-button",
482
+ children: callToActionButton
483
+ }), offerCode]
484
+ })
485
+ });
66
486
  };
67
487
  DefaultUpgradeNotification.propTypes = {
68
488
  id: _propTypes.default.string.isRequired,
69
- courseId: _propTypes.default.string.isRequired
489
+ courseId: _propTypes.default.string.isRequired,
490
+ setNotificationCurrentState: _propTypes.default.func,
491
+ toggleSidebar: _propTypes.default.func
492
+ };
493
+ DefaultUpgradeNotification.defaultProps = {
494
+ setNotificationCurrentState: null,
495
+ toggleSidebar: null
70
496
  };
71
- var _default = exports.default = DefaultUpgradeNotification;
497
+ var _default = exports.default = (0, _i18n.injectIntl)(DefaultUpgradeNotification);
72
498
  //# sourceMappingURL=DefaultUpgradeNotification.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"DefaultUpgradeNotification.js","names":["_propTypes","_interopRequireDefault","require","_modelStore","_UpgradeNotification","_jsxRuntime","obj","__esModule","default","ownKeys","e","r","t","Object","keys","getOwnPropertySymbols","o","filter","getOwnPropertyDescriptor","enumerable","push","apply","_objectSpread","arguments","length","forEach","_defineProperty","getOwnPropertyDescriptors","defineProperties","defineProperty","key","value","_toPropertyKey","configurable","writable","i","_toPrimitive","Symbol","toPrimitive","call","TypeError","String","Number","DefaultUpgradeNotification","props","courseId","id","pluginLocationId","org","userTimezone","verifiedMode","useModel","accessExpiration","contentTypeGatingEnabled","marketingUrl","offer","timeOffsetMillis","shouldDisplayBorder","upsellPageName","jsx","propTypes","PropTypes","string","isRequired","_default","exports"],"sources":["../../src/upgrade-notification/DefaultUpgradeNotification.jsx"],"sourcesContent":["/* eslint-disable import/no-unresolved */\nimport PropTypes from 'prop-types';\n\nimport { useModel } from '@src/generic/model-store';\nimport UpgradeNotification from '@src/generic/upgrade-notification/UpgradeNotification';\n\nconst DefaultUpgradeNotification = (props) => {\n /*\n NOTE: The following props are expected to be passed in from the parent.\n - courseId\n - from all PluginSlots\n - notificationCurrentState\n - from notification_widget_slot and notification_tray_plugin PluginSlots but not\n outline_tab_notifications_plugin PluginSlot\n - NOTE: not currently in use by these widgets\n - setNotificationCurrentState\n - from notification_widget_slot and notification_tray_plugin PluginSlots but not\n outline_tab_notifications_plugin PluginSlot\n - toggleSidebar\n - from notification_widget_slot PluginSlot but not notification_tray_plugin and\n outline_tab_notifications_plugin PluginSlots\n */\n const { courseId, id: pluginLocationId } = props;\n\n const {\n org,\n userTimezone,\n verifiedMode,\n } = useModel('courseHomeMeta', courseId);\n\n const {\n accessExpiration,\n contentTypeGatingEnabled,\n marketingUrl,\n offer,\n timeOffsetMillis,\n } = useModel('coursewareMeta', courseId);\n\n const shouldDisplayBorder = pluginLocationId !== 'outline_tab_notifications';\n const upsellPageName = pluginLocationId === 'outline_tab_notifications' ? 'course_home' : 'in_course';\n\n // WARNING: This component renders the default UpgradeNotification feature. Do not modify the render function\n // without considering the impact to this experience.\n return (\n <UpgradeNotification\n {...props}\n accessExpiration={accessExpiration}\n contentTypeGatingEnabled={contentTypeGatingEnabled}\n marketingUrl={marketingUrl}\n offer={offer}\n org={org}\n shouldDisplayBorder={shouldDisplayBorder}\n timeOffsetMillis={timeOffsetMillis}\n upsellPageName={upsellPageName}\n userTimezone={userTimezone}\n verifiedMode={verifiedMode}\n />\n );\n};\n\nDefaultUpgradeNotification.propTypes = {\n id: PropTypes.string.isRequired,\n courseId: PropTypes.string.isRequired,\n};\n\nexport default DefaultUpgradeNotification;\n"],"mappings":";;;;;;AACA,IAAAA,UAAA,GAAAC,sBAAA,CAAAC,OAAA;AAEA,IAAAC,WAAA,GAAAD,OAAA;AACA,IAAAE,oBAAA,GAAAH,sBAAA,CAAAC,OAAA;AAAwF,IAAAG,WAAA,GAAAH,OAAA;AAAA,SAAAD,uBAAAK,GAAA,WAAAA,GAAA,IAAAA,GAAA,CAAAC,UAAA,GAAAD,GAAA,KAAAE,OAAA,EAAAF,GAAA;AAAA,SAAAG,QAAAC,CAAA,EAAAC,CAAA,QAAAC,CAAA,GAAAC,MAAA,CAAAC,IAAA,CAAAJ,CAAA,OAAAG,MAAA,CAAAE,qBAAA,QAAAC,CAAA,GAAAH,MAAA,CAAAE,qBAAA,CAAAL,CAAA,GAAAC,CAAA,KAAAK,CAAA,GAAAA,CAAA,CAAAC,MAAA,WAAAN,CAAA,WAAAE,MAAA,CAAAK,wBAAA,CAAAR,CAAA,EAAAC,CAAA,EAAAQ,UAAA,OAAAP,CAAA,CAAAQ,IAAA,CAAAC,KAAA,CAAAT,CAAA,EAAAI,CAAA,YAAAJ,CAAA;AAAA,SAAAU,cAAAZ,CAAA,aAAAC,CAAA,MAAAA,CAAA,GAAAY,SAAA,CAAAC,MAAA,EAAAb,CAAA,UAAAC,CAAA,WAAAW,SAAA,CAAAZ,CAAA,IAAAY,SAAA,CAAAZ,CAAA,QAAAA,CAAA,OAAAF,OAAA,CAAAI,MAAA,CAAAD,CAAA,OAAAa,OAAA,WAAAd,CAAA,IAAAe,eAAA,CAAAhB,CAAA,EAAAC,CAAA,EAAAC,CAAA,CAAAD,CAAA,SAAAE,MAAA,CAAAc,yBAAA,GAAAd,MAAA,CAAAe,gBAAA,CAAAlB,CAAA,EAAAG,MAAA,CAAAc,yBAAA,CAAAf,CAAA,KAAAH,OAAA,CAAAI,MAAA,CAAAD,CAAA,GAAAa,OAAA,WAAAd,CAAA,IAAAE,MAAA,CAAAgB,cAAA,CAAAnB,CAAA,EAAAC,CAAA,EAAAE,MAAA,CAAAK,wBAAA,CAAAN,CAAA,EAAAD,CAAA,iBAAAD,CAAA;AAAA,SAAAgB,gBAAApB,GAAA,EAAAwB,GAAA,EAAAC,KAAA,IAAAD,GAAA,GAAAE,cAAA,CAAAF,GAAA,OAAAA,GAAA,IAAAxB,GAAA,IAAAO,MAAA,CAAAgB,cAAA,CAAAvB,GAAA,EAAAwB,GAAA,IAAAC,KAAA,EAAAA,KAAA,EAAAZ,UAAA,QAAAc,YAAA,QAAAC,QAAA,oBAAA5B,GAAA,CAAAwB,GAAA,IAAAC,KAAA,WAAAzB,GAAA;AAAA,SAAA0B,eAAApB,CAAA,QAAAuB,CAAA,GAAAC,YAAA,CAAAxB,CAAA,uCAAAuB,CAAA,GAAAA,CAAA,GAAAA,CAAA;AAAA,SAAAC,aAAAxB,CAAA,EAAAD,CAAA,2BAAAC,CAAA,KAAAA,CAAA,SAAAA,CAAA,MAAAF,CAAA,GAAAE,CAAA,CAAAyB,MAAA,CAAAC,WAAA,kBAAA5B,CAAA,QAAAyB,CAAA,GAAAzB,CAAA,CAAA6B,IAAA,CAAA3B,CAAA,EAAAD,CAAA,uCAAAwB,CAAA,SAAAA,CAAA,YAAAK,SAAA,yEAAA7B,CAAA,GAAA8B,MAAA,GAAAC,MAAA,EAAA9B,CAAA,KAJxF;AAMA,MAAM+B,0BAA0B,GAAIC,KAAK,IAAK;EAC5C;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACE,MAAM;IAAEC,QAAQ;IAAEC,EAAE,EAAEC;EAAiB,CAAC,GAAGH,KAAK;EAEhD,MAAM;IACJI,GAAG;IACHC,YAAY;IACZC;EACF,CAAC,GAAG,IAAAC,oBAAQ,EAAC,gBAAgB,EAAEN,QAAQ,CAAC;EAExC,MAAM;IACJO,gBAAgB;IAChBC,wBAAwB;IACxBC,YAAY;IACZC,KAAK;IACLC;EACF,CAAC,GAAG,IAAAL,oBAAQ,EAAC,gBAAgB,EAAEN,QAAQ,CAAC;EAExC,MAAMY,mBAAmB,GAAGV,gBAAgB,KAAK,2BAA2B;EAC5E,MAAMW,cAAc,GAAGX,gBAAgB,KAAK,2BAA2B,GAAG,aAAa,GAAG,WAAW;;EAErG;EACA;EACA,oBACE,IAAA1C,WAAA,CAAAsD,GAAA,EAACvD,oBAAA,CAAAI,OAAmB,EAAAc,aAAA,CAAAA,aAAA,KACdsB,KAAK;IACTQ,gBAAgB,EAAEA,gBAAiB;IACnCC,wBAAwB,EAAEA,wBAAyB;IACnDC,YAAY,EAAEA,YAAa;IAC3BC,KAAK,EAAEA,KAAM;IACbP,GAAG,EAAEA,GAAI;IACTS,mBAAmB,EAAEA,mBAAoB;IACzCD,gBAAgB,EAAEA,gBAAiB;IACnCE,cAAc,EAAEA,cAAe;IAC/BT,YAAY,EAAEA,YAAa;IAC3BC,YAAY,EAAEA;EAAa,EAC5B,CAAC;AAEN,CAAC;AAEDP,0BAA0B,CAACiB,SAAS,GAAG;EACrCd,EAAE,EAAEe,kBAAS,CAACC,MAAM,CAACC,UAAU;EAC/BlB,QAAQ,EAAEgB,kBAAS,CAACC,MAAM,CAACC;AAC7B,CAAC;AAAC,IAAAC,QAAA,GAAAC,OAAA,CAAAzD,OAAA,GAEamC,0BAA0B","ignoreList":[]}
1
+ {"version":3,"file":"DefaultUpgradeNotification.js","names":["_react","_interopRequireWildcard","require","_propTypes","_interopRequireDefault","_classnames","_i18n","_analytics","_paragon","_icons","_localStorage","_upgradeButton","_modelStore","_upsellBullets","_certificatePreview","_jsxRuntime","obj","__esModule","default","_getRequireWildcardCache","e","WeakMap","r","t","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","hasOwnProperty","call","i","set","ownKeys","keys","getOwnPropertySymbols","o","filter","enumerable","push","apply","_objectSpread","arguments","length","forEach","_defineProperty","getOwnPropertyDescriptors","defineProperties","key","value","_toPropertyKey","configurable","writable","_toPrimitive","Symbol","toPrimitive","TypeError","String","Number","UpsellNoFBECardContent","jsxs","className","children","jsx","VerifiedCertBullet","SupportMissionBullet","UpsellFBEFarAwayCardContent","UnlockGradedBullet","FullAccessBullet","UpsellFBESoonCardContent","_ref","accessExpirationDate","timezoneFormatArgs","includingAnyProgress","FormattedMessage","id","defaultMessage","date","FormattedDate","day","month","Date","benefitsOfUpgrading","rel","target","href","values","propTypes","PropTypes","instanceOf","isRequired","shape","timeZone","string","defaultProps","PastExpirationCardContent","ExpirationCountdown","_ref2","courseId","hoursToExpiration","setupgradeNotificationCurrentState","type","expirationText","setLocalStorage","dayCount","Math","floor","hourCount","number","func","AccessExpirationDateBanner","_ref3","PastExpirationDateBanner","_ref4","DefaultUpgradeNotification","_ref5","setNotificationCurrentState","toggleSidebar","pluginLocationId","org","userTimezone","verifiedMode","useModel","accessExpiration","contentTypeGatingEnabled","marketingUrl","offer","timeOffsetMillis","dateNow","now","correctedTime","expirationDate","pastExpirationDeadline","shouldDisplayBorder","upsellPageName","eventProperties","org_key","courserun_key","promotionEventProperties","creative","name","position","promotion_id","useEffect","sendTrackingLogEvent","sendTrackEvent","logClick","location","linkCategory","linkName","linkType","pageName","logClickPastExpiration","upgradeNotificationHeaderText","expirationBanner","upsellMessage","callToActionButton","offerCode","hoursToAccessExpiration","hoursToDiscountExpiration","percentage","Button","variant","onClick","block","UpgradeButton","code","closeAltText","classNames","IconButton","src","Close","size","iconAs","Icon","alt","_default","exports","injectIntl"],"sources":["../../src/upgrade-notification/DefaultUpgradeNotification.jsx"],"sourcesContent":["/* eslint import/no-unresolved: 0 */\nimport React, { useEffect } from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport {\n FormattedDate, FormattedMessage, injectIntl,\n} from '@edx/frontend-platform/i18n';\nimport { sendTrackEvent, sendTrackingLogEvent } from '@edx/frontend-platform/analytics';\nimport { Button, Icon, IconButton } from '@openedx/paragon';\nimport { Close } from '@openedx/paragon/icons';\nimport { setLocalStorage } from '@src/data/localStorage';\nimport { UpgradeButton } from '@src/generic/upgrade-button';\nimport { useModel } from '@src/generic/model-store';\nimport {\n VerifiedCertBullet,\n UnlockGradedBullet,\n FullAccessBullet,\n SupportMissionBullet,\n} from '../upsell-bullets';\n\nimport CertificatePreview from './certificate-preview';\n\nconst UpsellNoFBECardContent = () => (\n <ul className=\"fa-ul upgrade-notification-ul pt-0\">\n <VerifiedCertBullet />\n <SupportMissionBullet />\n </ul>\n);\n\nconst UpsellFBEFarAwayCardContent = () => (\n <ul className=\"fa-ul upgrade-notification-ul\">\n <VerifiedCertBullet />\n <UnlockGradedBullet />\n <FullAccessBullet />\n <SupportMissionBullet />\n </ul>\n);\n\nconst UpsellFBESoonCardContent = ({ accessExpirationDate, timezoneFormatArgs }) => {\n const includingAnyProgress = (\n <span className=\"font-weight-bold\">\n <FormattedMessage\n id=\"advertisements.upgradeNotification.expirationAccessLoss.progress\"\n defaultMessage=\"including any progress\"\n />\n </span>\n );\n\n const date = (\n <FormattedDate\n key=\"accessDate\"\n day=\"numeric\"\n month=\"long\"\n value={new Date(accessExpirationDate)}\n {...timezoneFormatArgs}\n />\n );\n\n const benefitsOfUpgrading = (\n <a className=\"inline-link-underline font-weight-bold\" rel=\"noopener noreferrer\" target=\"_blank\" href=\"https://support.edx.org/hc/en-us/articles/360013426573-What-are-the-differences-between-audit-free-and-verified-paid-courses-\">\n <FormattedMessage\n id=\"advertisements.upgradeNotification.expirationVerifiedCert.benefits\"\n defaultMessage=\"benefits of upgrading\"\n />\n </a>\n );\n\n return (\n <div className=\"upgrade-notification-text\">\n <p>\n <FormattedMessage\n id=\"advertisements.upgradeNotification.expirationAccessLoss\"\n defaultMessage=\"You will lose all access to this course, {includingAnyProgress}, on {date}.\"\n values={{\n includingAnyProgress,\n date,\n }}\n />\n </p>\n <p>\n <FormattedMessage\n id=\"advertisements.upgradeNotification.expirationVerifiedCert\"\n defaultMessage=\"Upgrading your course enables you to pursue a verified certificate and unlocks numerous features. Learn more about the {benefitsOfUpgrading}.\"\n values={{ benefitsOfUpgrading }}\n />\n </p>\n </div>\n );\n};\n\nUpsellFBESoonCardContent.propTypes = {\n accessExpirationDate: PropTypes.PropTypes.instanceOf(Date).isRequired,\n timezoneFormatArgs: PropTypes.shape({\n timeZone: PropTypes.string,\n }),\n};\n\nUpsellFBESoonCardContent.defaultProps = {\n timezoneFormatArgs: {},\n};\n\nconst PastExpirationCardContent = () => (\n <div className=\"upgrade-notification-text\">\n <p>\n <FormattedMessage\n id=\"advertisements.upgradeNotification.pastExpiration.content\"\n defaultMessage=\"The upgrade deadline for this course passed. To upgrade, enroll in the next available session.\"\n />\n </p>\n </div>\n);\n\nconst ExpirationCountdown = ({\n courseId, hoursToExpiration, setupgradeNotificationCurrentState, type,\n}) => {\n let expirationText;\n if (hoursToExpiration >= 24) { // More than 1 day left\n // setupgradeNotificationCurrentState is available in NotificationTray (not course home)\n if (setupgradeNotificationCurrentState) {\n if (type === 'access') {\n setupgradeNotificationCurrentState('accessDaysLeft');\n setLocalStorage(`upgradeNotificationCurrentState.${courseId}`, 'accessDaysLeft');\n }\n if (type === 'offer') {\n setupgradeNotificationCurrentState('FPDdaysLeft');\n setLocalStorage(`upgradeNotificationCurrentState.${courseId}`, 'FPDdaysLeft');\n }\n }\n expirationText = (\n <FormattedMessage\n id=\"advertisements.upgradeNotification.expirationDays\"\n defaultMessage={`{dayCount, number} {dayCount, plural,\n one {day}\n other {days}} left`}\n values={{\n dayCount: (Math.floor(hoursToExpiration / 24)),\n }}\n />\n );\n } else if (hoursToExpiration >= 1) { // More than 1 hour left\n // setupgradeNotificationCurrentState is available in NotificationTray (not course home)\n if (setupgradeNotificationCurrentState) {\n if (type === 'access') {\n setupgradeNotificationCurrentState('accessHoursLeft');\n setLocalStorage(`upgradeNotificationCurrentState.${courseId}`, 'accessHoursLeft');\n }\n if (type === 'offer') {\n setupgradeNotificationCurrentState('FPDHoursLeft');\n setLocalStorage(`upgradeNotificationCurrentState.${courseId}`, 'FPDHoursLeft');\n }\n }\n expirationText = (\n <FormattedMessage\n id=\"advertisements.upgradeNotification.expirationHours\"\n defaultMessage={`{hourCount, number} {hourCount, plural,\n one {hour}\n other {hours}} left`}\n values={{\n hourCount: (hoursToExpiration),\n }}\n />\n );\n } else { // Less than 1 hour\n // setupgradeNotificationCurrentState is available in NotificationTray (not course home)\n if (setupgradeNotificationCurrentState) {\n if (type === 'access') {\n setupgradeNotificationCurrentState('accessLastHour');\n setLocalStorage(`upgradeNotificationCurrentState.${courseId}`, 'accessLastHour');\n }\n if (type === 'offer') {\n setupgradeNotificationCurrentState('FPDLastHour');\n setLocalStorage(`upgradeNotificationCurrentState.${courseId}`, 'FPDLastHour');\n }\n }\n expirationText = (\n <FormattedMessage\n id=\"advertisements.upgradeNotification.expirationMinutes\"\n defaultMessage=\"Less than 1 hour left\"\n />\n );\n }\n return (<div className=\"upsell-warning\">{expirationText}</div>);\n};\n\nExpirationCountdown.propTypes = {\n courseId: PropTypes.string.isRequired,\n hoursToExpiration: PropTypes.number.isRequired,\n setupgradeNotificationCurrentState: PropTypes.func,\n type: PropTypes.string,\n};\nExpirationCountdown.defaultProps = {\n setupgradeNotificationCurrentState: null,\n type: null,\n};\n\nconst AccessExpirationDateBanner = ({\n courseId, accessExpirationDate, timezoneFormatArgs, setupgradeNotificationCurrentState,\n}) => {\n if (setupgradeNotificationCurrentState) {\n setupgradeNotificationCurrentState('accessDateView');\n setLocalStorage(`upgradeNotificationCurrentState.${courseId}`, 'accessDateView');\n }\n return (\n <div className=\"upsell-warning-light\">\n <FormattedMessage\n id=\"advertisements.upgradeNotification.expiration\"\n defaultMessage=\"Course access will expire {date}\"\n values={{\n date: (\n <FormattedDate\n key=\"accessExpireDate\"\n day=\"numeric\"\n month=\"long\"\n value={accessExpirationDate}\n {...timezoneFormatArgs}\n />\n ),\n }}\n />\n </div>\n );\n};\n\nAccessExpirationDateBanner.propTypes = {\n courseId: PropTypes.string.isRequired,\n accessExpirationDate: PropTypes.PropTypes.instanceOf(Date).isRequired,\n timezoneFormatArgs: PropTypes.shape({\n timeZone: PropTypes.string,\n }),\n setupgradeNotificationCurrentState: PropTypes.func,\n};\n\nAccessExpirationDateBanner.defaultProps = {\n timezoneFormatArgs: {},\n setupgradeNotificationCurrentState: null,\n};\n\nconst PastExpirationDateBanner = ({\n courseId, accessExpirationDate, timezoneFormatArgs, setupgradeNotificationCurrentState,\n}) => {\n if (setupgradeNotificationCurrentState) {\n setupgradeNotificationCurrentState('PastExpirationDate');\n setLocalStorage(`upgradeNotificationCurrentState.${courseId}`, 'PastExpirationDate');\n }\n return (\n <div className=\"upsell-warning\">\n <FormattedMessage\n id=\"advertisements.upgradeNotification.pastExpiration.banner\"\n defaultMessage=\"Upgrade deadline passed on {date}\"\n values={{\n date: (\n <FormattedDate\n key=\"accessExpireDate\"\n day=\"numeric\"\n month=\"long\"\n value={accessExpirationDate}\n {...timezoneFormatArgs}\n />\n ),\n }}\n />\n </div>\n );\n};\n\nPastExpirationDateBanner.propTypes = {\n courseId: PropTypes.string.isRequired,\n accessExpirationDate: PropTypes.PropTypes.instanceOf(Date).isRequired,\n timezoneFormatArgs: PropTypes.shape({\n timeZone: PropTypes.string,\n }),\n setupgradeNotificationCurrentState: PropTypes.func,\n};\n\nPastExpirationDateBanner.defaultProps = {\n timezoneFormatArgs: {},\n setupgradeNotificationCurrentState: null,\n};\n\nconst DefaultUpgradeNotification = ({\n id,\n courseId,\n setNotificationCurrentState,\n toggleSidebar,\n}) => {\n const pluginLocationId = id;\n\n const {\n org,\n userTimezone,\n verifiedMode,\n } = useModel('courseHomeMeta', courseId);\n\n const {\n accessExpiration,\n contentTypeGatingEnabled,\n marketingUrl,\n offer,\n timeOffsetMillis,\n } = useModel('coursewareMeta', courseId);\n\n const dateNow = Date.now();\n const timezoneFormatArgs = userTimezone ? { timeZone: userTimezone } : {};\n const correctedTime = new Date(dateNow + timeOffsetMillis);\n const accessExpirationDate = accessExpiration ? new Date(accessExpiration.expirationDate) : null;\n const pastExpirationDeadline = accessExpiration ? new Date(dateNow) > accessExpirationDate : false;\n const shouldDisplayBorder = pluginLocationId !== 'outline_tab_notifications';\n const upsellPageName = pluginLocationId === 'outline_tab_notifications' ? 'course_home' : 'in_course';\n const setupgradeNotificationCurrentState = setNotificationCurrentState;\n\n const eventProperties = {\n org_key: org,\n courserun_key: courseId,\n };\n\n const promotionEventProperties = {\n creative: 'sidebarupsell',\n name: 'In-Course Verification Prompt',\n position: 'sidebar-message',\n promotion_id: 'courseware_verified_certificate_upsell',\n ...eventProperties,\n };\n\n useEffect(() => {\n sendTrackingLogEvent('edx.bi.course.upgrade.sidebarupsell.displayed', eventProperties);\n sendTrackEvent('Promotion Viewed', promotionEventProperties);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n if (!verifiedMode) {\n return null;\n }\n\n const logClick = () => {\n sendTrackingLogEvent('edx.bi.course.upgrade.sidebarupsell.clicked', eventProperties);\n sendTrackingLogEvent('edx.course.enrollment.upgrade.clicked', {\n ...eventProperties,\n location: 'sidebar-message',\n });\n sendTrackEvent('Promotion Clicked', promotionEventProperties);\n sendTrackEvent('edx.bi.ecommerce.upsell_links_clicked', {\n ...eventProperties,\n linkCategory: 'green_upgrade',\n linkName: `${upsellPageName}_green`,\n linkType: 'button',\n pageName: upsellPageName,\n });\n };\n\n const logClickPastExpiration = () => {\n sendTrackEvent('edx.bi.ecommerce.upgrade_notification.past_expiration.button_clicked', {\n ...eventProperties,\n linkCategory: 'upgrade_notification',\n linkName: `${upsellPageName}_course_details`,\n linkType: 'button',\n pageName: upsellPageName,\n });\n };\n\n /*\n There are 5 parts that change in the upgrade card:\n upgradeNotificationHeaderText\n expirationBanner\n upsellMessage\n callToActionButton\n offerCode\n */\n let upgradeNotificationHeaderText;\n let expirationBanner;\n let upsellMessage;\n let callToActionButton;\n let offerCode;\n\n if (!!accessExpiration && !!contentTypeGatingEnabled) {\n const hoursToAccessExpiration = Math.floor((accessExpirationDate - correctedTime) / 1000 / 60 / 60);\n\n if (hoursToAccessExpiration >= (7 * 24)) {\n if (offer) { // countdown to the first purchase discount if there is one\n const hoursToDiscountExpiration = Math.floor((new Date(offer.expirationDate) - correctedTime) / 1000 / 60 / 60);\n upgradeNotificationHeaderText = (\n <FormattedMessage\n id=\"advertisements.upgradeNotification.firstTimeLearnerDiscount\"\n defaultMessage=\"{percentage}% First-Time Learner Discount\"\n values={{\n percentage: (offer.percentage),\n }}\n />\n );\n expirationBanner = (\n <ExpirationCountdown\n courseId={courseId}\n hoursToExpiration={hoursToDiscountExpiration}\n setupgradeNotificationCurrentState={setupgradeNotificationCurrentState}\n type=\"offer\"\n />\n );\n } else {\n upgradeNotificationHeaderText = (\n <FormattedMessage\n id=\"advertisements.upgradeNotification.accessExpiration\"\n defaultMessage=\"Upgrade your course today\"\n />\n );\n expirationBanner = (\n <AccessExpirationDateBanner\n courseId={courseId}\n accessExpirationDate={accessExpirationDate}\n timezoneFormatArgs={timezoneFormatArgs}\n setupgradeNotificationCurrentState={setupgradeNotificationCurrentState}\n />\n );\n }\n upsellMessage = <UpsellFBEFarAwayCardContent />;\n } else if (hoursToAccessExpiration < (7 * 24) && hoursToAccessExpiration >= 0) {\n // more urgent messaging if there's less than 7 days left to access expiration\n upgradeNotificationHeaderText = (\n <FormattedMessage\n id=\"advertisements.upgradeNotification.accessExpirationUrgent\"\n defaultMessage=\"Course Access Expiration\"\n />\n );\n expirationBanner = (\n <ExpirationCountdown\n courseId={courseId}\n hoursToExpiration={hoursToAccessExpiration}\n setupgradeNotificationCurrentState={setupgradeNotificationCurrentState}\n type=\"access\"\n />\n );\n upsellMessage = (\n <UpsellFBESoonCardContent\n accessExpirationDate={accessExpirationDate}\n timezoneFormatArgs={timezoneFormatArgs}\n />\n );\n } else { // access expiration deadline has passed\n upgradeNotificationHeaderText = (\n <FormattedMessage\n id=\"advertisements.upgradeNotification.accessExpirationPast\"\n defaultMessage=\"Course Access Expiration\"\n />\n );\n expirationBanner = (\n <PastExpirationDateBanner\n courseId={courseId}\n accessExpirationDate={accessExpirationDate}\n timezoneFormatArgs={timezoneFormatArgs}\n setupgradeNotificationCurrentState={setupgradeNotificationCurrentState}\n />\n );\n upsellMessage = (\n <PastExpirationCardContent />\n );\n }\n } else { // FBE is turned off\n upgradeNotificationHeaderText = (\n <FormattedMessage\n id=\"advertisements.upgradeNotification.pursueAverifiedCertificate\"\n defaultMessage=\"Pursue a verified certificate\"\n />\n );\n upsellMessage = (<UpsellNoFBECardContent />);\n }\n\n if (pastExpirationDeadline) {\n callToActionButton = (\n <Button\n variant=\"primary\"\n onClick={logClickPastExpiration}\n href={marketingUrl}\n block\n >\n View Course Details\n </Button>\n );\n } else {\n callToActionButton = (\n <UpgradeButton\n offer={offer}\n onClick={logClick}\n verifiedMode={verifiedMode}\n block\n />\n );\n }\n\n if (offer) { // if there's a first purchase discount, message the code at the bottom\n offerCode = (\n <div className=\"text-center discount-info\">\n <FormattedMessage\n id=\"advertisements.upgradeNotification.code\"\n defaultMessage=\"Use code {code} at checkout\"\n values={{\n code: (<span className=\"font-weight-bold\">{offer.code}</span>),\n }}\n />\n </div>\n );\n }\n\n const closeAltText = (\n <FormattedMessage\n id=\"advertisements.close\"\n defaultMessage=\"Close\"\n />\n );\n\n return (\n <section className={classNames('upgrade-notification small', { 'card mb-4': shouldDisplayBorder })}>\n <div id=\"courseHome-upgradeNotification\">\n <CertificatePreview courseId={courseId} />\n <h2\n className={classNames('h5 upgrade-notification-header', {\n 'd-flex align-items-center mr-2 ml-4 my-1.5 font-size-18': !!toggleSidebar,\n })}\n id=\"outline-sidebar-upgrade-header\"\n >\n {upgradeNotificationHeaderText}\n {!!toggleSidebar && (\n <div className=\"d-inline-flex ml-auto\">\n <IconButton\n src={Close}\n size=\"sm\"\n iconAs={Icon}\n onClick={toggleSidebar}\n className=\"icon-hover\"\n alt={closeAltText}\n />\n </div>\n )}\n </h2>\n {expirationBanner}\n <div className=\"upgrade-notification-message\">\n {upsellMessage}\n </div>\n <div className=\"upgrade-notification-button\">\n {callToActionButton}\n </div>\n {offerCode}\n </div>\n </section>\n );\n};\n\nDefaultUpgradeNotification.propTypes = {\n id: PropTypes.string.isRequired,\n courseId: PropTypes.string.isRequired,\n setNotificationCurrentState: PropTypes.func,\n toggleSidebar: PropTypes.func,\n};\n\nDefaultUpgradeNotification.defaultProps = {\n setNotificationCurrentState: null,\n toggleSidebar: null,\n};\n\nexport default injectIntl(DefaultUpgradeNotification);\n"],"mappings":"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","ignoreList":[]}