@edx/frontend-plugin-advertisements 2.25.0 → 2.26.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.
- package/dist/paywall/LockPaywall.js +26 -3
- package/dist/paywall/LockPaywall.js.map +1 -1
- package/dist/paywall/SubscriptionPaywall.js +99 -0
- package/dist/paywall/SubscriptionPaywall.js.map +1 -0
- package/dist/subscription-upsell/SubscriptionUpgradeCard.js +41 -20
- package/dist/subscription-upsell/SubscriptionUpgradeCard.js.map +1 -1
- package/dist/subscription-upsell/SubscriptionUpsell.js +20 -10
- package/dist/subscription-upsell/SubscriptionUpsell.js.map +1 -1
- package/dist/subscription-upsell/useSubscriptionOffer.js +19 -3
- package/dist/subscription-upsell/useSubscriptionOffer.js.map +1 -1
- package/dist/upgrade-notification/UpgradeNotification.js +51 -4
- package/dist/upgrade-notification/UpgradeNotification.js.map +1 -1
- package/dist/upgrade-to-complete-alert/UpgradeToCompleteAlert.js +28 -3
- package/dist/upgrade-to-complete-alert/UpgradeToCompleteAlert.js.map +1 -1
- package/dist/upgrade-to-complete-alert/track.js +4 -2
- package/dist/upgrade-to-complete-alert/track.js.map +1 -1
- package/package.json +1 -1
|
@@ -18,6 +18,8 @@ var _auth = require("@edx/frontend-platform/auth");
|
|
|
18
18
|
var _analytics = require("@edx/frontend-platform/analytics");
|
|
19
19
|
var _upsellBullets = require("../generic/upsell-bullets");
|
|
20
20
|
var _cohesion = require("../cohesion");
|
|
21
|
+
var _subscriptionUpsell = require("../subscription-upsell");
|
|
22
|
+
var _SubscriptionPaywall = _interopRequireDefault(require("./SubscriptionPaywall"));
|
|
21
23
|
var _jsxRuntime = require("react/jsx-runtime");
|
|
22
24
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
23
25
|
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; }
|
|
@@ -43,6 +45,7 @@ const LockPaywall = _ref => {
|
|
|
43
45
|
const {
|
|
44
46
|
conversion
|
|
45
47
|
} = (0, _cohesion.useCohesion)(courseId);
|
|
48
|
+
const subscriptionOffer = (0, _subscriptionUpsell.useSubscriptionOffer)(courseId);
|
|
46
49
|
|
|
47
50
|
// the following variables are set and used for responsive layout to work with
|
|
48
51
|
// whether the NotificationTray is open or not and if there's an offer with longer text
|
|
@@ -57,9 +60,6 @@ const LockPaywall = _ref => {
|
|
|
57
60
|
org_key: org,
|
|
58
61
|
courserun_key: courseId
|
|
59
62
|
};
|
|
60
|
-
const {
|
|
61
|
-
userId
|
|
62
|
-
} = (0, _auth.getAuthenticatedUser)();
|
|
63
63
|
const handleUpgradeClick = () => {
|
|
64
64
|
(0, _analytics.sendTrackEvent)('edx.bi.ecommerce.upsell_links_clicked', _objectSpread(_objectSpread({}, eventProperties), {}, {
|
|
65
65
|
linkCategory: '(none)',
|
|
@@ -69,6 +69,29 @@ const LockPaywall = _ref => {
|
|
|
69
69
|
}));
|
|
70
70
|
conversion('Upgraded');
|
|
71
71
|
};
|
|
72
|
+
const handleSubscribeClick = () => {
|
|
73
|
+
(0, _analytics.sendTrackEvent)('edx.bi.ecommerce.upsell_links_clicked', _objectSpread(_objectSpread({}, eventProperties), {}, {
|
|
74
|
+
linkCategory: '(none)',
|
|
75
|
+
linkName: 'in_course_subscribe',
|
|
76
|
+
linkType: 'link',
|
|
77
|
+
pageName: 'in_course'
|
|
78
|
+
}));
|
|
79
|
+
conversion('Subscribed');
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
// Learners who can subscribe get the Subscribe banner (Figma shows Subscribe only) and subscribers
|
|
83
|
+
// get the same banner with Upgrade now. Unknown status keeps the paywall below.
|
|
84
|
+
if (!pastExpirationDeadline && (subscriptionOffer?.canSubscribe || subscriptionOffer?.canUpgradeInPlace)) {
|
|
85
|
+
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_SubscriptionPaywall.default, {
|
|
86
|
+
courseId: courseId,
|
|
87
|
+
offer: subscriptionOffer,
|
|
88
|
+
onSubscribeClick: handleSubscribeClick,
|
|
89
|
+
onUpgradeEvent: stage => stage === 'succeeded' && handleUpgradeClick()
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
const {
|
|
93
|
+
userId
|
|
94
|
+
} = (0, _auth.getAuthenticatedUser)();
|
|
72
95
|
const handleUpgradeClickPastExpiration = () => {
|
|
73
96
|
(0, _analytics.sendTrackEvent)('edx.bi.ecommerce.gated_content.past_expiration.link_clicked', _objectSpread(_objectSpread({}, eventProperties), {}, {
|
|
74
97
|
linkCategory: 'gated_content',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LockPaywall.js","names":["_react","_interopRequireDefault","require","_propTypes","_classnames","_i18n","_paragon","_icons","_messages","_edX_locked_certificate","_modelStore","_upgradeButton","_auth","_analytics","_upsellBullets","_cohesion","_jsxRuntime","e","__esModule","default","ownKeys","r","t","Object","keys","getOwnPropertySymbols","o","filter","getOwnPropertyDescriptor","enumerable","push","apply","_objectSpread","arguments","length","forEach","_defineProperty","getOwnPropertyDescriptors","defineProperties","defineProperty","_toPropertyKey","value","configurable","writable","i","_toPrimitive","Symbol","toPrimitive","call","TypeError","String","Number","LockPaywall","_ref","courseId","intl","useIntl","course","useModel","accessExpiration","marketingUrl","offer","org","verifiedMode","conversion","useCohesion","shouldDisplayGatedContentTwoColumnsHalf","useWindowSize","width","breakpoints","large","minWidth","shouldWrapTextOnButton","extraSmall","accessExpirationDate","Date","expirationDate","pastExpirationDeadline","now","eventProperties","org_key","courserun_key","userId","getAuthenticatedUser","handleUpgradeClick","sendTrackEvent","linkCategory","linkName","linkType","pageName","handleUpgradeClickPastExpiration","jsx","Alert","variant","icon","Locked","className","children","jsxs","formatMessage","messages","Hyperlink","destination","onClick","target","id","defaultMessage","description","classNames","style","float","alt","src","certificateLocked","height","VerifiedCertBullet","UnlockGradedBullet","FullAccessBullet","SupportMissionBullet","UpgradeButton","whiteSpace","propTypes","PropTypes","string","isRequired","_default","exports"],"sources":["../../src/paywall/LockPaywall.jsx"],"sourcesContent":["/* eslint import/no-unresolved: 0 */\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport { useIntl } from '@edx/frontend-platform/i18n';\nimport {\n Alert, breakpoints, Hyperlink, useWindowSize,\n} from '@openedx/paragon';\nimport { Locked } from '@openedx/paragon/icons';\nimport messages from '@src/courseware/course/sequence/lock-paywall/messages';\nimport certificateLocked from '@src/generic/assets/edX_locked_certificate.png';\nimport { useModel } from '@src/generic/model-store';\nimport { UpgradeButton } from '@src/generic/upgrade-button';\nimport { getAuthenticatedUser } from '@edx/frontend-platform/auth';\nimport { sendTrackEvent } from '@edx/frontend-platform/analytics';\n\nimport {\n VerifiedCertBullet,\n UnlockGradedBullet,\n FullAccessBullet,\n SupportMissionBullet,\n} from '../generic/upsell-bullets';\nimport { useCohesion } from '../cohesion';\n\nconst LockPaywall = ({\n courseId,\n}) => {\n const intl = useIntl();\n const course = useModel('coursewareMeta', courseId);\n const {\n accessExpiration,\n marketingUrl,\n offer,\n } = course;\n\n const {\n org, verifiedMode,\n } = useModel('courseHomeMeta', courseId);\n\n const { conversion } = useCohesion(courseId);\n\n // the following variables are set and used for responsive layout to work with\n // whether the NotificationTray is open or not and if there's an offer with longer text\n const shouldDisplayGatedContentTwoColumnsHalf = useWindowSize().width <= breakpoints.large.minWidth;\n const shouldWrapTextOnButton = useWindowSize().width > breakpoints.extraSmall.minWidth;\n\n const accessExpirationDate = accessExpiration ? new Date(accessExpiration.expirationDate) : null;\n const pastExpirationDeadline = accessExpiration ? new Date(Date.now()) > accessExpirationDate : false;\n\n if (!verifiedMode) {\n return null;\n }\n\n const eventProperties = {\n org_key: org,\n courserun_key: courseId,\n };\n\n const { userId } = getAuthenticatedUser();\n\n const handleUpgradeClick = () => {\n sendTrackEvent('edx.bi.ecommerce.upsell_links_clicked', {\n ...eventProperties,\n linkCategory: '(none)',\n linkName: 'in_course_upgrade',\n linkType: 'link',\n pageName: 'in_course',\n });\n\n conversion('Upgraded');\n };\n\n const handleUpgradeClickPastExpiration = () => {\n sendTrackEvent('edx.bi.ecommerce.gated_content.past_expiration.link_clicked', {\n ...eventProperties,\n linkCategory: 'gated_content',\n linkName: 'course_details',\n linkType: 'link',\n pageName: 'in_course',\n });\n };\n\n return (\n <Alert variant=\"light\" aria-live=\"off\" icon={Locked} className=\"lock-paywall-container\" data-testid=\"lock-paywall-lock-paywall-test-id\">\n <div className=\"row\">\n <div className=\"col\">\n <h4 aria-level=\"3\">\n <span>{intl.formatMessage(messages['learn.lockPaywall.title'])}</span>\n </h4>\n {pastExpirationDeadline ? (\n <div className=\"mb-2 upgrade-intro\" data-testid=\"lock-paywall-past-expiration\">\n {intl.formatMessage(messages['learn.lockPaywall.content.pastExpiration'])}\n <Hyperlink\n destination={marketingUrl}\n onClick={handleUpgradeClickPastExpiration(eventProperties)}\n target=\"_blank\"\n data-testid=\"lock-paywall-past-expiration-link\"\n >\n {intl.formatMessage(messages['learn.lockPaywall.courseDetails'])}\n <span>\n {intl.formatMessage({\n id: 'learn.lockPaywall.content.link.new-tab.screenreader-only.message',\n defaultMessage: 'in a new tab',\n description: 'Screenreader only text for new tab link',\n })}\n </span>\n </Hyperlink>\n </div>\n ) : (\n <div className=\"mb-2 upgrade-intro\">\n {intl.formatMessage(messages['learn.lockPaywall.content'])}\n </div>\n )}\n\n <div className={classNames('d-inline-flex flex-row', { 'flex-wrap': shouldDisplayGatedContentTwoColumnsHalf })}>\n <div style={{ float: 'left' }} className=\"mr-3 mb-2\">\n <img\n alt={intl.formatMessage(messages['learn.lockPaywall.example.alt'])}\n src={certificateLocked}\n className=\"border-0 certificate-image-banner\"\n style={{ height: '128px', width: '175px' }}\n />\n </div>\n\n <div className=\"mw-xs list-div\">\n <div className=\"mb-2\">\n {intl.formatMessage(messages['learn.lockPaywall.list.intro'])}\n </div>\n <ul className=\"fa-ul ml-4 pl-2\">\n <VerifiedCertBullet />\n <UnlockGradedBullet />\n <FullAccessBullet />\n <SupportMissionBullet />\n </ul>\n </div>\n </div>\n </div>\n\n {pastExpirationDeadline\n ? null\n : (\n <div\n className={\n classNames('d-flex flex-column align-items-md-center text-right justify-content-center', {\n 'col-md-4 mx-md-3': !shouldDisplayGatedContentTwoColumnsHalf, 'col-md-6': shouldDisplayGatedContentTwoColumnsHalf,\n })\n }\n >\n <UpgradeButton\n offer={offer}\n onClick={() => handleUpgradeClick(eventProperties, userId)}\n verifiedMode={verifiedMode}\n style={{ whiteSpace: shouldWrapTextOnButton ? 'nowrap' : null }}\n data-testid=\"upgrade-button\"\n />\n </div>\n )}\n </div>\n </Alert>\n );\n};\nLockPaywall.propTypes = {\n courseId: PropTypes.string.isRequired,\n};\n\nexport default LockPaywall;\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"LockPaywall.js","names":["_react","_interopRequireDefault","require","_propTypes","_classnames","_i18n","_paragon","_icons","_messages","_edX_locked_certificate","_modelStore","_upgradeButton","_auth","_analytics","_upsellBullets","_cohesion","_subscriptionUpsell","_SubscriptionPaywall","_jsxRuntime","e","__esModule","default","ownKeys","r","t","Object","keys","getOwnPropertySymbols","o","filter","getOwnPropertyDescriptor","enumerable","push","apply","_objectSpread","arguments","length","forEach","_defineProperty","getOwnPropertyDescriptors","defineProperties","defineProperty","_toPropertyKey","value","configurable","writable","i","_toPrimitive","Symbol","toPrimitive","call","TypeError","String","Number","LockPaywall","_ref","courseId","intl","useIntl","course","useModel","accessExpiration","marketingUrl","offer","org","verifiedMode","conversion","useCohesion","subscriptionOffer","useSubscriptionOffer","shouldDisplayGatedContentTwoColumnsHalf","useWindowSize","width","breakpoints","large","minWidth","shouldWrapTextOnButton","extraSmall","accessExpirationDate","Date","expirationDate","pastExpirationDeadline","now","eventProperties","org_key","courserun_key","handleUpgradeClick","sendTrackEvent","linkCategory","linkName","linkType","pageName","handleSubscribeClick","canSubscribe","canUpgradeInPlace","jsx","onSubscribeClick","onUpgradeEvent","stage","userId","getAuthenticatedUser","handleUpgradeClickPastExpiration","Alert","variant","icon","Locked","className","children","jsxs","formatMessage","messages","Hyperlink","destination","onClick","target","id","defaultMessage","description","classNames","style","float","alt","src","certificateLocked","height","VerifiedCertBullet","UnlockGradedBullet","FullAccessBullet","SupportMissionBullet","UpgradeButton","whiteSpace","propTypes","PropTypes","string","isRequired","_default","exports"],"sources":["../../src/paywall/LockPaywall.jsx"],"sourcesContent":["/* eslint import/no-unresolved: 0 */\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport { useIntl } from '@edx/frontend-platform/i18n';\nimport {\n Alert, breakpoints, Hyperlink, useWindowSize,\n} from '@openedx/paragon';\nimport { Locked } from '@openedx/paragon/icons';\nimport messages from '@src/courseware/course/sequence/lock-paywall/messages';\nimport certificateLocked from '@src/generic/assets/edX_locked_certificate.png';\nimport { useModel } from '@src/generic/model-store';\nimport { UpgradeButton } from '@src/generic/upgrade-button';\nimport { getAuthenticatedUser } from '@edx/frontend-platform/auth';\nimport { sendTrackEvent } from '@edx/frontend-platform/analytics';\n\nimport {\n VerifiedCertBullet,\n UnlockGradedBullet,\n FullAccessBullet,\n SupportMissionBullet,\n} from '../generic/upsell-bullets';\nimport { useCohesion } from '../cohesion';\nimport { useSubscriptionOffer } from '../subscription-upsell';\nimport SubscriptionPaywall from './SubscriptionPaywall';\n\nconst LockPaywall = ({\n courseId,\n}) => {\n const intl = useIntl();\n const course = useModel('coursewareMeta', courseId);\n const {\n accessExpiration,\n marketingUrl,\n offer,\n } = course;\n\n const {\n org, verifiedMode,\n } = useModel('courseHomeMeta', courseId);\n\n const { conversion } = useCohesion(courseId);\n const subscriptionOffer = useSubscriptionOffer(courseId);\n\n // the following variables are set and used for responsive layout to work with\n // whether the NotificationTray is open or not and if there's an offer with longer text\n const shouldDisplayGatedContentTwoColumnsHalf = useWindowSize().width <= breakpoints.large.minWidth;\n const shouldWrapTextOnButton = useWindowSize().width > breakpoints.extraSmall.minWidth;\n\n const accessExpirationDate = accessExpiration ? new Date(accessExpiration.expirationDate) : null;\n const pastExpirationDeadline = accessExpiration ? new Date(Date.now()) > accessExpirationDate : false;\n\n if (!verifiedMode) {\n return null;\n }\n\n const eventProperties = {\n org_key: org,\n courserun_key: courseId,\n };\n\n const handleUpgradeClick = () => {\n sendTrackEvent('edx.bi.ecommerce.upsell_links_clicked', {\n ...eventProperties,\n linkCategory: '(none)',\n linkName: 'in_course_upgrade',\n linkType: 'link',\n pageName: 'in_course',\n });\n\n conversion('Upgraded');\n };\n\n const handleSubscribeClick = () => {\n sendTrackEvent('edx.bi.ecommerce.upsell_links_clicked', {\n ...eventProperties,\n linkCategory: '(none)',\n linkName: 'in_course_subscribe',\n linkType: 'link',\n pageName: 'in_course',\n });\n conversion('Subscribed');\n };\n\n // Learners who can subscribe get the Subscribe banner (Figma shows Subscribe only) and subscribers\n // get the same banner with Upgrade now. Unknown status keeps the paywall below.\n if (!pastExpirationDeadline && (subscriptionOffer?.canSubscribe || subscriptionOffer?.canUpgradeInPlace)) {\n return (\n <SubscriptionPaywall\n courseId={courseId}\n offer={subscriptionOffer}\n onSubscribeClick={handleSubscribeClick}\n onUpgradeEvent={(stage) => stage === 'succeeded' && handleUpgradeClick()}\n />\n );\n }\n\n const { userId } = getAuthenticatedUser();\n\n const handleUpgradeClickPastExpiration = () => {\n sendTrackEvent('edx.bi.ecommerce.gated_content.past_expiration.link_clicked', {\n ...eventProperties,\n linkCategory: 'gated_content',\n linkName: 'course_details',\n linkType: 'link',\n pageName: 'in_course',\n });\n };\n\n return (\n <Alert variant=\"light\" aria-live=\"off\" icon={Locked} className=\"lock-paywall-container\" data-testid=\"lock-paywall-lock-paywall-test-id\">\n <div className=\"row\">\n <div className=\"col\">\n <h4 aria-level=\"3\">\n <span>{intl.formatMessage(messages['learn.lockPaywall.title'])}</span>\n </h4>\n {pastExpirationDeadline ? (\n <div className=\"mb-2 upgrade-intro\" data-testid=\"lock-paywall-past-expiration\">\n {intl.formatMessage(messages['learn.lockPaywall.content.pastExpiration'])}\n <Hyperlink\n destination={marketingUrl}\n onClick={handleUpgradeClickPastExpiration(eventProperties)}\n target=\"_blank\"\n data-testid=\"lock-paywall-past-expiration-link\"\n >\n {intl.formatMessage(messages['learn.lockPaywall.courseDetails'])}\n <span>\n {intl.formatMessage({\n id: 'learn.lockPaywall.content.link.new-tab.screenreader-only.message',\n defaultMessage: 'in a new tab',\n description: 'Screenreader only text for new tab link',\n })}\n </span>\n </Hyperlink>\n </div>\n ) : (\n <div className=\"mb-2 upgrade-intro\">\n {intl.formatMessage(messages['learn.lockPaywall.content'])}\n </div>\n )}\n\n <div className={classNames('d-inline-flex flex-row', { 'flex-wrap': shouldDisplayGatedContentTwoColumnsHalf })}>\n <div style={{ float: 'left' }} className=\"mr-3 mb-2\">\n <img\n alt={intl.formatMessage(messages['learn.lockPaywall.example.alt'])}\n src={certificateLocked}\n className=\"border-0 certificate-image-banner\"\n style={{ height: '128px', width: '175px' }}\n />\n </div>\n\n <div className=\"mw-xs list-div\">\n <div className=\"mb-2\">\n {intl.formatMessage(messages['learn.lockPaywall.list.intro'])}\n </div>\n <ul className=\"fa-ul ml-4 pl-2\">\n <VerifiedCertBullet />\n <UnlockGradedBullet />\n <FullAccessBullet />\n <SupportMissionBullet />\n </ul>\n </div>\n </div>\n </div>\n\n {pastExpirationDeadline\n ? null\n : (\n <div\n className={\n classNames('d-flex flex-column align-items-md-center text-right justify-content-center', {\n 'col-md-4 mx-md-3': !shouldDisplayGatedContentTwoColumnsHalf, 'col-md-6': shouldDisplayGatedContentTwoColumnsHalf,\n })\n }\n >\n <UpgradeButton\n offer={offer}\n onClick={() => handleUpgradeClick(eventProperties, userId)}\n verifiedMode={verifiedMode}\n style={{ whiteSpace: shouldWrapTextOnButton ? 'nowrap' : null }}\n data-testid=\"upgrade-button\"\n />\n </div>\n )}\n </div>\n </Alert>\n );\n};\nLockPaywall.propTypes = {\n courseId: PropTypes.string.isRequired,\n};\n\nexport default LockPaywall;\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
var _react = _interopRequireDefault(require("react"));
|
|
8
|
+
var _propTypes = _interopRequireDefault(require("prop-types"));
|
|
9
|
+
var _i18n = require("@edx/frontend-platform/i18n");
|
|
10
|
+
var _paragon = require("@openedx/paragon");
|
|
11
|
+
var _icons = require("@openedx/paragon/icons");
|
|
12
|
+
var _messages = _interopRequireDefault(require("@src/courseware/course/sequence/lock-paywall/messages"));
|
|
13
|
+
var _edX_locked_certificate = _interopRequireDefault(require("@src/generic/assets/edX_locked_certificate.png"));
|
|
14
|
+
var _upsellBullets = require("../generic/upsell-bullets");
|
|
15
|
+
var _subscriptionUpsell = require("../subscription-upsell");
|
|
16
|
+
var _messages2 = _interopRequireDefault(require("../subscription-upsell/messages"));
|
|
17
|
+
var _jsxRuntime = require("react/jsx-runtime");
|
|
18
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
19
|
+
/* eslint import/no-unresolved: 0 */
|
|
20
|
+
|
|
21
|
+
/** The locked graded content banner (Figma 3484-70965): Subscribe, or Upgrade now for a subscriber. */const SubscriptionPaywall = _ref => {
|
|
22
|
+
let {
|
|
23
|
+
courseId,
|
|
24
|
+
offer,
|
|
25
|
+
onSubscribeClick,
|
|
26
|
+
onUpgradeEvent
|
|
27
|
+
} = _ref;
|
|
28
|
+
const {
|
|
29
|
+
formatMessage
|
|
30
|
+
} = (0, _i18n.useIntl)();
|
|
31
|
+
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_paragon.Alert, {
|
|
32
|
+
variant: "light",
|
|
33
|
+
"aria-live": "off",
|
|
34
|
+
icon: _icons.Locked,
|
|
35
|
+
className: "bg-light-200 border-0 shadow-sm p-4",
|
|
36
|
+
"data-testid": "subscription-paywall",
|
|
37
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_paragon.Stack, {
|
|
38
|
+
direction: "horizontal",
|
|
39
|
+
gap: 4,
|
|
40
|
+
className: "flex-column flex-md-row align-items-start align-items-md-center",
|
|
41
|
+
children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_paragon.Stack, {
|
|
42
|
+
gap: 2,
|
|
43
|
+
className: "flex-grow-1",
|
|
44
|
+
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_paragon.Alert.Heading, {
|
|
45
|
+
as: "h3",
|
|
46
|
+
className: "h6 font-weight-bold text-primary-500 mb-0",
|
|
47
|
+
children: formatMessage(_messages.default['learn.lockPaywall.title'])
|
|
48
|
+
}), /*#__PURE__*/(0, _jsxRuntime.jsx)("p", {
|
|
49
|
+
className: "mb-0",
|
|
50
|
+
children: formatMessage(_messages.default['learn.lockPaywall.content'])
|
|
51
|
+
}), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_paragon.Stack, {
|
|
52
|
+
direction: "horizontal",
|
|
53
|
+
gap: 3,
|
|
54
|
+
className: "flex-wrap",
|
|
55
|
+
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_paragon.Image, {
|
|
56
|
+
src: _edX_locked_certificate.default,
|
|
57
|
+
alt: formatMessage(_messages.default['learn.lockPaywall.example.alt']),
|
|
58
|
+
width: 175,
|
|
59
|
+
height: 128
|
|
60
|
+
}), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_paragon.Stack, {
|
|
61
|
+
gap: 2,
|
|
62
|
+
role: "list",
|
|
63
|
+
className: "align-self-center upsell-bullets",
|
|
64
|
+
style: {
|
|
65
|
+
flex: '1 1 16rem'
|
|
66
|
+
},
|
|
67
|
+
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_upsellBullets.VerifiedCertBullet, {}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_upsellBullets.UnlockGradedBullet, {}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_upsellBullets.FullAccessBullet, {})]
|
|
68
|
+
})]
|
|
69
|
+
})]
|
|
70
|
+
}), offer.canUpgradeInPlace ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_subscriptionUpsell.SubscriptionUpsell, {
|
|
71
|
+
courseId: courseId,
|
|
72
|
+
className: "flex-shrink-0",
|
|
73
|
+
onUpgradeEvent: onUpgradeEvent
|
|
74
|
+
}) : /*#__PURE__*/(0, _jsxRuntime.jsx)(_paragon.Button, {
|
|
75
|
+
variant: "primary",
|
|
76
|
+
size: "sm",
|
|
77
|
+
className: "rounded-pill",
|
|
78
|
+
href: offer.subscribeUrl,
|
|
79
|
+
onClick: onSubscribeClick,
|
|
80
|
+
children: formatMessage(_messages2.default.subscribe)
|
|
81
|
+
})]
|
|
82
|
+
})
|
|
83
|
+
});
|
|
84
|
+
};
|
|
85
|
+
SubscriptionPaywall.propTypes = {
|
|
86
|
+
courseId: _propTypes.default.string.isRequired,
|
|
87
|
+
offer: _propTypes.default.shape({
|
|
88
|
+
canUpgradeInPlace: _propTypes.default.bool,
|
|
89
|
+
subscribeUrl: _propTypes.default.string
|
|
90
|
+
}).isRequired,
|
|
91
|
+
onSubscribeClick: _propTypes.default.func,
|
|
92
|
+
onUpgradeEvent: _propTypes.default.func
|
|
93
|
+
};
|
|
94
|
+
SubscriptionPaywall.defaultProps = {
|
|
95
|
+
onSubscribeClick: undefined,
|
|
96
|
+
onUpgradeEvent: undefined
|
|
97
|
+
};
|
|
98
|
+
var _default = exports.default = SubscriptionPaywall;
|
|
99
|
+
//# sourceMappingURL=SubscriptionPaywall.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SubscriptionPaywall.js","names":["_react","_interopRequireDefault","require","_propTypes","_i18n","_paragon","_icons","_messages","_edX_locked_certificate","_upsellBullets","_subscriptionUpsell","_messages2","_jsxRuntime","e","__esModule","default","SubscriptionPaywall","_ref","courseId","offer","onSubscribeClick","onUpgradeEvent","formatMessage","useIntl","jsx","Alert","variant","icon","Locked","className","children","jsxs","Stack","direction","gap","Heading","as","lockPaywallMessages","Image","src","certificateLocked","alt","width","height","role","style","flex","VerifiedCertBullet","UnlockGradedBullet","FullAccessBullet","canUpgradeInPlace","SubscriptionUpsell","Button","size","href","subscribeUrl","onClick","subscriptionMessages","subscribe","propTypes","PropTypes","string","isRequired","shape","bool","func","defaultProps","undefined","_default","exports"],"sources":["../../src/paywall/SubscriptionPaywall.jsx"],"sourcesContent":["/* eslint import/no-unresolved: 0 */\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport { useIntl } from '@edx/frontend-platform/i18n';\nimport {\n Alert, Button, Image, Stack,\n} from '@openedx/paragon';\nimport { Locked } from '@openedx/paragon/icons';\nimport lockPaywallMessages from '@src/courseware/course/sequence/lock-paywall/messages';\nimport certificateLocked from '@src/generic/assets/edX_locked_certificate.png';\n\nimport { VerifiedCertBullet, UnlockGradedBullet, FullAccessBullet } from '../generic/upsell-bullets';\nimport { SubscriptionUpsell } from '../subscription-upsell';\nimport subscriptionMessages from '../subscription-upsell/messages';\n\n/** The locked graded content banner (Figma 3484-70965): Subscribe, or Upgrade now for a subscriber. */\nconst SubscriptionPaywall = ({\n courseId, offer, onSubscribeClick, onUpgradeEvent,\n}) => {\n const { formatMessage } = useIntl();\n\n return (\n <Alert\n variant=\"light\"\n aria-live=\"off\"\n icon={Locked}\n className=\"bg-light-200 border-0 shadow-sm p-4\"\n data-testid=\"subscription-paywall\"\n >\n {/* The button is not in Alert's actions: elm-theme turns primary buttons there into brand (orange) buttons. */}\n <Stack\n direction=\"horizontal\"\n gap={4}\n className=\"flex-column flex-md-row align-items-start align-items-md-center\"\n >\n <Stack gap={2} className=\"flex-grow-1\">\n <Alert.Heading as=\"h3\" className=\"h6 font-weight-bold text-primary-500 mb-0\">\n {formatMessage(lockPaywallMessages['learn.lockPaywall.title'])}\n </Alert.Heading>\n <p className=\"mb-0\">{formatMessage(lockPaywallMessages['learn.lockPaywall.content'])}</p>\n <Stack direction=\"horizontal\" gap={3} className=\"flex-wrap\">\n <Image\n src={certificateLocked}\n alt={formatMessage(lockPaywallMessages['learn.lockPaywall.example.alt'])}\n width={175}\n height={128}\n />\n {/* Let the bullet text wrap before the whole list drops under the image. */}\n <Stack gap={2} role=\"list\" className=\"align-self-center upsell-bullets\" style={{ flex: '1 1 16rem' }}>\n <VerifiedCertBullet />\n <UnlockGradedBullet />\n <FullAccessBullet />\n </Stack>\n </Stack>\n </Stack>\n {offer.canUpgradeInPlace ? (\n <SubscriptionUpsell courseId={courseId} className=\"flex-shrink-0\" onUpgradeEvent={onUpgradeEvent} />\n ) : (\n <Button variant=\"primary\" size=\"sm\" className=\"rounded-pill\" href={offer.subscribeUrl} onClick={onSubscribeClick}>\n {formatMessage(subscriptionMessages.subscribe)}\n </Button>\n )}\n </Stack>\n </Alert>\n );\n};\n\nSubscriptionPaywall.propTypes = {\n courseId: PropTypes.string.isRequired,\n offer: PropTypes.shape({\n canUpgradeInPlace: PropTypes.bool,\n subscribeUrl: PropTypes.string,\n }).isRequired,\n onSubscribeClick: PropTypes.func,\n onUpgradeEvent: PropTypes.func,\n};\n\nSubscriptionPaywall.defaultProps = {\n onSubscribeClick: undefined,\n onUpgradeEvent: undefined,\n};\n\nexport default SubscriptionPaywall;\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -12,10 +12,11 @@ var _i18n = require("@edx/frontend-platform/i18n");
|
|
|
12
12
|
var _paragon = require("@openedx/paragon");
|
|
13
13
|
var _icons = require("@openedx/paragon/icons");
|
|
14
14
|
var _certificatePreview = _interopRequireDefault(require("../upgrade-notification/certificate-preview"));
|
|
15
|
+
var _messages = _interopRequireDefault(require("../upgrade-notification/messages"));
|
|
15
16
|
require("../generic/upsell-bullets/UpsellTable.scss");
|
|
16
17
|
var _SubscriptionUpsell = _interopRequireDefault(require("./SubscriptionUpsell"));
|
|
17
18
|
var _useSubscriptionOffer = _interopRequireDefault(require("./useSubscriptionOffer"));
|
|
18
|
-
var
|
|
19
|
+
var _messages2 = _interopRequireDefault(require("./messages"));
|
|
19
20
|
var _jsxRuntime = require("react/jsx-runtime");
|
|
20
21
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
21
22
|
/* eslint import/no-unresolved: 0 */
|
|
@@ -27,7 +28,9 @@ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e
|
|
|
27
28
|
onSubscribeClick,
|
|
28
29
|
onPurchaseClick,
|
|
29
30
|
onUpgradeEvent,
|
|
30
|
-
onUpgraded
|
|
31
|
+
onUpgraded,
|
|
32
|
+
onClose,
|
|
33
|
+
banner
|
|
31
34
|
} = _ref;
|
|
32
35
|
const {
|
|
33
36
|
formatMessage
|
|
@@ -42,11 +45,11 @@ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e
|
|
|
42
45
|
} = offer;
|
|
43
46
|
const included = /*#__PURE__*/(0, _jsxRuntime.jsx)(_paragon.Icon, {
|
|
44
47
|
src: _icons.CheckCircle,
|
|
45
|
-
screenReaderText: formatMessage(
|
|
48
|
+
screenReaderText: formatMessage(_messages2.default.includedAlt)
|
|
46
49
|
});
|
|
47
50
|
const notIncluded = /*#__PURE__*/(0, _jsxRuntime.jsx)(_paragon.Icon, {
|
|
48
51
|
src: _icons.CloseSmall,
|
|
49
|
-
screenReaderText: formatMessage(
|
|
52
|
+
screenReaderText: formatMessage(_messages2.default.notIncludedAlt)
|
|
50
53
|
});
|
|
51
54
|
|
|
52
55
|
// Columns follow the buttons; a subscriber gets Upgrade now and nothing to compare.
|
|
@@ -55,45 +58,57 @@ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e
|
|
|
55
58
|
const showTable = !offer.canUpgradeInPlace && (showSubscribeColumn || showBuyColumn);
|
|
56
59
|
const rows = [showSubscribeColumn && offer.hasTrial && {
|
|
57
60
|
key: 'free-trial',
|
|
58
|
-
label: formatMessage(
|
|
61
|
+
label: formatMessage(_messages2.default.featureFreeTrial),
|
|
59
62
|
buy: false
|
|
60
63
|
}, showSubscribeColumn && {
|
|
61
64
|
key: 'change-courses',
|
|
62
|
-
label: formatMessage(
|
|
65
|
+
label: formatMessage(_messages2.default.featureChangeCourses),
|
|
63
66
|
buy: false
|
|
64
67
|
}, {
|
|
65
68
|
key: 'certificates',
|
|
66
|
-
label: formatMessage(
|
|
69
|
+
label: formatMessage(_messages2.default.featureCertificates, {
|
|
67
70
|
certificateLink: /*#__PURE__*/(0, _jsxRuntime.jsx)(_paragon.Hyperlink, {
|
|
68
71
|
destination: `${(0, _frontendPlatform.getConfig)().MARKETING_SITE_BASE_URL}/verified-certificate`,
|
|
69
|
-
children: formatMessage(
|
|
72
|
+
children: formatMessage(_messages2.default.featureCertificatesLink)
|
|
70
73
|
})
|
|
71
74
|
}),
|
|
72
75
|
buy: true
|
|
73
76
|
}, {
|
|
74
77
|
key: 'graded-assignments',
|
|
75
|
-
label: formatMessage(
|
|
78
|
+
label: formatMessage(_messages2.default.featureGradedAssignments),
|
|
76
79
|
buy: true
|
|
77
80
|
}, {
|
|
78
81
|
key: 'unlimited-access',
|
|
79
|
-
label: formatMessage(
|
|
82
|
+
label: formatMessage(_messages2.default.featureUnlimitedAccess),
|
|
80
83
|
buy: true
|
|
81
84
|
}].filter(Boolean);
|
|
82
85
|
return /*#__PURE__*/(0, _jsxRuntime.jsxs)("section", {
|
|
83
86
|
className: (0, _classnames.default)('upgrade-notification subscription-upgrade-card small', {
|
|
84
87
|
'pgn__card pgn__card-light card mb-4 rounded': withBorder
|
|
85
88
|
}),
|
|
89
|
+
id: "courseHome-upgradeNotification",
|
|
86
90
|
"data-testid": "subscription-upgrade-card",
|
|
87
|
-
children: [/*#__PURE__*/(0, _jsxRuntime.
|
|
88
|
-
|
|
89
|
-
|
|
91
|
+
children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_paragon.Stack, {
|
|
92
|
+
direction: "horizontal",
|
|
93
|
+
className: "align-items-start px-4 pt-4 mb-3",
|
|
94
|
+
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("h2", {
|
|
95
|
+
className: "upgrade-notification-header h4 mb-0",
|
|
96
|
+
children: formatMessage(_messages2.default.cardHeader)
|
|
97
|
+
}), onClose && /*#__PURE__*/(0, _jsxRuntime.jsx)(_paragon.IconButton, {
|
|
98
|
+
className: "ml-auto",
|
|
99
|
+
src: _icons.Close,
|
|
100
|
+
iconAs: _paragon.Icon,
|
|
101
|
+
size: "sm",
|
|
102
|
+
alt: formatMessage(_messages.default.closeAlt),
|
|
103
|
+
onClick: onClose
|
|
104
|
+
})]
|
|
90
105
|
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_certificatePreview.default, {
|
|
91
106
|
courseId: courseId
|
|
92
|
-
}), showTable && /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
|
|
107
|
+
}), banner, showTable && /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
|
|
93
108
|
className: "px-4 small",
|
|
94
109
|
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("h3", {
|
|
95
110
|
className: "mb-4 primary-500",
|
|
96
|
-
children: formatMessage(
|
|
111
|
+
children: formatMessage(_messages2.default.benefitsHeader)
|
|
97
112
|
}), /*#__PURE__*/(0, _jsxRuntime.jsxs)("table", {
|
|
98
113
|
className: "w-100 text-center subscription-comparison-table",
|
|
99
114
|
"data-testid": "subscription-card-table",
|
|
@@ -103,7 +118,7 @@ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e
|
|
|
103
118
|
scope: "col",
|
|
104
119
|
children: /*#__PURE__*/(0, _jsxRuntime.jsx)("span", {
|
|
105
120
|
className: "sr-only",
|
|
106
|
-
children: formatMessage(
|
|
121
|
+
children: formatMessage(_messages2.default.featureColumn)
|
|
107
122
|
})
|
|
108
123
|
}), showBuyColumn && /*#__PURE__*/(0, _jsxRuntime.jsx)("th", {
|
|
109
124
|
scope: "col",
|
|
@@ -112,7 +127,7 @@ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e
|
|
|
112
127
|
children: /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
|
|
113
128
|
className: "center-items flex-column",
|
|
114
129
|
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("span", {
|
|
115
|
-
children: formatMessage(
|
|
130
|
+
children: formatMessage(_messages2.default.buyColumn)
|
|
116
131
|
}), coursePrice && /*#__PURE__*/(0, _jsxRuntime.jsx)("span", {
|
|
117
132
|
children: coursePrice
|
|
118
133
|
})]
|
|
@@ -124,7 +139,7 @@ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e
|
|
|
124
139
|
children: /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
|
|
125
140
|
className: "center-items flex-column",
|
|
126
141
|
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("span", {
|
|
127
|
-
children: formatMessage(
|
|
142
|
+
children: formatMessage(_messages2.default.subscribeColumn)
|
|
128
143
|
}), subscribePrice && /*#__PURE__*/(0, _jsxRuntime.jsx)("span", {
|
|
129
144
|
className: "font-weight-normal",
|
|
130
145
|
children: subscribePrice
|
|
@@ -180,14 +195,20 @@ SubscriptionUpgradeCard.propTypes = {
|
|
|
180
195
|
onSubscribeClick: _propTypes.default.func,
|
|
181
196
|
onPurchaseClick: _propTypes.default.func,
|
|
182
197
|
onUpgradeEvent: _propTypes.default.func,
|
|
183
|
-
onUpgraded: _propTypes.default.func
|
|
198
|
+
onUpgraded: _propTypes.default.func,
|
|
199
|
+
// The courseware sidebar widget passes its toggle so the card can close it.
|
|
200
|
+
onClose: _propTypes.default.func,
|
|
201
|
+
// Host content shown under the certificate preview, such as the access expiration countdown.
|
|
202
|
+
banner: _propTypes.default.node
|
|
184
203
|
};
|
|
185
204
|
SubscriptionUpgradeCard.defaultProps = {
|
|
186
205
|
withBorder: false,
|
|
187
206
|
onSubscribeClick: undefined,
|
|
188
207
|
onPurchaseClick: undefined,
|
|
189
208
|
onUpgradeEvent: undefined,
|
|
190
|
-
onUpgraded: undefined
|
|
209
|
+
onUpgraded: undefined,
|
|
210
|
+
onClose: undefined,
|
|
211
|
+
banner: undefined
|
|
191
212
|
};
|
|
192
213
|
var _default = exports.default = SubscriptionUpgradeCard;
|
|
193
214
|
//# sourceMappingURL=SubscriptionUpgradeCard.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SubscriptionUpgradeCard.js","names":["_react","_interopRequireDefault","require","_propTypes","_classnames","_frontendPlatform","_i18n","_paragon","_icons","_certificatePreview","_SubscriptionUpsell","_useSubscriptionOffer","_messages","_jsxRuntime","e","__esModule","default","SubscriptionUpgradeCard","_ref","courseId","withBorder","onSubscribeClick","onPurchaseClick","onUpgradeEvent","onUpgraded","formatMessage","useIntl","offer","useSubscriptionOffer","canPurchase","canSubscribe","canUpgradeInPlace","coursePrice","subscribePrice","included","jsx","Icon","src","CheckCircle","screenReaderText","messages","includedAlt","notIncluded","CloseSmall","notIncludedAlt","showSubscribeColumn","showBuyColumn","showTable","rows","hasTrial","key","label","featureFreeTrial","buy","featureChangeCourses","featureCertificates","certificateLink","Hyperlink","destination","getConfig","MARKETING_SITE_BASE_URL","children","featureCertificatesLink","featureGradedAssignments","featureUnlimitedAccess","filter","Boolean","jsxs","className","classNames","cardHeader","benefitsHeader","scope","featureColumn","buyColumn","subscribeColumn","map","row","index","last","length","propTypes","PropTypes","string","isRequired","bool","func","defaultProps","undefined","_default","exports"],"sources":["../../src/subscription-upsell/SubscriptionUpgradeCard.jsx"],"sourcesContent":["/* eslint import/no-unresolved: 0 */\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport { getConfig } from '@edx/frontend-platform';\nimport { useIntl } from '@edx/frontend-platform/i18n';\nimport { Hyperlink, Icon } from '@openedx/paragon';\nimport { CheckCircle, CloseSmall } from '@openedx/paragon/icons';\n\nimport CertificatePreview from '../upgrade-notification/certificate-preview';\nimport '../generic/upsell-bullets/UpsellTable.scss';\nimport SubscriptionUpsell from './SubscriptionUpsell';\nimport useSubscriptionOffer from './useSubscriptionOffer';\nimport messages from './messages';\n\n/** The sidebar card (Figma 3331-33999): certificate preview, Buy vs Subscribe table, buttons. */\nconst SubscriptionUpgradeCard = ({\n courseId,\n withBorder,\n onSubscribeClick,\n onPurchaseClick,\n onUpgradeEvent,\n onUpgraded,\n}) => {\n const { formatMessage } = useIntl();\n const offer = useSubscriptionOffer(courseId);\n\n if (!offer || (!offer.canPurchase && !offer.canSubscribe && !offer.canUpgradeInPlace)) {\n return null;\n }\n\n const { coursePrice, subscribePrice } = offer;\n const included = <Icon src={CheckCircle} screenReaderText={formatMessage(messages.includedAlt)} />;\n const notIncluded = <Icon src={CloseSmall} screenReaderText={formatMessage(messages.notIncludedAlt)} />;\n\n // Columns follow the buttons; a subscriber gets Upgrade now and nothing to compare.\n const showSubscribeColumn = offer.canSubscribe;\n const showBuyColumn = offer.canPurchase;\n const showTable = !offer.canUpgradeInPlace && (showSubscribeColumn || showBuyColumn);\n\n const rows = [\n showSubscribeColumn && offer.hasTrial\n && { key: 'free-trial', label: formatMessage(messages.featureFreeTrial), buy: false },\n showSubscribeColumn\n && { key: 'change-courses', label: formatMessage(messages.featureChangeCourses), buy: false },\n {\n key: 'certificates',\n label: formatMessage(messages.featureCertificates, {\n certificateLink: (\n <Hyperlink destination={`${getConfig().MARKETING_SITE_BASE_URL}/verified-certificate`}>\n {formatMessage(messages.featureCertificatesLink)}\n </Hyperlink>\n ),\n }),\n buy: true,\n },\n { key: 'graded-assignments', label: formatMessage(messages.featureGradedAssignments), buy: true },\n { key: 'unlimited-access', label: formatMessage(messages.featureUnlimitedAccess), buy: true },\n ].filter(Boolean);\n\n return (\n <section\n className={classNames('upgrade-notification subscription-upgrade-card small', {\n 'pgn__card pgn__card-light card mb-4 rounded': withBorder,\n })}\n data-testid=\"subscription-upgrade-card\"\n >\n <h2 className=\"upgrade-notification-header h4 px-4 pt-4 mb-3\">{formatMessage(messages.cardHeader)}</h2>\n <CertificatePreview courseId={courseId} />\n {showTable && (\n <div className=\"px-4 small\">\n <h3 className=\"mb-4 primary-500\">{formatMessage(messages.benefitsHeader)}</h3>\n <table className=\"w-100 text-center subscription-comparison-table\" data-testid=\"subscription-card-table\">\n <thead>\n <tr>\n <th scope=\"col\"><span className=\"sr-only\">{formatMessage(messages.featureColumn)}</span></th>\n {showBuyColumn && (\n <th scope=\"col\" className=\"audit-cell top-audit-border font-weight-normal\" data-testid=\"subscription-card-buy-header\">\n <div className=\"center-items flex-column\">\n <span>{formatMessage(messages.buyColumn)}</span>\n {coursePrice && <span>{coursePrice}</span>}\n </div>\n </th>\n )}\n {showSubscribeColumn && (\n <th scope=\"col\" className=\"verified-cell top-verified-border\" data-testid=\"subscription-card-subscribe-header\">\n <div className=\"center-items flex-column\">\n <span>{formatMessage(messages.subscribeColumn)}</span>\n {subscribePrice && <span className=\"font-weight-normal\">{subscribePrice}</span>}\n </div>\n </th>\n )}\n </tr>\n </thead>\n <tbody>\n {rows.map((row, index) => {\n const last = index === rows.length - 1;\n return (\n <tr key={row.key} data-testid={`subscription-card-row-${row.key}`}>\n <th scope=\"row\" className={classNames('feature-cell text-left font-weight-normal', { 'bottom-no-border': last })}>\n {row.label}\n </th>\n {showBuyColumn && (\n <td className={classNames('audit-cell', { 'bottom-audit-border': last })}>\n <div className=\"center-items\">{row.buy ? included : notIncluded}</div>\n </td>\n )}\n {showSubscribeColumn && (\n <td className={classNames('verified-cell', { 'bottom-verified-border': last })}>\n <div className=\"center-items\">{included}</div>\n </td>\n )}\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n )}\n <SubscriptionUpsell\n courseId={courseId}\n className=\"px-4 pb-4 pt-3\"\n onSubscribeClick={onSubscribeClick}\n onPurchaseClick={onPurchaseClick}\n onUpgradeEvent={onUpgradeEvent}\n onUpgraded={onUpgraded}\n />\n </section>\n );\n};\n\nSubscriptionUpgradeCard.propTypes = {\n courseId: PropTypes.string.isRequired,\n withBorder: PropTypes.bool,\n onSubscribeClick: PropTypes.func,\n onPurchaseClick: PropTypes.func,\n onUpgradeEvent: PropTypes.func,\n onUpgraded: PropTypes.func,\n};\n\nSubscriptionUpgradeCard.defaultProps = {\n withBorder: false,\n onSubscribeClick: undefined,\n onPurchaseClick: undefined,\n onUpgradeEvent: undefined,\n onUpgraded: undefined,\n};\n\nexport default SubscriptionUpgradeCard;\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"SubscriptionUpgradeCard.js","names":["_react","_interopRequireDefault","require","_propTypes","_classnames","_frontendPlatform","_i18n","_paragon","_icons","_certificatePreview","_messages","_SubscriptionUpsell","_useSubscriptionOffer","_messages2","_jsxRuntime","e","__esModule","default","SubscriptionUpgradeCard","_ref","courseId","withBorder","onSubscribeClick","onPurchaseClick","onUpgradeEvent","onUpgraded","onClose","banner","formatMessage","useIntl","offer","useSubscriptionOffer","canPurchase","canSubscribe","canUpgradeInPlace","coursePrice","subscribePrice","included","jsx","Icon","src","CheckCircle","screenReaderText","messages","includedAlt","notIncluded","CloseSmall","notIncludedAlt","showSubscribeColumn","showBuyColumn","showTable","rows","hasTrial","key","label","featureFreeTrial","buy","featureChangeCourses","featureCertificates","certificateLink","Hyperlink","destination","getConfig","MARKETING_SITE_BASE_URL","children","featureCertificatesLink","featureGradedAssignments","featureUnlimitedAccess","filter","Boolean","jsxs","className","classNames","id","Stack","direction","cardHeader","IconButton","Close","iconAs","size","alt","upgradeNotificationMessages","closeAlt","onClick","benefitsHeader","scope","featureColumn","buyColumn","subscribeColumn","map","row","index","last","length","propTypes","PropTypes","string","isRequired","bool","func","node","defaultProps","undefined","_default","exports"],"sources":["../../src/subscription-upsell/SubscriptionUpgradeCard.jsx"],"sourcesContent":["/* eslint import/no-unresolved: 0 */\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport { getConfig } from '@edx/frontend-platform';\nimport { useIntl } from '@edx/frontend-platform/i18n';\nimport {\n Hyperlink, Icon, IconButton, Stack,\n} from '@openedx/paragon';\nimport { CheckCircle, Close, CloseSmall } from '@openedx/paragon/icons';\n\nimport CertificatePreview from '../upgrade-notification/certificate-preview';\nimport upgradeNotificationMessages from '../upgrade-notification/messages';\nimport '../generic/upsell-bullets/UpsellTable.scss';\nimport SubscriptionUpsell from './SubscriptionUpsell';\nimport useSubscriptionOffer from './useSubscriptionOffer';\nimport messages from './messages';\n\n/** The sidebar card (Figma 3331-33999): certificate preview, Buy vs Subscribe table, buttons. */\nconst SubscriptionUpgradeCard = ({\n courseId,\n withBorder,\n onSubscribeClick,\n onPurchaseClick,\n onUpgradeEvent,\n onUpgraded,\n onClose,\n banner,\n}) => {\n const { formatMessage } = useIntl();\n const offer = useSubscriptionOffer(courseId);\n\n if (!offer || (!offer.canPurchase && !offer.canSubscribe && !offer.canUpgradeInPlace)) {\n return null;\n }\n\n const { coursePrice, subscribePrice } = offer;\n const included = <Icon src={CheckCircle} screenReaderText={formatMessage(messages.includedAlt)} />;\n const notIncluded = <Icon src={CloseSmall} screenReaderText={formatMessage(messages.notIncludedAlt)} />;\n\n // Columns follow the buttons; a subscriber gets Upgrade now and nothing to compare.\n const showSubscribeColumn = offer.canSubscribe;\n const showBuyColumn = offer.canPurchase;\n const showTable = !offer.canUpgradeInPlace && (showSubscribeColumn || showBuyColumn);\n\n const rows = [\n showSubscribeColumn && offer.hasTrial\n && { key: 'free-trial', label: formatMessage(messages.featureFreeTrial), buy: false },\n showSubscribeColumn\n && { key: 'change-courses', label: formatMessage(messages.featureChangeCourses), buy: false },\n {\n key: 'certificates',\n label: formatMessage(messages.featureCertificates, {\n certificateLink: (\n <Hyperlink destination={`${getConfig().MARKETING_SITE_BASE_URL}/verified-certificate`}>\n {formatMessage(messages.featureCertificatesLink)}\n </Hyperlink>\n ),\n }),\n buy: true,\n },\n { key: 'graded-assignments', label: formatMessage(messages.featureGradedAssignments), buy: true },\n { key: 'unlimited-access', label: formatMessage(messages.featureUnlimitedAccess), buy: true },\n ].filter(Boolean);\n\n return (\n <section\n className={classNames('upgrade-notification subscription-upgrade-card small', {\n 'pgn__card pgn__card-light card mb-4 rounded': withBorder,\n })}\n id=\"courseHome-upgradeNotification\"\n data-testid=\"subscription-upgrade-card\"\n >\n <Stack direction=\"horizontal\" className=\"align-items-start px-4 pt-4 mb-3\">\n <h2 className=\"upgrade-notification-header h4 mb-0\">{formatMessage(messages.cardHeader)}</h2>\n {onClose && (\n <IconButton\n className=\"ml-auto\"\n src={Close}\n iconAs={Icon}\n size=\"sm\"\n alt={formatMessage(upgradeNotificationMessages.closeAlt)}\n onClick={onClose}\n />\n )}\n </Stack>\n <CertificatePreview courseId={courseId} />\n {banner}\n {showTable && (\n <div className=\"px-4 small\">\n <h3 className=\"mb-4 primary-500\">{formatMessage(messages.benefitsHeader)}</h3>\n <table className=\"w-100 text-center subscription-comparison-table\" data-testid=\"subscription-card-table\">\n <thead>\n <tr>\n <th scope=\"col\"><span className=\"sr-only\">{formatMessage(messages.featureColumn)}</span></th>\n {showBuyColumn && (\n <th scope=\"col\" className=\"audit-cell top-audit-border font-weight-normal\" data-testid=\"subscription-card-buy-header\">\n <div className=\"center-items flex-column\">\n <span>{formatMessage(messages.buyColumn)}</span>\n {coursePrice && <span>{coursePrice}</span>}\n </div>\n </th>\n )}\n {showSubscribeColumn && (\n <th scope=\"col\" className=\"verified-cell top-verified-border\" data-testid=\"subscription-card-subscribe-header\">\n <div className=\"center-items flex-column\">\n <span>{formatMessage(messages.subscribeColumn)}</span>\n {subscribePrice && <span className=\"font-weight-normal\">{subscribePrice}</span>}\n </div>\n </th>\n )}\n </tr>\n </thead>\n <tbody>\n {rows.map((row, index) => {\n const last = index === rows.length - 1;\n return (\n <tr key={row.key} data-testid={`subscription-card-row-${row.key}`}>\n <th scope=\"row\" className={classNames('feature-cell text-left font-weight-normal', { 'bottom-no-border': last })}>\n {row.label}\n </th>\n {showBuyColumn && (\n <td className={classNames('audit-cell', { 'bottom-audit-border': last })}>\n <div className=\"center-items\">{row.buy ? included : notIncluded}</div>\n </td>\n )}\n {showSubscribeColumn && (\n <td className={classNames('verified-cell', { 'bottom-verified-border': last })}>\n <div className=\"center-items\">{included}</div>\n </td>\n )}\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n )}\n <SubscriptionUpsell\n courseId={courseId}\n className=\"px-4 pb-4 pt-3\"\n onSubscribeClick={onSubscribeClick}\n onPurchaseClick={onPurchaseClick}\n onUpgradeEvent={onUpgradeEvent}\n onUpgraded={onUpgraded}\n />\n </section>\n );\n};\n\nSubscriptionUpgradeCard.propTypes = {\n courseId: PropTypes.string.isRequired,\n withBorder: PropTypes.bool,\n onSubscribeClick: PropTypes.func,\n onPurchaseClick: PropTypes.func,\n onUpgradeEvent: PropTypes.func,\n onUpgraded: PropTypes.func,\n // The courseware sidebar widget passes its toggle so the card can close it.\n onClose: PropTypes.func,\n // Host content shown under the certificate preview, such as the access expiration countdown.\n banner: PropTypes.node,\n};\n\nSubscriptionUpgradeCard.defaultProps = {\n withBorder: false,\n onSubscribeClick: undefined,\n onPurchaseClick: undefined,\n onUpgradeEvent: undefined,\n onUpgraded: undefined,\n onClose: undefined,\n banner: undefined,\n};\n\nexport default SubscriptionUpgradeCard;\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -10,8 +10,9 @@ var _i18n = require("@edx/frontend-platform/i18n");
|
|
|
10
10
|
var _logging = require("@edx/frontend-platform/logging");
|
|
11
11
|
var _paragon = require("@openedx/paragon");
|
|
12
12
|
var _lms_api = require("../data/lms_api");
|
|
13
|
+
var _messages = _interopRequireDefault(require("../upgrade-notification/messages"));
|
|
13
14
|
var _useSubscriptionOffer = _interopRequireDefault(require("./useSubscriptionOffer"));
|
|
14
|
-
var
|
|
15
|
+
var _messages2 = _interopRequireDefault(require("./messages"));
|
|
15
16
|
var _jsxRuntime = require("react/jsx-runtime");
|
|
16
17
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
17
18
|
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
|
|
@@ -108,7 +109,7 @@ const SubscriptionUpsell = _ref => {
|
|
|
108
109
|
className: className,
|
|
109
110
|
role: "status",
|
|
110
111
|
"data-testid": "subscription-upgrade-pending",
|
|
111
|
-
children: formatMessage(
|
|
112
|
+
children: formatMessage(_messages2.default.upgradePending)
|
|
112
113
|
});
|
|
113
114
|
}
|
|
114
115
|
return /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
|
|
@@ -116,23 +117,23 @@ const SubscriptionUpsell = _ref => {
|
|
|
116
117
|
children: [upgradeState === UPGRADE_STATE.NOT_ACTIVE && /*#__PURE__*/(0, _jsxRuntime.jsxs)("p", {
|
|
117
118
|
role: "alert",
|
|
118
119
|
"data-testid": "subscription-upgrade-not-active",
|
|
119
|
-
children: [formatMessage(
|
|
120
|
+
children: [formatMessage(_messages2.default.upgradeNotActive), offer.subscribeUrl && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
|
|
120
121
|
children: [' ', /*#__PURE__*/(0, _jsxRuntime.jsx)(_paragon.Hyperlink, {
|
|
121
122
|
destination: offer.subscribeUrl,
|
|
122
|
-
children: formatMessage(
|
|
123
|
+
children: formatMessage(_messages2.default.reactivateSubscription)
|
|
123
124
|
})]
|
|
124
125
|
})]
|
|
125
126
|
}), upgradeState === UPGRADE_STATE.FAILED && /*#__PURE__*/(0, _jsxRuntime.jsx)("p", {
|
|
126
127
|
role: "alert",
|
|
127
128
|
"data-testid": "subscription-upgrade-failed",
|
|
128
|
-
children: formatMessage(
|
|
129
|
+
children: formatMessage(_messages2.default.upgradeFailed)
|
|
129
130
|
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_paragon.Button, {
|
|
130
131
|
variant: "brand",
|
|
131
132
|
block: true,
|
|
132
133
|
onClick: handleUpgrade,
|
|
133
134
|
disabled: upgradeState === UPGRADE_STATE.LOADING,
|
|
134
135
|
"data-testid": "subscription-upgrade-now-button",
|
|
135
|
-
children: formatMessage(upgradeState === UPGRADE_STATE.LOADING ?
|
|
136
|
+
children: formatMessage(upgradeState === UPGRADE_STATE.LOADING ? _messages2.default.upgrading : _messages2.default.upgradeNow)
|
|
136
137
|
})]
|
|
137
138
|
});
|
|
138
139
|
}
|
|
@@ -143,7 +144,7 @@ const SubscriptionUpsell = _ref => {
|
|
|
143
144
|
className: className,
|
|
144
145
|
children: [offer.showNotIncluded && /*#__PURE__*/(0, _jsxRuntime.jsx)("p", {
|
|
145
146
|
"data-testid": "subscription-not-included",
|
|
146
|
-
children: formatMessage(
|
|
147
|
+
children: formatMessage(_messages2.default.notIncluded)
|
|
147
148
|
}), /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
|
|
148
149
|
className: "d-flex",
|
|
149
150
|
children: [canPurchase && /*#__PURE__*/(0, _jsxRuntime.jsx)(_paragon.Button, {
|
|
@@ -152,9 +153,9 @@ const SubscriptionUpsell = _ref => {
|
|
|
152
153
|
variant: offer.canSubscribe ? 'outline-primary' : 'brand',
|
|
153
154
|
onClick: onPurchaseClick,
|
|
154
155
|
"data-testid": "subscription-purchase-button",
|
|
155
|
-
children: coursePrice ? formatMessage(
|
|
156
|
+
children: coursePrice ? formatMessage(_messages2.default.purchase, {
|
|
156
157
|
price: coursePrice
|
|
157
|
-
}) : formatMessage(
|
|
158
|
+
}) : formatMessage(_messages2.default.purchaseNoPrice)
|
|
158
159
|
}), offer.canSubscribe && /*#__PURE__*/(0, _jsxRuntime.jsx)(_paragon.Button, {
|
|
159
160
|
as: "a",
|
|
160
161
|
href: offer.subscribeUrl,
|
|
@@ -162,8 +163,17 @@ const SubscriptionUpsell = _ref => {
|
|
|
162
163
|
className: "ml-2",
|
|
163
164
|
onClick: onSubscribeClick,
|
|
164
165
|
"data-testid": "subscription-subscribe-button",
|
|
165
|
-
children: formatMessage(
|
|
166
|
+
children: formatMessage(_messages2.default.subscribe)
|
|
166
167
|
})]
|
|
168
|
+
}), canPurchase && offer.purchaseCode && /*#__PURE__*/(0, _jsxRuntime.jsx)("p", {
|
|
169
|
+
className: "mt-2 mb-0",
|
|
170
|
+
"data-testid": "subscription-purchase-code",
|
|
171
|
+
children: formatMessage(_messages.default.discountCodeMessage, {
|
|
172
|
+
code: /*#__PURE__*/(0, _jsxRuntime.jsx)("span", {
|
|
173
|
+
className: "font-weight-bold",
|
|
174
|
+
children: offer.purchaseCode
|
|
175
|
+
})
|
|
176
|
+
})
|
|
167
177
|
})]
|
|
168
178
|
});
|
|
169
179
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SubscriptionUpsell.js","names":["_react","_interopRequireWildcard","require","_propTypes","_interopRequireDefault","_i18n","_logging","_paragon","_lms_api","_useSubscriptionOffer","_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","UPGRADE_STATE","exports","IDLE","LOADING","PENDING","NOT_ACTIVE","FAILED","safeCall","fn","_len","args","Array","_key","Promise","resolve","catch","logError","error","SubscriptionUpsell","_ref","courseId","onSubscribeClick","onPurchaseClick","onUpgradeEvent","onUpgraded","className","formatMessage","useIntl","offer","useSubscriptionOffer","upgrades","setUpgrades","useState","inFlight","useRef","Set","upgradeState","setUpgradeFor","id","state","prev","purchaseUrl","canPurchase","coursePrice","handleUpgrade","requestedCourseId","current","add","nextState","result","upgradeEnrollmentWithSubscription","success","SubscriptionUpgradeError","code","status","delete","canUpgradeInPlace","jsx","role","children","messages","upgradePending","jsxs","upgradeNotActive","subscribeUrl","Fragment","Hyperlink","destination","reactivateSubscription","upgradeFailed","Button","variant","block","onClick","disabled","upgrading","upgradeNow","canSubscribe","showNotIncluded","notIncluded","as","href","purchase","price","purchaseNoPrice","subscribe","propTypes","PropTypes","string","isRequired","func","defaultProps","undefined","_default"],"sources":["../../src/subscription-upsell/SubscriptionUpsell.jsx"],"sourcesContent":["/* eslint import/no-unresolved: 0 */\nimport React, { useRef, useState } from 'react';\nimport PropTypes from 'prop-types';\nimport { useIntl } from '@edx/frontend-platform/i18n';\nimport { logError } from '@edx/frontend-platform/logging';\nimport { Button, Hyperlink } from '@openedx/paragon';\n\nimport { SubscriptionUpgradeError, upgradeEnrollmentWithSubscription } from '../data/lms_api';\nimport useSubscriptionOffer from './useSubscriptionOffer';\nimport messages from './messages';\n\nexport const UPGRADE_STATE = {\n IDLE: 'idle',\n LOADING: 'loading',\n PENDING: 'pending',\n NOT_ACTIVE: 'not_active',\n FAILED: 'failed',\n};\n\n// Host callbacks (analytics, refresh) must never change the outcome of the upgrade request.\nconst safeCall = (fn, ...args) => {\n try {\n Promise.resolve(fn?.(...args)).catch(logError);\n } catch (error) {\n logError(error);\n }\n};\n\n/** Subscribe and Purchase, Purchase only, Upgrade now for subscribers, or the \"not included\" note. */\nconst SubscriptionUpsell = ({\n courseId,\n onSubscribeClick,\n onPurchaseClick,\n onUpgradeEvent,\n onUpgraded,\n className,\n}) => {\n const { formatMessage } = useIntl();\n const offer = useSubscriptionOffer(courseId);\n // Per course, so a course change reads as idle and a late response cannot touch another course.\n const [upgrades, setUpgrades] = useState({});\n const inFlight = useRef(new Set());\n const upgradeState = upgrades[courseId] || UPGRADE_STATE.IDLE;\n const setUpgradeFor = (id, state) => setUpgrades((prev) => ({ ...prev, [id]: state }));\n\n if (!offer) {\n return null;\n }\n\n const { purchaseUrl, canPurchase, coursePrice } = offer;\n\n const handleUpgrade = async () => {\n const requestedCourseId = courseId;\n if (inFlight.current.has(requestedCourseId)) {\n return;\n }\n inFlight.current.add(requestedCourseId);\n setUpgradeFor(requestedCourseId, UPGRADE_STATE.LOADING);\n safeCall(onUpgradeEvent, 'started');\n let nextState;\n let result;\n let error;\n try {\n result = await upgradeEnrollmentWithSubscription(requestedCourseId);\n if (result?.success !== true) {\n throw new SubscriptionUpgradeError('Upgrade was not accepted', { code: result?.code, status: result?.status });\n }\n nextState = UPGRADE_STATE.PENDING;\n } catch (e) {\n error = e;\n nextState = e.code === 'SUBSCRIPTION_NOT_ACTIVE' ? UPGRADE_STATE.NOT_ACTIVE : UPGRADE_STATE.FAILED;\n }\n inFlight.current.delete(requestedCourseId);\n setUpgradeFor(requestedCourseId, nextState);\n if (error) {\n safeCall(onUpgradeEvent, 'failed', error);\n } else {\n safeCall(onUpgradeEvent, 'succeeded');\n safeCall(onUpgraded, result);\n }\n };\n\n if (offer.canUpgradeInPlace) {\n if (upgradeState === UPGRADE_STATE.PENDING) {\n return <p className={className} role=\"status\" data-testid=\"subscription-upgrade-pending\">{formatMessage(messages.upgradePending)}</p>;\n }\n return (\n <div className={className}>\n {upgradeState === UPGRADE_STATE.NOT_ACTIVE && (\n <p role=\"alert\" data-testid=\"subscription-upgrade-not-active\">\n {formatMessage(messages.upgradeNotActive)}\n {offer.subscribeUrl && (\n <>\n {' '}\n <Hyperlink destination={offer.subscribeUrl}>{formatMessage(messages.reactivateSubscription)}</Hyperlink>\n </>\n )}\n </p>\n )}\n {upgradeState === UPGRADE_STATE.FAILED && (\n <p role=\"alert\" data-testid=\"subscription-upgrade-failed\">{formatMessage(messages.upgradeFailed)}</p>\n )}\n <Button\n variant=\"brand\"\n block\n onClick={handleUpgrade}\n disabled={upgradeState === UPGRADE_STATE.LOADING}\n data-testid=\"subscription-upgrade-now-button\"\n >\n {formatMessage(upgradeState === UPGRADE_STATE.LOADING ? messages.upgrading : messages.upgradeNow)}\n </Button>\n </div>\n );\n }\n\n if (!canPurchase && !offer.canSubscribe && !offer.showNotIncluded) {\n return null;\n }\n\n return (\n <div className={className}>\n {offer.showNotIncluded && (\n <p data-testid=\"subscription-not-included\">{formatMessage(messages.notIncluded)}</p>\n )}\n <div className=\"d-flex\">\n {canPurchase && (\n <Button\n as=\"a\"\n href={purchaseUrl}\n variant={offer.canSubscribe ? 'outline-primary' : 'brand'}\n onClick={onPurchaseClick}\n data-testid=\"subscription-purchase-button\"\n >\n {coursePrice\n ? formatMessage(messages.purchase, { price: coursePrice })\n : formatMessage(messages.purchaseNoPrice)}\n </Button>\n )}\n {offer.canSubscribe && (\n <Button\n as=\"a\"\n href={offer.subscribeUrl}\n variant=\"brand\"\n className=\"ml-2\"\n onClick={onSubscribeClick}\n data-testid=\"subscription-subscribe-button\"\n >\n {formatMessage(messages.subscribe)}\n </Button>\n )}\n </div>\n </div>\n );\n};\n\nSubscriptionUpsell.propTypes = {\n courseId: PropTypes.string.isRequired,\n onSubscribeClick: PropTypes.func,\n onPurchaseClick: PropTypes.func,\n onUpgradeEvent: PropTypes.func,\n onUpgraded: PropTypes.func,\n className: PropTypes.string,\n};\n\nSubscriptionUpsell.defaultProps = {\n onSubscribeClick: undefined,\n onPurchaseClick: undefined,\n onUpgradeEvent: undefined,\n onUpgraded: undefined,\n className: undefined,\n};\n\nexport default SubscriptionUpsell;\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"SubscriptionUpsell.js","names":["_react","_interopRequireWildcard","require","_propTypes","_interopRequireDefault","_i18n","_logging","_paragon","_lms_api","_messages","_useSubscriptionOffer","_messages2","_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","UPGRADE_STATE","exports","IDLE","LOADING","PENDING","NOT_ACTIVE","FAILED","safeCall","fn","_len","args","Array","_key","Promise","resolve","catch","logError","error","SubscriptionUpsell","_ref","courseId","onSubscribeClick","onPurchaseClick","onUpgradeEvent","onUpgraded","className","formatMessage","useIntl","offer","useSubscriptionOffer","upgrades","setUpgrades","useState","inFlight","useRef","Set","upgradeState","setUpgradeFor","id","state","prev","purchaseUrl","canPurchase","coursePrice","handleUpgrade","requestedCourseId","current","add","nextState","result","upgradeEnrollmentWithSubscription","success","SubscriptionUpgradeError","code","status","delete","canUpgradeInPlace","jsx","role","children","messages","upgradePending","jsxs","upgradeNotActive","subscribeUrl","Fragment","Hyperlink","destination","reactivateSubscription","upgradeFailed","Button","variant","block","onClick","disabled","upgrading","upgradeNow","canSubscribe","showNotIncluded","notIncluded","as","href","purchase","price","purchaseNoPrice","subscribe","purchaseCode","upgradeNotificationMessages","discountCodeMessage","propTypes","PropTypes","string","isRequired","func","defaultProps","undefined","_default"],"sources":["../../src/subscription-upsell/SubscriptionUpsell.jsx"],"sourcesContent":["/* eslint import/no-unresolved: 0 */\nimport React, { useRef, useState } from 'react';\nimport PropTypes from 'prop-types';\nimport { useIntl } from '@edx/frontend-platform/i18n';\nimport { logError } from '@edx/frontend-platform/logging';\nimport { Button, Hyperlink } from '@openedx/paragon';\n\nimport { SubscriptionUpgradeError, upgradeEnrollmentWithSubscription } from '../data/lms_api';\nimport upgradeNotificationMessages from '../upgrade-notification/messages';\nimport useSubscriptionOffer from './useSubscriptionOffer';\nimport messages from './messages';\n\nexport const UPGRADE_STATE = {\n IDLE: 'idle',\n LOADING: 'loading',\n PENDING: 'pending',\n NOT_ACTIVE: 'not_active',\n FAILED: 'failed',\n};\n\n// Host callbacks (analytics, refresh) must never change the outcome of the upgrade request.\nconst safeCall = (fn, ...args) => {\n try {\n Promise.resolve(fn?.(...args)).catch(logError);\n } catch (error) {\n logError(error);\n }\n};\n\n/** Subscribe and Purchase, Purchase only, Upgrade now for subscribers, or the \"not included\" note. */\nconst SubscriptionUpsell = ({\n courseId,\n onSubscribeClick,\n onPurchaseClick,\n onUpgradeEvent,\n onUpgraded,\n className,\n}) => {\n const { formatMessage } = useIntl();\n const offer = useSubscriptionOffer(courseId);\n // Per course, so a course change reads as idle and a late response cannot touch another course.\n const [upgrades, setUpgrades] = useState({});\n const inFlight = useRef(new Set());\n const upgradeState = upgrades[courseId] || UPGRADE_STATE.IDLE;\n const setUpgradeFor = (id, state) => setUpgrades((prev) => ({ ...prev, [id]: state }));\n\n if (!offer) {\n return null;\n }\n\n const { purchaseUrl, canPurchase, coursePrice } = offer;\n\n const handleUpgrade = async () => {\n const requestedCourseId = courseId;\n if (inFlight.current.has(requestedCourseId)) {\n return;\n }\n inFlight.current.add(requestedCourseId);\n setUpgradeFor(requestedCourseId, UPGRADE_STATE.LOADING);\n safeCall(onUpgradeEvent, 'started');\n let nextState;\n let result;\n let error;\n try {\n result = await upgradeEnrollmentWithSubscription(requestedCourseId);\n if (result?.success !== true) {\n throw new SubscriptionUpgradeError('Upgrade was not accepted', { code: result?.code, status: result?.status });\n }\n nextState = UPGRADE_STATE.PENDING;\n } catch (e) {\n error = e;\n nextState = e.code === 'SUBSCRIPTION_NOT_ACTIVE' ? UPGRADE_STATE.NOT_ACTIVE : UPGRADE_STATE.FAILED;\n }\n inFlight.current.delete(requestedCourseId);\n setUpgradeFor(requestedCourseId, nextState);\n if (error) {\n safeCall(onUpgradeEvent, 'failed', error);\n } else {\n safeCall(onUpgradeEvent, 'succeeded');\n safeCall(onUpgraded, result);\n }\n };\n\n if (offer.canUpgradeInPlace) {\n if (upgradeState === UPGRADE_STATE.PENDING) {\n return <p className={className} role=\"status\" data-testid=\"subscription-upgrade-pending\">{formatMessage(messages.upgradePending)}</p>;\n }\n return (\n <div className={className}>\n {upgradeState === UPGRADE_STATE.NOT_ACTIVE && (\n <p role=\"alert\" data-testid=\"subscription-upgrade-not-active\">\n {formatMessage(messages.upgradeNotActive)}\n {offer.subscribeUrl && (\n <>\n {' '}\n <Hyperlink destination={offer.subscribeUrl}>{formatMessage(messages.reactivateSubscription)}</Hyperlink>\n </>\n )}\n </p>\n )}\n {upgradeState === UPGRADE_STATE.FAILED && (\n <p role=\"alert\" data-testid=\"subscription-upgrade-failed\">{formatMessage(messages.upgradeFailed)}</p>\n )}\n <Button\n variant=\"brand\"\n block\n onClick={handleUpgrade}\n disabled={upgradeState === UPGRADE_STATE.LOADING}\n data-testid=\"subscription-upgrade-now-button\"\n >\n {formatMessage(upgradeState === UPGRADE_STATE.LOADING ? messages.upgrading : messages.upgradeNow)}\n </Button>\n </div>\n );\n }\n\n if (!canPurchase && !offer.canSubscribe && !offer.showNotIncluded) {\n return null;\n }\n\n return (\n <div className={className}>\n {offer.showNotIncluded && (\n <p data-testid=\"subscription-not-included\">{formatMessage(messages.notIncluded)}</p>\n )}\n <div className=\"d-flex\">\n {canPurchase && (\n <Button\n as=\"a\"\n href={purchaseUrl}\n variant={offer.canSubscribe ? 'outline-primary' : 'brand'}\n onClick={onPurchaseClick}\n data-testid=\"subscription-purchase-button\"\n >\n {coursePrice\n ? formatMessage(messages.purchase, { price: coursePrice })\n : formatMessage(messages.purchaseNoPrice)}\n </Button>\n )}\n {offer.canSubscribe && (\n <Button\n as=\"a\"\n href={offer.subscribeUrl}\n variant=\"brand\"\n className=\"ml-2\"\n onClick={onSubscribeClick}\n data-testid=\"subscription-subscribe-button\"\n >\n {formatMessage(messages.subscribe)}\n </Button>\n )}\n </div>\n {canPurchase && offer.purchaseCode && (\n <p className=\"mt-2 mb-0\" data-testid=\"subscription-purchase-code\">\n {formatMessage(upgradeNotificationMessages.discountCodeMessage, {\n code: <span className=\"font-weight-bold\">{offer.purchaseCode}</span>,\n })}\n </p>\n )}\n </div>\n );\n};\n\nSubscriptionUpsell.propTypes = {\n courseId: PropTypes.string.isRequired,\n onSubscribeClick: PropTypes.func,\n onPurchaseClick: PropTypes.func,\n onUpgradeEvent: PropTypes.func,\n onUpgraded: PropTypes.func,\n className: PropTypes.string,\n};\n\nSubscriptionUpsell.defaultProps = {\n onSubscribeClick: undefined,\n onPurchaseClick: undefined,\n onUpgradeEvent: undefined,\n onUpgraded: undefined,\n className: undefined,\n};\n\nexport default SubscriptionUpsell;\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -44,7 +44,9 @@ const formatCoursePrice = verifiedMode => verifiedMode?.price === undefined || v
|
|
|
44
44
|
/**
|
|
45
45
|
* The offer for a course from courseHomeMeta.extraOffer, with the flags and labels the components
|
|
46
46
|
* need, or null when the LMS sent no block (callers keep today's UI). The backend decides whether
|
|
47
|
-
* Subscribe is offered: subscribeUrl is null when not. Purchase uses the
|
|
47
|
+
* Subscribe is offered: subscribeUrl is null when not. Purchase uses the first-purchase discount
|
|
48
|
+
* (the `offer` on the outline or courseware model, as the existing upgrade button does) when there
|
|
49
|
+
* is one, else the course's verifiedMode link and price.
|
|
48
50
|
*/
|
|
49
51
|
exports.formatCoursePrice = formatCoursePrice;
|
|
50
52
|
const useSubscriptionOffer = courseId => {
|
|
@@ -53,12 +55,25 @@ const useSubscriptionOffer = courseId => {
|
|
|
53
55
|
extraOffer,
|
|
54
56
|
verifiedMode
|
|
55
57
|
} = (0, _modelStore.useModel)('courseHomeMeta', courseId) || {};
|
|
58
|
+
const outline = (0, _modelStore.useModel)('outline', courseId) || {};
|
|
59
|
+
const courseware = (0, _modelStore.useModel)('coursewareMeta', courseId) || {};
|
|
60
|
+
// Both models stay in the store across pages, so the one not fetched for this page may be stale.
|
|
61
|
+
// shortcut: an expired discount is dropped; a live one is the same per learner in both, so order is moot.
|
|
62
|
+
// Expiry is judged on server time: each model carries the server/browser clock offset.
|
|
63
|
+
const isLive = _ref => {
|
|
64
|
+
let {
|
|
65
|
+
offer,
|
|
66
|
+
timeOffsetMillis = 0
|
|
67
|
+
} = _ref;
|
|
68
|
+
return !!offer && (!offer.expirationDate || new Date(offer.expirationDate) > new Date(Date.now() + timeOffsetMillis));
|
|
69
|
+
};
|
|
70
|
+
const purchaseOffer = ([outline, courseware].find(isLive) || {}).offer || null;
|
|
56
71
|
if (!extraOffer) {
|
|
57
72
|
return null;
|
|
58
73
|
}
|
|
59
74
|
const inCatalog = extraOffer.inCatalog !== false;
|
|
60
75
|
const isSubscriber = extraOffer.isSubscriber === true;
|
|
61
|
-
const purchaseUrl = verifiedMode?.upgradeUrl || null;
|
|
76
|
+
const purchaseUrl = purchaseOffer?.upgradeUrl || verifiedMode?.upgradeUrl || null;
|
|
62
77
|
const price = formatOfferPrice(intl, extraOffer.price);
|
|
63
78
|
return _objectSpread(_objectSpread({}, extraOffer), {}, {
|
|
64
79
|
inCatalog,
|
|
@@ -69,7 +84,8 @@ const useSubscriptionOffer = courseId => {
|
|
|
69
84
|
canSubscribe: inCatalog && !isSubscriber && !!extraOffer.subscribeUrl,
|
|
70
85
|
canUpgradeInPlace: inCatalog && isSubscriber,
|
|
71
86
|
showNotIncluded: !inCatalog && isSubscriber,
|
|
72
|
-
coursePrice: formatCoursePrice(verifiedMode),
|
|
87
|
+
coursePrice: purchaseOffer ? purchaseOffer.discountedPrice : formatCoursePrice(verifiedMode),
|
|
88
|
+
purchaseCode: purchaseOffer?.code || null,
|
|
73
89
|
subscribePrice: price && intl.formatMessage(_messages.default.pricePerInterval, {
|
|
74
90
|
price,
|
|
75
91
|
interval: extraOffer.price.billingPeriod || 'month'
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useSubscriptionOffer.js","names":["_i18n","require","_modelStore","_messages","_interopRequireDefault","e","__esModule","default","ownKeys","r","t","Object","keys","getOwnPropertySymbols","o","filter","getOwnPropertyDescriptor","enumerable","push","apply","_objectSpread","arguments","length","forEach","_defineProperty","getOwnPropertyDescriptors","defineProperties","defineProperty","_toPropertyKey","value","configurable","writable","i","_toPrimitive","Symbol","toPrimitive","call","TypeError","String","Number","SUBSCRIPTION_STATUS","exports","NOT_SUBSCRIBED","TRIAL_ACTIVE","ACTIVE","CANCEL_PENDING","CANCELLED","UNKNOWN","formatOfferPrice","intl","price","amount","undefined","formatNumber","style","currency","isInteger","minimumFractionDigits","formatCoursePrice","verifiedMode","currencySymbol","useSubscriptionOffer","courseId","useIntl","extraOffer","useModel","inCatalog","isSubscriber","purchaseUrl","upgradeUrl","hasTrial","freeTrialEligible","canPurchase","canSubscribe","subscribeUrl","canUpgradeInPlace","showNotIncluded","coursePrice","subscribePrice","formatMessage","messages","pricePerInterval","interval","billingPeriod","_default"],"sources":["../../src/subscription-upsell/useSubscriptionOffer.js"],"sourcesContent":["/* eslint import/no-unresolved: 0 */\nimport { useIntl } from '@edx/frontend-platform/i18n';\nimport { useModel } from '@src/generic/model-store';\n\nimport messages from './messages';\n\n// Viax statuses, as the LMS extra_offer block reports them.\nexport const SUBSCRIPTION_STATUS = {\n NOT_SUBSCRIBED: 'NOT_SUBSCRIBED',\n TRIAL_ACTIVE: 'TRIAL_ACTIVE',\n ACTIVE: 'ACTIVE',\n CANCEL_PENDING: 'CANCEL_PENDING',\n CANCELLED: 'CANCELLED',\n UNKNOWN: 'UNKNOWN',\n};\n\n/** \"$39\" from { amount: \"39.00\", currency: \"USD\" }, or null without a price. */\nexport const formatOfferPrice = (intl, price) => {\n if (price?.amount === undefined || price?.amount === null) {\n return null;\n }\n const amount = Number(price.amount);\n return intl.formatNumber(amount, {\n style: 'currency',\n currency: price.currency || 'USD',\n // Whole amounts show as \"$39\"; otherwise the currency's own precision applies.\n ...(Number.isInteger(amount) ? { minimumFractionDigits: 0 } : {}),\n });\n};\n\n/** \"$149\" from verifiedMode, as the existing upgrade button shows it, or null. */\nexport const formatCoursePrice = (verifiedMode) => (\n verifiedMode?.price === undefined || verifiedMode?.price === null\n ? null\n : `${verifiedMode.currencySymbol || ''}${verifiedMode.price}`\n);\n\n/**\n * The offer for a course from courseHomeMeta.extraOffer, with the flags and labels the components\n * need, or null when the LMS sent no block (callers keep today's UI). The backend decides whether\n * Subscribe is offered: subscribeUrl is null when not. Purchase uses the course's verifiedMode link.\n */\nconst useSubscriptionOffer = (courseId) => {\n const intl = useIntl();\n const { extraOffer, verifiedMode } = useModel('courseHomeMeta', courseId) || {};\n if (!extraOffer) {\n return null;\n }\n const inCatalog = extraOffer.inCatalog !== false;\n const isSubscriber = extraOffer.isSubscriber === true;\n const purchaseUrl = verifiedMode?.upgradeUrl || null;\n const price = formatOfferPrice(intl, extraOffer.price);\n return {\n ...extraOffer,\n inCatalog,\n isSubscriber,\n purchaseUrl,\n hasTrial: extraOffer.freeTrialEligible === true,\n canPurchase: !!purchaseUrl,\n canSubscribe: inCatalog && !isSubscriber && !!extraOffer.subscribeUrl,\n canUpgradeInPlace: inCatalog && isSubscriber,\n showNotIncluded: !inCatalog && isSubscriber,\n coursePrice: formatCoursePrice(verifiedMode),\n subscribePrice: price && intl.formatMessage(messages.pricePerInterval, {\n price,\n interval: extraOffer.price.billingPeriod || 'month',\n }),\n };\n};\n\nexport default useSubscriptionOffer;\n"],"mappings":"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
|
|
1
|
+
{"version":3,"file":"useSubscriptionOffer.js","names":["_i18n","require","_modelStore","_messages","_interopRequireDefault","e","__esModule","default","ownKeys","r","t","Object","keys","getOwnPropertySymbols","o","filter","getOwnPropertyDescriptor","enumerable","push","apply","_objectSpread","arguments","length","forEach","_defineProperty","getOwnPropertyDescriptors","defineProperties","defineProperty","_toPropertyKey","value","configurable","writable","i","_toPrimitive","Symbol","toPrimitive","call","TypeError","String","Number","SUBSCRIPTION_STATUS","exports","NOT_SUBSCRIBED","TRIAL_ACTIVE","ACTIVE","CANCEL_PENDING","CANCELLED","UNKNOWN","formatOfferPrice","intl","price","amount","undefined","formatNumber","style","currency","isInteger","minimumFractionDigits","formatCoursePrice","verifiedMode","currencySymbol","useSubscriptionOffer","courseId","useIntl","extraOffer","useModel","outline","courseware","isLive","_ref","offer","timeOffsetMillis","expirationDate","Date","now","purchaseOffer","find","inCatalog","isSubscriber","purchaseUrl","upgradeUrl","hasTrial","freeTrialEligible","canPurchase","canSubscribe","subscribeUrl","canUpgradeInPlace","showNotIncluded","coursePrice","discountedPrice","purchaseCode","code","subscribePrice","formatMessage","messages","pricePerInterval","interval","billingPeriod","_default"],"sources":["../../src/subscription-upsell/useSubscriptionOffer.js"],"sourcesContent":["/* eslint import/no-unresolved: 0 */\nimport { useIntl } from '@edx/frontend-platform/i18n';\nimport { useModel } from '@src/generic/model-store';\n\nimport messages from './messages';\n\n// Viax statuses, as the LMS extra_offer block reports them.\nexport const SUBSCRIPTION_STATUS = {\n NOT_SUBSCRIBED: 'NOT_SUBSCRIBED',\n TRIAL_ACTIVE: 'TRIAL_ACTIVE',\n ACTIVE: 'ACTIVE',\n CANCEL_PENDING: 'CANCEL_PENDING',\n CANCELLED: 'CANCELLED',\n UNKNOWN: 'UNKNOWN',\n};\n\n/** \"$39\" from { amount: \"39.00\", currency: \"USD\" }, or null without a price. */\nexport const formatOfferPrice = (intl, price) => {\n if (price?.amount === undefined || price?.amount === null) {\n return null;\n }\n const amount = Number(price.amount);\n return intl.formatNumber(amount, {\n style: 'currency',\n currency: price.currency || 'USD',\n // Whole amounts show as \"$39\"; otherwise the currency's own precision applies.\n ...(Number.isInteger(amount) ? { minimumFractionDigits: 0 } : {}),\n });\n};\n\n/** \"$149\" from verifiedMode, as the existing upgrade button shows it, or null. */\nexport const formatCoursePrice = (verifiedMode) => (\n verifiedMode?.price === undefined || verifiedMode?.price === null\n ? null\n : `${verifiedMode.currencySymbol || ''}${verifiedMode.price}`\n);\n\n/**\n * The offer for a course from courseHomeMeta.extraOffer, with the flags and labels the components\n * need, or null when the LMS sent no block (callers keep today's UI). The backend decides whether\n * Subscribe is offered: subscribeUrl is null when not. Purchase uses the first-purchase discount\n * (the `offer` on the outline or courseware model, as the existing upgrade button does) when there\n * is one, else the course's verifiedMode link and price.\n */\nconst useSubscriptionOffer = (courseId) => {\n const intl = useIntl();\n const { extraOffer, verifiedMode } = useModel('courseHomeMeta', courseId) || {};\n const outline = useModel('outline', courseId) || {};\n const courseware = useModel('coursewareMeta', courseId) || {};\n // Both models stay in the store across pages, so the one not fetched for this page may be stale.\n // shortcut: an expired discount is dropped; a live one is the same per learner in both, so order is moot.\n // Expiry is judged on server time: each model carries the server/browser clock offset.\n const isLive = ({ offer, timeOffsetMillis = 0 }) => !!offer && (\n !offer.expirationDate || new Date(offer.expirationDate) > new Date(Date.now() + timeOffsetMillis)\n );\n const purchaseOffer = ([outline, courseware].find(isLive) || {}).offer || null;\n if (!extraOffer) {\n return null;\n }\n const inCatalog = extraOffer.inCatalog !== false;\n const isSubscriber = extraOffer.isSubscriber === true;\n const purchaseUrl = purchaseOffer?.upgradeUrl || verifiedMode?.upgradeUrl || null;\n const price = formatOfferPrice(intl, extraOffer.price);\n return {\n ...extraOffer,\n inCatalog,\n isSubscriber,\n purchaseUrl,\n hasTrial: extraOffer.freeTrialEligible === true,\n canPurchase: !!purchaseUrl,\n canSubscribe: inCatalog && !isSubscriber && !!extraOffer.subscribeUrl,\n canUpgradeInPlace: inCatalog && isSubscriber,\n showNotIncluded: !inCatalog && isSubscriber,\n coursePrice: purchaseOffer ? purchaseOffer.discountedPrice : formatCoursePrice(verifiedMode),\n purchaseCode: purchaseOffer?.code || null,\n subscribePrice: price && intl.formatMessage(messages.pricePerInterval, {\n price,\n interval: extraOffer.price.billingPeriod || 'month',\n }),\n };\n};\n\nexport default useSubscriptionOffer;\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -14,6 +14,7 @@ var _icons = require("@openedx/paragon/icons");
|
|
|
14
14
|
var _upgradeButton = require("@src/generic/upgrade-button");
|
|
15
15
|
var _modelStore = require("@src/generic/model-store");
|
|
16
16
|
var _data = require("../data");
|
|
17
|
+
var _subscriptionUpsell = require("../subscription-upsell");
|
|
17
18
|
var _certificatePreview = _interopRequireDefault(require("./certificate-preview"));
|
|
18
19
|
var _generic = require("../generic");
|
|
19
20
|
var _utils = _interopRequireDefault(require("./utils"));
|
|
@@ -26,7 +27,9 @@ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbol
|
|
|
26
27
|
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; }
|
|
27
28
|
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; }
|
|
28
29
|
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
|
|
29
|
-
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 */
|
|
30
|
+
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 */ // Placements that show the subscription card: course home and the courseware sidebar
|
|
31
|
+
// (tray and widget). The Progress page keeps the current card.
|
|
32
|
+
const SUBSCRIPTION_CARD_PLACEMENTS = ['outline', 'notification_tray', 'notification_widget'];
|
|
30
33
|
const UpgradeNotification = _ref => {
|
|
31
34
|
let {
|
|
32
35
|
id,
|
|
@@ -57,23 +60,30 @@ const UpgradeNotification = _ref => {
|
|
|
57
60
|
const {
|
|
58
61
|
conversion
|
|
59
62
|
} = (0, _cohesion.useCohesion)(courseId);
|
|
63
|
+
const subscriptionOffer = (0, _subscriptionUpsell.useSubscriptionOffer)(courseId);
|
|
60
64
|
const dateNow = Date.now();
|
|
61
65
|
const timezoneFormatArgs = userTimezone ? {
|
|
62
66
|
timeZone: userTimezone
|
|
63
67
|
} : {};
|
|
64
68
|
const correctedTime = new Date(dateNow + timeOffsetMillis);
|
|
65
69
|
const accessExpirationDate = accessExpiration ? new Date(accessExpiration.upgradeDeadline) : null;
|
|
66
|
-
|
|
70
|
+
// Server time, so this agrees with the countdown and the FBE branches below.
|
|
71
|
+
const pastExpirationDeadline = accessExpiration ? correctedTime > accessExpirationDate : false;
|
|
67
72
|
const shouldDisplayBorder = pluginLocationId.includes('outline');
|
|
73
|
+
const isSubscriptionCardPlacement = SUBSCRIPTION_CARD_PLACEMENTS.some(placement => pluginLocationId.includes(placement));
|
|
74
|
+
// Without an offer, past the upgrade deadline, and on the Progress page, today's card renders.
|
|
75
|
+
const showSubscriptionCard = isSubscriptionCardPlacement && !pastExpirationDeadline && !!subscriptionOffer;
|
|
68
76
|
const upsellPageName = (0, _utils.default)({
|
|
69
77
|
id: pluginLocationId
|
|
70
78
|
});
|
|
71
79
|
const setupgradeNotificationCurrentState = setNotificationCurrentState;
|
|
72
80
|
const isFBE = !!accessExpiration && !!datesBannerInfo?.contentTypeGatingEnabled;
|
|
73
|
-
const eventProperties = {
|
|
81
|
+
const eventProperties = _objectSpread({
|
|
74
82
|
org_key: org,
|
|
75
83
|
courserun_key: courseId
|
|
76
|
-
}
|
|
84
|
+
}, showSubscriptionCard && {
|
|
85
|
+
variant: 'subscription'
|
|
86
|
+
});
|
|
77
87
|
const promotionEventProperties = _objectSpread({
|
|
78
88
|
creative: 'sidebarupsell',
|
|
79
89
|
name: 'In-Course Verification Prompt',
|
|
@@ -110,6 +120,43 @@ const UpgradeNotification = _ref => {
|
|
|
110
120
|
pageName: upsellPageName
|
|
111
121
|
}));
|
|
112
122
|
};
|
|
123
|
+
const logSubscribeClick = () => {
|
|
124
|
+
(0, _analytics.sendTrackEvent)('edx.bi.ecommerce.upsell_links_clicked', _objectSpread(_objectSpread({}, eventProperties), {}, {
|
|
125
|
+
linkCategory: 'subscription',
|
|
126
|
+
linkName: `${upsellPageName}_subscribe`,
|
|
127
|
+
linkType: 'button',
|
|
128
|
+
pageName: upsellPageName
|
|
129
|
+
}));
|
|
130
|
+
conversion('Subscribed');
|
|
131
|
+
};
|
|
132
|
+
if (showSubscriptionCard) {
|
|
133
|
+
// the card handles every offer state itself
|
|
134
|
+
let banner;
|
|
135
|
+
if (isFBE) {
|
|
136
|
+
// content-gated learners keep the access expiration warning and its sidebar dot stages
|
|
137
|
+
const hoursToAccessExpiration = Math.floor((accessExpirationDate - correctedTime) / 1000 / 60 / 60);
|
|
138
|
+
banner = hoursToAccessExpiration < 7 * 24 ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_generic.ExpirationCountdown, {
|
|
139
|
+
courseId: courseId,
|
|
140
|
+
hoursToExpiration: hoursToAccessExpiration,
|
|
141
|
+
setupgradeNotificationCurrentState: setupgradeNotificationCurrentState,
|
|
142
|
+
type: "access"
|
|
143
|
+
}) : /*#__PURE__*/(0, _jsxRuntime.jsx)(_generic.AccessExpirationDateBanner, {
|
|
144
|
+
courseId: courseId,
|
|
145
|
+
accessExpirationDate: accessExpirationDate,
|
|
146
|
+
timezoneFormatArgs: timezoneFormatArgs,
|
|
147
|
+
setupgradeNotificationCurrentState: setupgradeNotificationCurrentState
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_subscriptionUpsell.SubscriptionUpgradeCard, {
|
|
151
|
+
courseId: courseId,
|
|
152
|
+
withBorder: shouldDisplayBorder,
|
|
153
|
+
banner: banner,
|
|
154
|
+
onSubscribeClick: logSubscribeClick,
|
|
155
|
+
onPurchaseClick: logUpgradeClick,
|
|
156
|
+
onUpgradeEvent: stage => stage === 'succeeded' && logUpgradeClick(),
|
|
157
|
+
onClose: toggleSidebar
|
|
158
|
+
});
|
|
159
|
+
}
|
|
113
160
|
|
|
114
161
|
/*
|
|
115
162
|
There are 5 parts that change in the upgrade card:
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UpgradeNotification.js","names":["_react","_interopRequireWildcard","require","_propTypes","_interopRequireDefault","_classnames","_i18n","_analytics","_paragon","_icons","_upgradeButton","_modelStore","_data","_certificatePreview","_generic","_utils","_messages","_cohesion","_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","UpgradeNotification","_ref","id","courseId","model","setNotificationCurrentState","toggleSidebar","pluginLocationId","formatMessage","useIntl","org","userTimezone","verifiedMode","useModel","marketingUrl","learningAssistantEnabled","accessExpiration","datesBannerInfo","offer","timeOffsetMillis","conversion","useCohesion","dateNow","Date","now","timezoneFormatArgs","timeZone","correctedTime","accessExpirationDate","upgradeDeadline","pastExpirationDeadline","shouldDisplayBorder","includes","upsellPageName","getUpsellPageName","setupgradeNotificationCurrentState","isFBE","contentTypeGatingEnabled","eventProperties","org_key","courserun_key","promotionEventProperties","creative","name","position","promotion_id","useEffect","sendTrackingLogEvent","sendTrackEvent","logUpgradeClick","location","linkCategory","linkName","linkType","pageName","logClickPastExpiration","upgradeNotificationHeaderText","expirationBanner","callToActionButton","offerCode","upsellMessage","jsx","UpsellTable","hoursToAccessExpiration","Math","floor","hoursToDiscountExpiration","expirationDate","messages","firstTimeLearnerDiscountHeader","percentage","ExpirationCountdown","hoursToExpiration","type","accessExpirationHeader","AccessExpirationDateBanner","accessExpirationUrgentHeader","PAGE_NAMES","PROGRESS","UpsellFBESoonCardContent","accessExpirationPastHeader","PastExpirationDateBanner","PastExpirationCardContent","Button","variant","onClick","href","block","children","pastExpirationCallToActionLabel","UpgradeButton","className","discountCodeMessage","code","classNames","jsxs","pursueCertificateMessage","IconButton","src","Close","size","iconAs","Icon","alt","closeAlt","propTypes","PropTypes","string","isRequired","func","defaultProps","_default","exports"],"sources":["../../src/upgrade-notification/UpgradeNotification.jsx"],"sourcesContent":["/* eslint import/no-unresolved: 0 */\nimport React, { useEffect } from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport { useIntl } 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';\n\nimport { UpgradeButton } from '@src/generic/upgrade-button';\nimport { useModel } from '@src/generic/model-store';\n\nimport { PAGE_NAMES } from '../data';\nimport CertificatePreview from './certificate-preview';\nimport {\n ExpirationCountdown,\n AccessExpirationDateBanner,\n PastExpirationDateBanner,\n PastExpirationCardContent,\n UpsellFBESoonCardContent,\n UpsellTable,\n} from '../generic';\nimport getUpsellPageName from './utils';\nimport messages from './messages';\nimport { useCohesion } from '../cohesion';\n\nconst UpgradeNotification = ({\n id,\n courseId,\n model,\n setNotificationCurrentState,\n toggleSidebar,\n}) => {\n const pluginLocationId = id;\n const { formatMessage } = useIntl();\n\n const {\n org,\n userTimezone,\n verifiedMode,\n } = useModel('courseHomeMeta', courseId);\n\n const {\n marketingUrl,\n learningAssistantEnabled,\n } = useModel('coursewareMeta', courseId);\n\n const {\n accessExpiration,\n datesBannerInfo,\n offer,\n timeOffsetMillis,\n } = useModel(model, courseId);\n\n const { conversion } = useCohesion(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.upgradeDeadline) : null;\n const pastExpirationDeadline = accessExpiration ? new Date(dateNow) > accessExpirationDate : false;\n const shouldDisplayBorder = pluginLocationId.includes('outline');\n const upsellPageName = getUpsellPageName({ id: pluginLocationId });\n const setupgradeNotificationCurrentState = setNotificationCurrentState;\n const isFBE = !!accessExpiration && !!datesBannerInfo?.contentTypeGatingEnabled;\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 logUpgradeClick = () => {\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 conversion('Upgraded');\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 callToActionButton;\n let offerCode;\n\n let upsellMessage = <UpsellTable {...{ isFBE, learningAssistantEnabled }} />;\n\n if (isFBE) {\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 = formatMessage(\n messages.firstTimeLearnerDiscountHeader,\n { percentage: (offer.percentage) },\n );\n expirationBanner = (\n <ExpirationCountdown\n courseId={courseId}\n hoursToExpiration={hoursToDiscountExpiration}\n setupgradeNotificationCurrentState={setupgradeNotificationCurrentState}\n type=\"offer\"\n />\n );\n } else {\n upgradeNotificationHeaderText = formatMessage(messages.accessExpirationHeader);\n expirationBanner = (\n <AccessExpirationDateBanner\n courseId={courseId}\n accessExpirationDate={accessExpirationDate}\n timezoneFormatArgs={timezoneFormatArgs}\n setupgradeNotificationCurrentState={setupgradeNotificationCurrentState}\n />\n );\n }\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 = formatMessage(messages.accessExpirationUrgentHeader);\n expirationBanner = (\n <ExpirationCountdown\n courseId={courseId}\n hoursToExpiration={hoursToAccessExpiration}\n setupgradeNotificationCurrentState={setupgradeNotificationCurrentState}\n type=\"access\"\n />\n );\n if (upsellPageName !== PAGE_NAMES.PROGRESS) {\n upsellMessage = (\n <UpsellFBESoonCardContent\n accessExpirationDate={accessExpirationDate}\n timezoneFormatArgs={timezoneFormatArgs}\n />\n );\n }\n } else { // access expiration deadline has passed\n upgradeNotificationHeaderText = formatMessage(messages.accessExpirationPastHeader);\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 }\n\n if (pastExpirationDeadline) {\n callToActionButton = (\n <Button\n variant=\"primary\"\n onClick={logClickPastExpiration}\n href={marketingUrl}\n block\n >\n {formatMessage(messages.pastExpirationCallToActionLabel)}\n </Button>\n );\n } else {\n callToActionButton = (\n <UpgradeButton\n offer={offer}\n onClick={logUpgradeClick}\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 {formatMessage(\n messages.discountCodeMessage,\n {\n code: (<span className=\"font-weight-bold\">{offer.code}</span>),\n },\n )}\n </div>\n );\n }\n\n return (\n <section className={classNames('upgrade-notification small', { 'pgn__card pgn__card-light card mb-4 rounded': shouldDisplayBorder })}>\n <div id=\"courseHome-upgradeNotification\">\n <h2\n className={classNames('upgrade-notification-header', {\n 'd-flex align-items-center mr-2 ml-4 my-1.5 font-size-18': !!toggleSidebar,\n 'm-4': !toggleSidebar,\n })}\n id=\"outline-sidebar-upgrade-header\"\n >\n {formatMessage(messages.pursueCertificateMessage)}\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={formatMessage(messages.closeAlt)}\n />\n </div>\n )}\n </h2>\n <CertificatePreview courseId={courseId} />\n <h3 className=\"ml-4\">\n {upgradeNotificationHeaderText}\n </h3>\n {expirationBanner}\n <div className=\"upgrade-notification-message\">\n {upsellMessage}\n </div>\n <div className=\"upgrade-notification-button m-4\">\n {callToActionButton}\n </div>\n {offerCode}\n </div>\n </section>\n );\n};\n\nUpgradeNotification.propTypes = {\n id: PropTypes.string.isRequired,\n courseId: PropTypes.string.isRequired,\n model: PropTypes.string,\n setNotificationCurrentState: PropTypes.func,\n toggleSidebar: PropTypes.func,\n};\n\nUpgradeNotification.defaultProps = {\n setNotificationCurrentState: null,\n toggleSidebar: null,\n model: 'outline',\n};\n\nexport default UpgradeNotification;\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"UpgradeNotification.js","names":["_react","_interopRequireWildcard","require","_propTypes","_interopRequireDefault","_classnames","_i18n","_analytics","_paragon","_icons","_upgradeButton","_modelStore","_data","_subscriptionUpsell","_certificatePreview","_generic","_utils","_messages","_cohesion","_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","SUBSCRIPTION_CARD_PLACEMENTS","UpgradeNotification","_ref","id","courseId","model","setNotificationCurrentState","toggleSidebar","pluginLocationId","formatMessage","useIntl","org","userTimezone","verifiedMode","useModel","marketingUrl","learningAssistantEnabled","accessExpiration","datesBannerInfo","offer","timeOffsetMillis","conversion","useCohesion","subscriptionOffer","useSubscriptionOffer","dateNow","Date","now","timezoneFormatArgs","timeZone","correctedTime","accessExpirationDate","upgradeDeadline","pastExpirationDeadline","shouldDisplayBorder","includes","isSubscriptionCardPlacement","some","placement","showSubscriptionCard","upsellPageName","getUpsellPageName","setupgradeNotificationCurrentState","isFBE","contentTypeGatingEnabled","eventProperties","org_key","courserun_key","variant","promotionEventProperties","creative","name","position","promotion_id","useEffect","sendTrackingLogEvent","sendTrackEvent","logUpgradeClick","location","linkCategory","linkName","linkType","pageName","logClickPastExpiration","logSubscribeClick","banner","hoursToAccessExpiration","Math","floor","jsx","ExpirationCountdown","hoursToExpiration","type","AccessExpirationDateBanner","SubscriptionUpgradeCard","withBorder","onSubscribeClick","onPurchaseClick","onUpgradeEvent","stage","onClose","upgradeNotificationHeaderText","expirationBanner","callToActionButton","offerCode","upsellMessage","UpsellTable","hoursToDiscountExpiration","expirationDate","messages","firstTimeLearnerDiscountHeader","percentage","accessExpirationHeader","accessExpirationUrgentHeader","PAGE_NAMES","PROGRESS","UpsellFBESoonCardContent","accessExpirationPastHeader","PastExpirationDateBanner","PastExpirationCardContent","Button","onClick","href","block","children","pastExpirationCallToActionLabel","UpgradeButton","className","discountCodeMessage","code","classNames","jsxs","pursueCertificateMessage","IconButton","src","Close","size","iconAs","Icon","alt","closeAlt","propTypes","PropTypes","string","isRequired","func","defaultProps","_default","exports"],"sources":["../../src/upgrade-notification/UpgradeNotification.jsx"],"sourcesContent":["/* eslint import/no-unresolved: 0 */\nimport React, { useEffect } from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport { useIntl } 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';\n\nimport { UpgradeButton } from '@src/generic/upgrade-button';\nimport { useModel } from '@src/generic/model-store';\n\nimport { PAGE_NAMES } from '../data';\nimport { SubscriptionUpgradeCard, useSubscriptionOffer } from '../subscription-upsell';\nimport CertificatePreview from './certificate-preview';\nimport {\n ExpirationCountdown,\n AccessExpirationDateBanner,\n PastExpirationDateBanner,\n PastExpirationCardContent,\n UpsellFBESoonCardContent,\n UpsellTable,\n} from '../generic';\nimport getUpsellPageName from './utils';\nimport messages from './messages';\nimport { useCohesion } from '../cohesion';\n\n// Placements that show the subscription card: course home and the courseware sidebar\n// (tray and widget). The Progress page keeps the current card.\nconst SUBSCRIPTION_CARD_PLACEMENTS = ['outline', 'notification_tray', 'notification_widget'];\n\nconst UpgradeNotification = ({\n id,\n courseId,\n model,\n setNotificationCurrentState,\n toggleSidebar,\n}) => {\n const pluginLocationId = id;\n const { formatMessage } = useIntl();\n\n const {\n org,\n userTimezone,\n verifiedMode,\n } = useModel('courseHomeMeta', courseId);\n\n const {\n marketingUrl,\n learningAssistantEnabled,\n } = useModel('coursewareMeta', courseId);\n\n const {\n accessExpiration,\n datesBannerInfo,\n offer,\n timeOffsetMillis,\n } = useModel(model, courseId);\n\n const { conversion } = useCohesion(courseId);\n const subscriptionOffer = useSubscriptionOffer(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.upgradeDeadline) : null;\n // Server time, so this agrees with the countdown and the FBE branches below.\n const pastExpirationDeadline = accessExpiration ? correctedTime > accessExpirationDate : false;\n const shouldDisplayBorder = pluginLocationId.includes('outline');\n const isSubscriptionCardPlacement = SUBSCRIPTION_CARD_PLACEMENTS.some(\n (placement) => pluginLocationId.includes(placement),\n );\n // Without an offer, past the upgrade deadline, and on the Progress page, today's card renders.\n const showSubscriptionCard = isSubscriptionCardPlacement && !pastExpirationDeadline && !!subscriptionOffer;\n const upsellPageName = getUpsellPageName({ id: pluginLocationId });\n const setupgradeNotificationCurrentState = setNotificationCurrentState;\n const isFBE = !!accessExpiration && !!datesBannerInfo?.contentTypeGatingEnabled;\n\n const eventProperties = {\n org_key: org,\n courserun_key: courseId,\n // Tags the placements that switched to the subscription card, so reports can split them from today's card.\n ...(showSubscriptionCard && { variant: 'subscription' }),\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 logUpgradeClick = () => {\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 conversion('Upgraded');\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 const logSubscribeClick = () => {\n sendTrackEvent('edx.bi.ecommerce.upsell_links_clicked', {\n ...eventProperties,\n linkCategory: 'subscription',\n linkName: `${upsellPageName}_subscribe`,\n linkType: 'button',\n pageName: upsellPageName,\n });\n conversion('Subscribed');\n };\n\n if (showSubscriptionCard) { // the card handles every offer state itself\n let banner;\n if (isFBE) { // content-gated learners keep the access expiration warning and its sidebar dot stages\n const hoursToAccessExpiration = Math.floor((accessExpirationDate - correctedTime) / 1000 / 60 / 60);\n banner = hoursToAccessExpiration < (7 * 24) ? (\n <ExpirationCountdown\n courseId={courseId}\n hoursToExpiration={hoursToAccessExpiration}\n setupgradeNotificationCurrentState={setupgradeNotificationCurrentState}\n type=\"access\"\n />\n ) : (\n <AccessExpirationDateBanner\n courseId={courseId}\n accessExpirationDate={accessExpirationDate}\n timezoneFormatArgs={timezoneFormatArgs}\n setupgradeNotificationCurrentState={setupgradeNotificationCurrentState}\n />\n );\n }\n return (\n <SubscriptionUpgradeCard\n courseId={courseId}\n withBorder={shouldDisplayBorder}\n banner={banner}\n onSubscribeClick={logSubscribeClick}\n onPurchaseClick={logUpgradeClick}\n onUpgradeEvent={(stage) => stage === 'succeeded' && logUpgradeClick()}\n onClose={toggleSidebar}\n />\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 callToActionButton;\n let offerCode;\n\n let upsellMessage = <UpsellTable {...{ isFBE, learningAssistantEnabled }} />;\n\n if (isFBE) {\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 = formatMessage(\n messages.firstTimeLearnerDiscountHeader,\n { percentage: (offer.percentage) },\n );\n expirationBanner = (\n <ExpirationCountdown\n courseId={courseId}\n hoursToExpiration={hoursToDiscountExpiration}\n setupgradeNotificationCurrentState={setupgradeNotificationCurrentState}\n type=\"offer\"\n />\n );\n } else {\n upgradeNotificationHeaderText = formatMessage(messages.accessExpirationHeader);\n expirationBanner = (\n <AccessExpirationDateBanner\n courseId={courseId}\n accessExpirationDate={accessExpirationDate}\n timezoneFormatArgs={timezoneFormatArgs}\n setupgradeNotificationCurrentState={setupgradeNotificationCurrentState}\n />\n );\n }\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 = formatMessage(messages.accessExpirationUrgentHeader);\n expirationBanner = (\n <ExpirationCountdown\n courseId={courseId}\n hoursToExpiration={hoursToAccessExpiration}\n setupgradeNotificationCurrentState={setupgradeNotificationCurrentState}\n type=\"access\"\n />\n );\n if (upsellPageName !== PAGE_NAMES.PROGRESS) {\n upsellMessage = (\n <UpsellFBESoonCardContent\n accessExpirationDate={accessExpirationDate}\n timezoneFormatArgs={timezoneFormatArgs}\n />\n );\n }\n } else { // access expiration deadline has passed\n upgradeNotificationHeaderText = formatMessage(messages.accessExpirationPastHeader);\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 }\n\n if (pastExpirationDeadline) {\n callToActionButton = (\n <Button\n variant=\"primary\"\n onClick={logClickPastExpiration}\n href={marketingUrl}\n block\n >\n {formatMessage(messages.pastExpirationCallToActionLabel)}\n </Button>\n );\n } else {\n callToActionButton = (\n <UpgradeButton\n offer={offer}\n onClick={logUpgradeClick}\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 {formatMessage(\n messages.discountCodeMessage,\n {\n code: (<span className=\"font-weight-bold\">{offer.code}</span>),\n },\n )}\n </div>\n );\n }\n\n return (\n <section className={classNames('upgrade-notification small', { 'pgn__card pgn__card-light card mb-4 rounded': shouldDisplayBorder })}>\n <div id=\"courseHome-upgradeNotification\">\n <h2\n className={classNames('upgrade-notification-header', {\n 'd-flex align-items-center mr-2 ml-4 my-1.5 font-size-18': !!toggleSidebar,\n 'm-4': !toggleSidebar,\n })}\n id=\"outline-sidebar-upgrade-header\"\n >\n {formatMessage(messages.pursueCertificateMessage)}\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={formatMessage(messages.closeAlt)}\n />\n </div>\n )}\n </h2>\n <CertificatePreview courseId={courseId} />\n <h3 className=\"ml-4\">\n {upgradeNotificationHeaderText}\n </h3>\n {expirationBanner}\n <div className=\"upgrade-notification-message\">\n {upsellMessage}\n </div>\n <div className=\"upgrade-notification-button m-4\">\n {callToActionButton}\n </div>\n {offerCode}\n </div>\n </section>\n );\n};\n\nUpgradeNotification.propTypes = {\n id: PropTypes.string.isRequired,\n courseId: PropTypes.string.isRequired,\n model: PropTypes.string,\n setNotificationCurrentState: PropTypes.func,\n toggleSidebar: PropTypes.func,\n};\n\nUpgradeNotification.defaultProps = {\n setNotificationCurrentState: null,\n toggleSidebar: null,\n model: 'outline',\n};\n\nexport default UpgradeNotification;\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -9,6 +9,8 @@ var _reactRedux = require("react-redux");
|
|
|
9
9
|
var _i18n = require("@edx/frontend-platform/i18n");
|
|
10
10
|
var _paragon = require("@openedx/paragon");
|
|
11
11
|
var _modelStore = require("@src/generic/model-store");
|
|
12
|
+
var _cohesion = require("../cohesion");
|
|
13
|
+
var _subscriptionUpsell = require("../subscription-upsell");
|
|
12
14
|
var _messages = _interopRequireDefault(require("./messages"));
|
|
13
15
|
var _track = require("./track");
|
|
14
16
|
var _jsxRuntime = require("react/jsx-runtime");
|
|
@@ -27,6 +29,10 @@ const UpgradeToCompleteAlert = () => {
|
|
|
27
29
|
const {
|
|
28
30
|
org
|
|
29
31
|
} = (0, _modelStore.useModel)('courseHomeMeta', courseId);
|
|
32
|
+
const subscriptionOffer = (0, _subscriptionUpsell.useSubscriptionOffer)(courseId);
|
|
33
|
+
const {
|
|
34
|
+
conversion
|
|
35
|
+
} = (0, _cohesion.useCohesion)(courseId);
|
|
30
36
|
const {
|
|
31
37
|
contentTypeGatingEnabled,
|
|
32
38
|
missedDeadlines,
|
|
@@ -42,16 +48,35 @@ const UpgradeToCompleteAlert = () => {
|
|
|
42
48
|
className: "w-100 m-0",
|
|
43
49
|
children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_paragon.Col, {
|
|
44
50
|
xs: 12,
|
|
45
|
-
md: 9,
|
|
51
|
+
md: subscriptionOffer ? 8 : 9,
|
|
46
52
|
className: "small p-0 pr-md-2",
|
|
47
53
|
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_paragon.Alert.Heading, {
|
|
48
54
|
children: intl.formatMessage(_messages.default.upgradeToCompleteHeader)
|
|
49
55
|
}), intl.formatMessage(_messages.default.upgradeToCompleteBody)]
|
|
50
56
|
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_paragon.Col, {
|
|
51
57
|
xs: 12,
|
|
52
|
-
md: 3,
|
|
58
|
+
md: subscriptionOffer ? 4 : 3,
|
|
53
59
|
className: "align-self-center text-right mt-3 mt-md-0 p-0",
|
|
54
|
-
children:
|
|
60
|
+
children: subscriptionOffer ?
|
|
61
|
+
/*#__PURE__*/
|
|
62
|
+
// No Figma for this banner yet: same banner, with the LP-1422 buttons in place of Upgrade now.
|
|
63
|
+
(0, _jsxRuntime.jsx)("div", {
|
|
64
|
+
className: "d-inline-block text-left",
|
|
65
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_subscriptionUpsell.SubscriptionUpsell, {
|
|
66
|
+
courseId: courseId,
|
|
67
|
+
onSubscribeClick: () => {
|
|
68
|
+
(0, _track.logUpgradeLinkClick)(org, courseId, 'dates_subscribe');
|
|
69
|
+
conversion('Subscribed');
|
|
70
|
+
},
|
|
71
|
+
onPurchaseClick: () => (0, _track.logUpgradeLinkClick)(org, courseId),
|
|
72
|
+
onUpgradeEvent: stage => {
|
|
73
|
+
if (stage === 'succeeded') {
|
|
74
|
+
(0, _track.logUpgradeLinkClick)(org, courseId);
|
|
75
|
+
conversion('Upgraded');
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
})
|
|
79
|
+
}) : /*#__PURE__*/(0, _jsxRuntime.jsx)(_paragon.Button, {
|
|
55
80
|
variant: "brand",
|
|
56
81
|
size: "sm",
|
|
57
82
|
className: "w-xs-100 w-md-auto",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UpgradeToCompleteAlert.js","names":["_react","_interopRequireDefault","require","_reactRedux","_i18n","_paragon","_modelStore","_messages","_track","_jsxRuntime","e","__esModule","default","UpgradeToCompleteAlert","intl","useIntl","courseId","useSelector","state","courseHome","datesBannerInfo","hasEnded","useModel","org","contentTypeGatingEnabled","missedDeadlines","verifiedUpgradeLink","jsx","Alert","id","className","children","jsxs","Row","Col","xs","md","Heading","formatMessage","messages","upgradeToCompleteHeader","upgradeToCompleteBody","Button","variant","size","onClick","
|
|
1
|
+
{"version":3,"file":"UpgradeToCompleteAlert.js","names":["_react","_interopRequireDefault","require","_reactRedux","_i18n","_paragon","_modelStore","_cohesion","_subscriptionUpsell","_messages","_track","_jsxRuntime","e","__esModule","default","UpgradeToCompleteAlert","intl","useIntl","courseId","useSelector","state","courseHome","datesBannerInfo","hasEnded","useModel","org","subscriptionOffer","useSubscriptionOffer","conversion","useCohesion","contentTypeGatingEnabled","missedDeadlines","verifiedUpgradeLink","jsx","Alert","id","className","children","jsxs","Row","Col","xs","md","Heading","formatMessage","messages","upgradeToCompleteHeader","upgradeToCompleteBody","SubscriptionUpsell","onSubscribeClick","logUpgradeLinkClick","onPurchaseClick","onUpgradeEvent","stage","Button","variant","size","onClick","global","location","replace","upgradeToCompleteButton","_default","exports"],"sources":["../../src/upgrade-to-complete-alert/UpgradeToCompleteAlert.jsx"],"sourcesContent":["import React from 'react';\nimport { useSelector } from 'react-redux';\nimport { useIntl } from '@edx/frontend-platform/i18n';\nimport {\n Alert,\n Button,\n Col,\n Row,\n} from '@openedx/paragon';\n\nimport { useModel } from '@src/generic/model-store'; // eslint-disable-line import/no-unresolved\nimport { useCohesion } from '../cohesion';\nimport { SubscriptionUpsell, useSubscriptionOffer } from '../subscription-upsell';\nimport messages from './messages';\nimport { logUpgradeLinkClick } from './track';\n\nconst UpgradeToCompleteAlert = () => {\n const intl = useIntl();\n const {\n courseId,\n } = useSelector(state => state.courseHome);\n\n const {\n datesBannerInfo,\n hasEnded,\n } = useModel('dates', courseId);\n\n const {\n org,\n } = useModel('courseHomeMeta', courseId);\n const subscriptionOffer = useSubscriptionOffer(courseId);\n const { conversion } = useCohesion(courseId);\n\n const {\n contentTypeGatingEnabled,\n missedDeadlines,\n verifiedUpgradeLink,\n } = datesBannerInfo || {};\n\n if (!contentTypeGatingEnabled || missedDeadlines || hasEnded || !verifiedUpgradeLink) {\n return null;\n }\n\n return (\n <Alert id=\"upgrade-complete-alert\" className=\"bg-light-200\">\n <Row className=\"w-100 m-0\">\n <Col xs={12} md={subscriptionOffer ? 8 : 9} className=\"small p-0 pr-md-2\">\n <Alert.Heading>{intl.formatMessage(messages.upgradeToCompleteHeader)}</Alert.Heading>\n {intl.formatMessage(messages.upgradeToCompleteBody)}\n </Col>\n <Col xs={12} md={subscriptionOffer ? 4 : 3} className=\"align-self-center text-right mt-3 mt-md-0 p-0\">\n {subscriptionOffer ? (\n // No Figma for this banner yet: same banner, with the LP-1422 buttons in place of Upgrade now.\n <div className=\"d-inline-block text-left\">\n <SubscriptionUpsell\n courseId={courseId}\n onSubscribeClick={() => { logUpgradeLinkClick(org, courseId, 'dates_subscribe'); conversion('Subscribed'); }}\n onPurchaseClick={() => logUpgradeLinkClick(org, courseId)}\n onUpgradeEvent={(stage) => {\n if (stage === 'succeeded') { logUpgradeLinkClick(org, courseId); conversion('Upgraded'); }\n }}\n />\n </div>\n ) : (\n <Button\n variant=\"brand\"\n size=\"sm\"\n className=\"w-xs-100 w-md-auto\"\n onClick={() => {\n logUpgradeLinkClick(org, courseId);\n global.location.replace(verifiedUpgradeLink);\n }}\n >\n {intl.formatMessage(messages.upgradeToCompleteButton)}\n </Button>\n )}\n </Col>\n </Row>\n </Alert>\n );\n};\n\nexport default UpgradeToCompleteAlert;\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -10,13 +10,15 @@ var _analytics = require("@edx/frontend-platform/analytics");
|
|
|
10
10
|
*
|
|
11
11
|
* @param {string} org - The organization key
|
|
12
12
|
* @param {string} courseId - The course run key
|
|
13
|
+
* @param {string} [linkName] - 'dates_upgrade' for Buy/Upgrade, 'dates_subscribe' for Subscribe
|
|
13
14
|
*/
|
|
14
|
-
const logUpgradeLinkClick = (org, courseId)
|
|
15
|
+
const logUpgradeLinkClick = function (org, courseId) {
|
|
16
|
+
let linkName = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'dates_upgrade';
|
|
15
17
|
(0, _analytics.sendTrackEvent)('edx.bi.ecommerce.upsell_links_clicked', {
|
|
16
18
|
org_key: org,
|
|
17
19
|
courserun_key: courseId,
|
|
18
20
|
linkCategory: 'personalized_learner_schedules',
|
|
19
|
-
linkName
|
|
21
|
+
linkName,
|
|
20
22
|
linkType: 'button',
|
|
21
23
|
pageName: 'dates_tab'
|
|
22
24
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"track.js","names":["_analytics","require","logUpgradeLinkClick","org","courseId","sendTrackEvent","org_key","courserun_key","linkCategory","
|
|
1
|
+
{"version":3,"file":"track.js","names":["_analytics","require","logUpgradeLinkClick","org","courseId","linkName","arguments","length","undefined","sendTrackEvent","org_key","courserun_key","linkCategory","linkType","pageName","exports"],"sources":["../../src/upgrade-to-complete-alert/track.js"],"sourcesContent":["import { sendTrackEvent } from '@edx/frontend-platform/analytics';\n\n/**\n * Logs an upgrade link click event for the upgrade to complete alert.\n *\n * @param {string} org - The organization key\n * @param {string} courseId - The course run key\n * @param {string} [linkName] - 'dates_upgrade' for Buy/Upgrade, 'dates_subscribe' for Subscribe\n */\nexport const logUpgradeLinkClick = (org, courseId, linkName = 'dates_upgrade') => {\n sendTrackEvent('edx.bi.ecommerce.upsell_links_clicked', {\n org_key: org,\n courserun_key: courseId,\n linkCategory: 'personalized_learner_schedules',\n linkName,\n linkType: 'button',\n pageName: 'dates_tab',\n });\n};\n"],"mappings":";;;;;;AAAA,IAAAA,UAAA,GAAAC,OAAA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAMC,mBAAmB,GAAG,SAAAA,CAACC,GAAG,EAAEC,QAAQ,EAAiC;EAAA,IAA/BC,QAAQ,GAAAC,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAE,SAAA,GAAAF,SAAA,MAAG,eAAe;EAC3E,IAAAG,yBAAc,EAAC,uCAAuC,EAAE;IACtDC,OAAO,EAAEP,GAAG;IACZQ,aAAa,EAAEP,QAAQ;IACvBQ,YAAY,EAAE,gCAAgC;IAC9CP,QAAQ;IACRQ,QAAQ,EAAE,QAAQ;IAClBC,QAAQ,EAAE;EACZ,CAAC,CAAC;AACJ,CAAC;AAACC,OAAA,CAAAb,mBAAA,GAAAA,mBAAA","ignoreList":[]}
|