@edx/frontend-plugin-advertisements 2.29.0 → 2.30.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.
@@ -9,8 +9,10 @@ var _propTypes = _interopRequireDefault(require("prop-types"));
9
9
  var _i18n = require("@edx/frontend-platform/i18n");
10
10
  var _paragon = require("@openedx/paragon");
11
11
  var _icons = require("@openedx/paragon/icons");
12
+ var _certificatePreview = _interopRequireDefault(require("../upgrade-notification/certificate-preview"));
12
13
  var _useSubscriptionOffer = _interopRequireDefault(require("./useSubscriptionOffer"));
13
14
  var _messages = _interopRequireDefault(require("./messages"));
15
+ require("./SubscriptionBenefitsModal.scss");
14
16
  var _jsxRuntime = require("react/jsx-runtime");
15
17
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
16
18
  /* eslint import/no-unresolved: 0 */
@@ -45,32 +47,63 @@ const SubscriptionBenefitsModal = _ref => {
45
47
  } = offer;
46
48
  const isFreeTrial = variant === BENEFITS_MODAL_VARIANT.FREE_TRIAL && hasTrial;
47
49
  const title = formatMessage(isFreeTrial ? _messages.default.modalTitleFreeTrial : _messages.default.modalTitleLaunch);
48
- const ctaVariant = isFreeTrial ? 'primary' : 'brand'; // Figma: dark on free trial, brand on launch
49
-
50
- const benefits = [{
50
+ const trialBenefit = hasTrial && {
51
+ key: 'trial',
52
+ title: formatMessage(_messages.default.benefitTrialTitle),
53
+ body: formatMessage(_messages.default.benefitTrialBody)
54
+ };
55
+ // Figma: the free trial pop-up leads with the trial; the launch pop-up ends with it.
56
+ const benefits = [isFreeTrial && trialBenefit, {
51
57
  key: 'certificates',
52
58
  title: formatMessage(_messages.default.benefitCertificatesTitle),
53
59
  body: formatMessage(_messages.default.benefitCertificatesBody)
54
60
  }, {
55
61
  key: 'change-course',
56
62
  title: formatMessage(_messages.default.benefitChangeCourseTitle),
57
- body: formatMessage(_messages.default.benefitChangeCourseBody)
58
- }, hasTrial && {
59
- key: 'trial',
60
- title: formatMessage(_messages.default.benefitTrialTitle),
61
- body: formatMessage(_messages.default.benefitTrialBody)
62
- }].filter(Boolean);
63
+ body: formatMessage(isFreeTrial ? _messages.default.benefitChangeCourseBodyFreeTrial : _messages.default.benefitChangeCourseBody)
64
+ }, !isFreeTrial && trialBenefit].filter(Boolean);
65
+ const purchaseButton = canPurchase && /*#__PURE__*/(0, _jsxRuntime.jsx)(_paragon.Button, {
66
+ as: "a",
67
+ href: purchaseUrl,
68
+ variant: "outline-brand",
69
+ className: isFreeTrial ? 'rounded-pill w-100 mt-2' : 'rounded-pill',
70
+ onClick: onPurchaseClick,
71
+ "data-testid": "subscription-modal-purchase-button",
72
+ children: coursePrice ? formatMessage(_messages.default.earnCertificateFor, {
73
+ price: coursePrice
74
+ }) : formatMessage(_messages.default.purchaseNoPrice)
75
+ });
76
+ const subscribeButton = /*#__PURE__*/(0, _jsxRuntime.jsx)(_paragon.Button, {
77
+ as: "a",
78
+ href: offer.subscribeUrl,
79
+ variant: "brand",
80
+ className: isFreeTrial ? 'rounded-pill w-100' : 'rounded-pill',
81
+ onClick: onSubscribeClick,
82
+ "data-testid": "subscription-modal-subscribe-button",
83
+ children: formatMessage(_messages.default.continueToCheckout)
84
+ });
63
85
  return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_paragon.ModalDialog, {
64
86
  title: title,
65
87
  isOpen: isOpen,
66
88
  onClose: onClose,
67
- size: "lg",
89
+ size: isFreeTrial ? 'md' : 'lg',
90
+ variant: isFreeTrial ? 'dark' : 'default' // dark inverts the close button over the certificate hero
91
+ ,
68
92
  hasCloseButton: true,
69
93
  isFullscreenOnMobile: true,
70
94
  isOverflowVisible: false,
71
- className: "subscription-benefits-modal",
72
- children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_paragon.ModalDialog.Header, {
73
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("p", {
95
+ className: `subscription-benefits-modal subscription-benefits-modal--${isFreeTrial ? 'free-trial' : 'launch'}`,
96
+ children: [isFreeTrial && /*#__PURE__*/(0, _jsxRuntime.jsx)(_paragon.ModalDialog.Hero, {
97
+ "data-testid": "subscription-modal-certificate",
98
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_paragon.ModalDialog.Hero.Content, {
99
+ className: "m-0 text-primary-500",
100
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_certificatePreview.default, {
101
+ courseId: courseId,
102
+ bgColor: "bg-white"
103
+ })
104
+ })
105
+ }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_paragon.ModalDialog.Header, {
106
+ children: [!isFreeTrial && /*#__PURE__*/(0, _jsxRuntime.jsx)("p", {
74
107
  className: "font-weight-bold mb-2",
75
108
  "data-testid": "subscription-modal-brand",
76
109
  children: formatMessage(_messages.default.brand)
@@ -83,12 +116,12 @@ const SubscriptionBenefitsModal = _ref => {
83
116
  })]
84
117
  }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_paragon.ModalDialog.Body, {
85
118
  children: /*#__PURE__*/(0, _jsxRuntime.jsx)("ul", {
86
- className: "list-unstyled bg-white rounded p-4 mb-0",
119
+ className: isFreeTrial ? 'list-unstyled mb-0' : 'list-unstyled bg-white rounded p-4 mb-0',
87
120
  children: benefits.map(benefit => /*#__PURE__*/(0, _jsxRuntime.jsxs)("li", {
88
121
  className: "d-flex mb-3",
89
122
  "data-testid": `subscription-modal-benefit-${benefit.key}`,
90
123
  children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_paragon.Icon, {
91
- src: _icons.CheckCircleOutline,
124
+ src: isFreeTrial ? _icons.Check : _icons.CheckCircleOutline,
92
125
  className: "mr-2 flex-shrink-0"
93
126
  }), /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
94
127
  children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
@@ -100,31 +133,13 @@ const SubscriptionBenefitsModal = _ref => {
100
133
  })]
101
134
  }, benefit.key))
102
135
  })
103
- }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_paragon.ModalDialog.Footer, {
104
- className: "flex-column align-items-end",
105
- children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_paragon.ActionRow, {
106
- children: [canPurchase && /*#__PURE__*/(0, _jsxRuntime.jsx)(_paragon.Button, {
107
- as: "a",
108
- href: purchaseUrl,
109
- variant: `outline-${ctaVariant}`,
110
- onClick: onPurchaseClick,
111
- "data-testid": "subscription-modal-purchase-button",
112
- children: coursePrice ? formatMessage(_messages.default.earnCertificateFor, {
113
- price: coursePrice
114
- }) : formatMessage(_messages.default.purchaseNoPrice)
115
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_paragon.Button, {
116
- as: "a",
117
- href: offer.subscribeUrl,
118
- variant: ctaVariant,
119
- onClick: onSubscribeClick,
120
- "data-testid": "subscription-modal-subscribe-button",
121
- children: formatMessage(_messages.default.continueToCheckout)
122
- })]
123
- }), isFreeTrial && /*#__PURE__*/(0, _jsxRuntime.jsx)("small", {
124
- className: "mt-1",
125
- "data-testid": "subscription-modal-cancel-anytime",
126
- children: formatMessage(_messages.default.cancelAnytime)
127
- })]
136
+ }), isFreeTrial ? /*#__PURE__*/(0, _jsxRuntime.jsxs)(_paragon.ModalDialog.Footer, {
137
+ className: "flex-column",
138
+ children: [subscribeButton, purchaseButton]
139
+ }) : /*#__PURE__*/(0, _jsxRuntime.jsx)(_paragon.ModalDialog.Footer, {
140
+ children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_paragon.ActionRow, {
141
+ children: [purchaseButton, subscribeButton]
142
+ })
128
143
  })]
129
144
  });
130
145
  };
@@ -1 +1 @@
1
- {"version":3,"file":"SubscriptionBenefitsModal.js","names":["_react","_interopRequireDefault","require","_propTypes","_i18n","_paragon","_icons","_useSubscriptionOffer","_messages","_jsxRuntime","e","__esModule","default","BENEFITS_MODAL_VARIANT","exports","FREE_TRIAL","LAUNCH","SubscriptionBenefitsModal","_ref","courseId","isOpen","onClose","variant","onSubscribeClick","onPurchaseClick","formatMessage","useIntl","offer","useSubscriptionOffer","canSubscribe","hasTrial","purchaseUrl","canPurchase","coursePrice","isFreeTrial","title","messages","modalTitleFreeTrial","modalTitleLaunch","ctaVariant","benefits","key","benefitCertificatesTitle","body","benefitCertificatesBody","benefitChangeCourseTitle","benefitChangeCourseBody","benefitTrialTitle","benefitTrialBody","filter","Boolean","jsxs","ModalDialog","size","hasCloseButton","isFullscreenOnMobile","isOverflowVisible","className","children","Header","jsx","brand","Title","as","modalSubtitle","Body","map","benefit","Icon","src","CheckCircleOutline","Footer","ActionRow","Button","href","onClick","earnCertificateFor","price","purchaseNoPrice","subscribeUrl","continueToCheckout","cancelAnytime","propTypes","PropTypes","string","isRequired","bool","func","oneOf","Object","values","defaultProps","undefined","_default"],"sources":["../../src/subscription-upsell/SubscriptionBenefitsModal.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 ActionRow, Button, Icon, ModalDialog,\n} from '@openedx/paragon';\nimport { CheckCircleOutline } from '@openedx/paragon/icons';\n\nimport useSubscriptionOffer from './useSubscriptionOffer';\nimport messages from './messages';\n\nexport const BENEFITS_MODAL_VARIANT = {\n FREE_TRIAL: 'freeTrial',\n LAUNCH: 'launch',\n};\n\n/** The benefits pop-up (Figma 3339-7937 free trial, 3482-70647 launch). Nothing opens it yet. */\nconst SubscriptionBenefitsModal = ({\n courseId,\n isOpen,\n onClose,\n variant,\n onSubscribeClick,\n onPurchaseClick,\n}) => {\n const { formatMessage } = useIntl();\n const offer = useSubscriptionOffer(courseId);\n\n if (!offer || !offer.canSubscribe) {\n return null;\n }\n\n const {\n hasTrial, purchaseUrl, canPurchase, coursePrice,\n } = offer;\n const isFreeTrial = variant === BENEFITS_MODAL_VARIANT.FREE_TRIAL && hasTrial;\n const title = formatMessage(isFreeTrial ? messages.modalTitleFreeTrial : messages.modalTitleLaunch);\n const ctaVariant = isFreeTrial ? 'primary' : 'brand'; // Figma: dark on free trial, brand on launch\n\n const benefits = [\n {\n key: 'certificates',\n title: formatMessage(messages.benefitCertificatesTitle),\n body: formatMessage(messages.benefitCertificatesBody),\n },\n {\n key: 'change-course',\n title: formatMessage(messages.benefitChangeCourseTitle),\n body: formatMessage(messages.benefitChangeCourseBody),\n },\n hasTrial && {\n key: 'trial',\n title: formatMessage(messages.benefitTrialTitle),\n body: formatMessage(messages.benefitTrialBody),\n },\n ].filter(Boolean);\n\n return (\n <ModalDialog\n title={title}\n isOpen={isOpen}\n onClose={onClose}\n size=\"lg\"\n hasCloseButton\n isFullscreenOnMobile\n isOverflowVisible={false}\n className=\"subscription-benefits-modal\"\n >\n <ModalDialog.Header>\n <p className=\"font-weight-bold mb-2\" data-testid=\"subscription-modal-brand\">{formatMessage(messages.brand)}</p>\n <ModalDialog.Title as=\"h2\">{title}</ModalDialog.Title>\n <p className=\"mt-2 mb-0\">{formatMessage(messages.modalSubtitle)}</p>\n </ModalDialog.Header>\n <ModalDialog.Body>\n <ul className=\"list-unstyled bg-white rounded p-4 mb-0\">\n {benefits.map((benefit) => (\n <li key={benefit.key} className=\"d-flex mb-3\" data-testid={`subscription-modal-benefit-${benefit.key}`}>\n <Icon src={CheckCircleOutline} className=\"mr-2 flex-shrink-0\" />\n <div>\n <div className=\"font-weight-bold\">{benefit.title}</div>\n <div>{benefit.body}</div>\n </div>\n </li>\n ))}\n </ul>\n </ModalDialog.Body>\n <ModalDialog.Footer className=\"flex-column align-items-end\">\n <ActionRow>\n {canPurchase && (\n <Button\n as=\"a\"\n href={purchaseUrl}\n variant={`outline-${ctaVariant}`}\n onClick={onPurchaseClick}\n data-testid=\"subscription-modal-purchase-button\"\n >\n {coursePrice\n ? formatMessage(messages.earnCertificateFor, { price: coursePrice })\n : formatMessage(messages.purchaseNoPrice)}\n </Button>\n )}\n <Button\n as=\"a\"\n href={offer.subscribeUrl}\n variant={ctaVariant}\n onClick={onSubscribeClick}\n data-testid=\"subscription-modal-subscribe-button\"\n >\n {formatMessage(messages.continueToCheckout)}\n </Button>\n </ActionRow>\n {isFreeTrial && (\n <small className=\"mt-1\" data-testid=\"subscription-modal-cancel-anytime\">{formatMessage(messages.cancelAnytime)}</small>\n )}\n </ModalDialog.Footer>\n </ModalDialog>\n );\n};\n\nSubscriptionBenefitsModal.propTypes = {\n courseId: PropTypes.string.isRequired,\n isOpen: PropTypes.bool.isRequired,\n onClose: PropTypes.func.isRequired,\n variant: PropTypes.oneOf(Object.values(BENEFITS_MODAL_VARIANT)),\n onSubscribeClick: PropTypes.func,\n onPurchaseClick: PropTypes.func,\n};\n\nSubscriptionBenefitsModal.defaultProps = {\n variant: BENEFITS_MODAL_VARIANT.LAUNCH,\n onSubscribeClick: undefined,\n onPurchaseClick: undefined,\n};\n\nexport default SubscriptionBenefitsModal;\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"SubscriptionBenefitsModal.js","names":["_react","_interopRequireDefault","require","_propTypes","_i18n","_paragon","_icons","_certificatePreview","_useSubscriptionOffer","_messages","_jsxRuntime","e","__esModule","default","BENEFITS_MODAL_VARIANT","exports","FREE_TRIAL","LAUNCH","SubscriptionBenefitsModal","_ref","courseId","isOpen","onClose","variant","onSubscribeClick","onPurchaseClick","formatMessage","useIntl","offer","useSubscriptionOffer","canSubscribe","hasTrial","purchaseUrl","canPurchase","coursePrice","isFreeTrial","title","messages","modalTitleFreeTrial","modalTitleLaunch","trialBenefit","key","benefitTrialTitle","body","benefitTrialBody","benefits","benefitCertificatesTitle","benefitCertificatesBody","benefitChangeCourseTitle","benefitChangeCourseBodyFreeTrial","benefitChangeCourseBody","filter","Boolean","purchaseButton","jsx","Button","as","href","className","onClick","children","earnCertificateFor","price","purchaseNoPrice","subscribeButton","subscribeUrl","continueToCheckout","jsxs","ModalDialog","size","hasCloseButton","isFullscreenOnMobile","isOverflowVisible","Hero","Content","bgColor","Header","brand","Title","modalSubtitle","Body","map","benefit","Icon","src","Check","CheckCircleOutline","Footer","ActionRow","propTypes","PropTypes","string","isRequired","bool","func","oneOf","Object","values","defaultProps","undefined","_default"],"sources":["../../src/subscription-upsell/SubscriptionBenefitsModal.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 ActionRow, Button, Icon, ModalDialog,\n} from '@openedx/paragon';\nimport { Check, CheckCircleOutline } from '@openedx/paragon/icons';\n\nimport CertificatePreview from '../upgrade-notification/certificate-preview';\nimport useSubscriptionOffer from './useSubscriptionOffer';\nimport messages from './messages';\nimport './SubscriptionBenefitsModal.scss';\n\nexport const BENEFITS_MODAL_VARIANT = {\n FREE_TRIAL: 'freeTrial',\n LAUNCH: 'launch',\n};\n\n/** The benefits pop-up (Figma 3339-7937 free trial, 3482-70647 launch). Nothing opens it yet. */\nconst SubscriptionBenefitsModal = ({\n courseId,\n isOpen,\n onClose,\n variant,\n onSubscribeClick,\n onPurchaseClick,\n}) => {\n const { formatMessage } = useIntl();\n const offer = useSubscriptionOffer(courseId);\n\n if (!offer || !offer.canSubscribe) {\n return null;\n }\n\n const {\n hasTrial, purchaseUrl, canPurchase, coursePrice,\n } = offer;\n const isFreeTrial = variant === BENEFITS_MODAL_VARIANT.FREE_TRIAL && hasTrial;\n const title = formatMessage(isFreeTrial ? messages.modalTitleFreeTrial : messages.modalTitleLaunch);\n\n const trialBenefit = hasTrial && {\n key: 'trial',\n title: formatMessage(messages.benefitTrialTitle),\n body: formatMessage(messages.benefitTrialBody),\n };\n // Figma: the free trial pop-up leads with the trial; the launch pop-up ends with it.\n const benefits = [\n isFreeTrial && trialBenefit,\n {\n key: 'certificates',\n title: formatMessage(messages.benefitCertificatesTitle),\n body: formatMessage(messages.benefitCertificatesBody),\n },\n {\n key: 'change-course',\n title: formatMessage(messages.benefitChangeCourseTitle),\n body: formatMessage(isFreeTrial ? messages.benefitChangeCourseBodyFreeTrial : messages.benefitChangeCourseBody),\n },\n !isFreeTrial && trialBenefit,\n ].filter(Boolean);\n\n const purchaseButton = canPurchase && (\n <Button\n as=\"a\"\n href={purchaseUrl}\n variant=\"outline-brand\"\n className={isFreeTrial ? 'rounded-pill w-100 mt-2' : 'rounded-pill'}\n onClick={onPurchaseClick}\n data-testid=\"subscription-modal-purchase-button\"\n >\n {coursePrice\n ? formatMessage(messages.earnCertificateFor, { price: coursePrice })\n : formatMessage(messages.purchaseNoPrice)}\n </Button>\n );\n const subscribeButton = (\n <Button\n as=\"a\"\n href={offer.subscribeUrl}\n variant=\"brand\"\n className={isFreeTrial ? 'rounded-pill w-100' : 'rounded-pill'}\n onClick={onSubscribeClick}\n data-testid=\"subscription-modal-subscribe-button\"\n >\n {formatMessage(messages.continueToCheckout)}\n </Button>\n );\n\n return (\n <ModalDialog\n title={title}\n isOpen={isOpen}\n onClose={onClose}\n size={isFreeTrial ? 'md' : 'lg'}\n variant={isFreeTrial ? 'dark' : 'default'} // dark inverts the close button over the certificate hero\n hasCloseButton\n isFullscreenOnMobile\n isOverflowVisible={false}\n className={`subscription-benefits-modal subscription-benefits-modal--${isFreeTrial ? 'free-trial' : 'launch'}`}\n >\n {isFreeTrial && (\n <ModalDialog.Hero data-testid=\"subscription-modal-certificate\">\n {/* As BaseModal does: the dark variant paints hero text white, so pin the certificate text dark. */}\n <ModalDialog.Hero.Content className=\"m-0 text-primary-500\">\n <CertificatePreview courseId={courseId} bgColor=\"bg-white\" />\n </ModalDialog.Hero.Content>\n </ModalDialog.Hero>\n )}\n <ModalDialog.Header>\n {!isFreeTrial && (\n <p className=\"font-weight-bold mb-2\" data-testid=\"subscription-modal-brand\">{formatMessage(messages.brand)}</p>\n )}\n <ModalDialog.Title as=\"h2\">{title}</ModalDialog.Title>\n <p className=\"mt-2 mb-0\">{formatMessage(messages.modalSubtitle)}</p>\n </ModalDialog.Header>\n <ModalDialog.Body>\n <ul className={isFreeTrial ? 'list-unstyled mb-0' : 'list-unstyled bg-white rounded p-4 mb-0'}>\n {benefits.map((benefit) => (\n <li key={benefit.key} className=\"d-flex mb-3\" data-testid={`subscription-modal-benefit-${benefit.key}`}>\n <Icon src={isFreeTrial ? Check : CheckCircleOutline} className=\"mr-2 flex-shrink-0\" />\n <div>\n <div className=\"font-weight-bold\">{benefit.title}</div>\n <div>{benefit.body}</div>\n </div>\n </li>\n ))}\n </ul>\n </ModalDialog.Body>\n {isFreeTrial ? (\n <ModalDialog.Footer className=\"flex-column\">\n {subscribeButton}\n {purchaseButton}\n </ModalDialog.Footer>\n ) : (\n <ModalDialog.Footer>\n <ActionRow>\n {purchaseButton}\n {subscribeButton}\n </ActionRow>\n </ModalDialog.Footer>\n )}\n </ModalDialog>\n );\n};\n\nSubscriptionBenefitsModal.propTypes = {\n courseId: PropTypes.string.isRequired,\n isOpen: PropTypes.bool.isRequired,\n onClose: PropTypes.func.isRequired,\n variant: PropTypes.oneOf(Object.values(BENEFITS_MODAL_VARIANT)),\n onSubscribeClick: PropTypes.func,\n onPurchaseClick: PropTypes.func,\n};\n\nSubscriptionBenefitsModal.defaultProps = {\n variant: BENEFITS_MODAL_VARIANT.LAUNCH,\n onSubscribeClick: undefined,\n onPurchaseClick: undefined,\n};\n\nexport default SubscriptionBenefitsModal;\n"],"mappings":";;;;;;AACA,IAAAA,MAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,UAAA,GAAAF,sBAAA,CAAAC,OAAA;AACA,IAAAE,KAAA,GAAAF,OAAA;AACA,IAAAG,QAAA,GAAAH,OAAA;AAGA,IAAAI,MAAA,GAAAJ,OAAA;AAEA,IAAAK,mBAAA,GAAAN,sBAAA,CAAAC,OAAA;AACA,IAAAM,qBAAA,GAAAP,sBAAA,CAAAC,OAAA;AACA,IAAAO,SAAA,GAAAR,sBAAA,CAAAC,OAAA;AACAA,OAAA;AAA0C,IAAAQ,WAAA,GAAAR,OAAA;AAAA,SAAAD,uBAAAU,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAZ1C;;AAcO,MAAMG,sBAAsB,GAAAC,OAAA,CAAAD,sBAAA,GAAG;EACpCE,UAAU,EAAE,WAAW;EACvBC,MAAM,EAAE;AACV,CAAC;;AAED;AACA,MAAMC,yBAAyB,GAAGC,IAAA,IAO5B;EAAA,IAP6B;IACjCC,QAAQ;IACRC,MAAM;IACNC,OAAO;IACPC,OAAO;IACPC,gBAAgB;IAChBC;EACF,CAAC,GAAAN,IAAA;EACC,MAAM;IAAEO;EAAc,CAAC,GAAG,IAAAC,aAAO,EAAC,CAAC;EACnC,MAAMC,KAAK,GAAG,IAAAC,6BAAoB,EAACT,QAAQ,CAAC;EAE5C,IAAI,CAACQ,KAAK,IAAI,CAACA,KAAK,CAACE,YAAY,EAAE;IACjC,OAAO,IAAI;EACb;EAEA,MAAM;IACJC,QAAQ;IAAEC,WAAW;IAAEC,WAAW;IAAEC;EACtC,CAAC,GAAGN,KAAK;EACT,MAAMO,WAAW,GAAGZ,OAAO,KAAKT,sBAAsB,CAACE,UAAU,IAAIe,QAAQ;EAC7E,MAAMK,KAAK,GAAGV,aAAa,CAACS,WAAW,GAAGE,iBAAQ,CAACC,mBAAmB,GAAGD,iBAAQ,CAACE,gBAAgB,CAAC;EAEnG,MAAMC,YAAY,GAAGT,QAAQ,IAAI;IAC/BU,GAAG,EAAE,OAAO;IACZL,KAAK,EAAEV,aAAa,CAACW,iBAAQ,CAACK,iBAAiB,CAAC;IAChDC,IAAI,EAAEjB,aAAa,CAACW,iBAAQ,CAACO,gBAAgB;EAC/C,CAAC;EACD;EACA,MAAMC,QAAQ,GAAG,CACfV,WAAW,IAAIK,YAAY,EAC3B;IACEC,GAAG,EAAE,cAAc;IACnBL,KAAK,EAAEV,aAAa,CAACW,iBAAQ,CAACS,wBAAwB,CAAC;IACvDH,IAAI,EAAEjB,aAAa,CAACW,iBAAQ,CAACU,uBAAuB;EACtD,CAAC,EACD;IACEN,GAAG,EAAE,eAAe;IACpBL,KAAK,EAAEV,aAAa,CAACW,iBAAQ,CAACW,wBAAwB,CAAC;IACvDL,IAAI,EAAEjB,aAAa,CAACS,WAAW,GAAGE,iBAAQ,CAACY,gCAAgC,GAAGZ,iBAAQ,CAACa,uBAAuB;EAChH,CAAC,EACD,CAACf,WAAW,IAAIK,YAAY,CAC7B,CAACW,MAAM,CAACC,OAAO,CAAC;EAEjB,MAAMC,cAAc,GAAGpB,WAAW,iBAChC,IAAAvB,WAAA,CAAA4C,GAAA,EAACjD,QAAA,CAAAkD,MAAM;IACLC,EAAE,EAAC,GAAG;IACNC,IAAI,EAAEzB,WAAY;IAClBT,OAAO,EAAC,eAAe;IACvBmC,SAAS,EAAEvB,WAAW,GAAG,yBAAyB,GAAG,cAAe;IACpEwB,OAAO,EAAElC,eAAgB;IACzB,eAAY,oCAAoC;IAAAmC,QAAA,EAE/C1B,WAAW,GACRR,aAAa,CAACW,iBAAQ,CAACwB,kBAAkB,EAAE;MAAEC,KAAK,EAAE5B;IAAY,CAAC,CAAC,GAClER,aAAa,CAACW,iBAAQ,CAAC0B,eAAe;EAAC,CACrC,CACT;EACD,MAAMC,eAAe,gBACnB,IAAAtD,WAAA,CAAA4C,GAAA,EAACjD,QAAA,CAAAkD,MAAM;IACLC,EAAE,EAAC,GAAG;IACNC,IAAI,EAAE7B,KAAK,CAACqC,YAAa;IACzB1C,OAAO,EAAC,OAAO;IACfmC,SAAS,EAAEvB,WAAW,GAAG,oBAAoB,GAAG,cAAe;IAC/DwB,OAAO,EAAEnC,gBAAiB;IAC1B,eAAY,qCAAqC;IAAAoC,QAAA,EAEhDlC,aAAa,CAACW,iBAAQ,CAAC6B,kBAAkB;EAAC,CACrC,CACT;EAED,oBACE,IAAAxD,WAAA,CAAAyD,IAAA,EAAC9D,QAAA,CAAA+D,WAAW;IACVhC,KAAK,EAAEA,KAAM;IACbf,MAAM,EAAEA,MAAO;IACfC,OAAO,EAAEA,OAAQ;IACjB+C,IAAI,EAAElC,WAAW,GAAG,IAAI,GAAG,IAAK;IAChCZ,OAAO,EAAEY,WAAW,GAAG,MAAM,GAAG,SAAU,CAAC;IAAA;IAC3CmC,cAAc;IACdC,oBAAoB;IACpBC,iBAAiB,EAAE,KAAM;IACzBd,SAAS,EAAE,4DAA4DvB,WAAW,GAAG,YAAY,GAAG,QAAQ,EAAG;IAAAyB,QAAA,GAE9GzB,WAAW,iBACV,IAAAzB,WAAA,CAAA4C,GAAA,EAACjD,QAAA,CAAA+D,WAAW,CAACK,IAAI;MAAC,eAAY,gCAAgC;MAAAb,QAAA,eAE5D,IAAAlD,WAAA,CAAA4C,GAAA,EAACjD,QAAA,CAAA+D,WAAW,CAACK,IAAI,CAACC,OAAO;QAAChB,SAAS,EAAC,sBAAsB;QAAAE,QAAA,eACxD,IAAAlD,WAAA,CAAA4C,GAAA,EAAC/C,mBAAA,CAAAM,OAAkB;UAACO,QAAQ,EAAEA,QAAS;UAACuD,OAAO,EAAC;QAAU,CAAE;MAAC,CACrC;IAAC,CACX,CACnB,eACD,IAAAjE,WAAA,CAAAyD,IAAA,EAAC9D,QAAA,CAAA+D,WAAW,CAACQ,MAAM;MAAAhB,QAAA,GAChB,CAACzB,WAAW,iBACX,IAAAzB,WAAA,CAAA4C,GAAA;QAAGI,SAAS,EAAC,uBAAuB;QAAC,eAAY,0BAA0B;QAAAE,QAAA,EAAElC,aAAa,CAACW,iBAAQ,CAACwC,KAAK;MAAC,CAAI,CAC/G,eACD,IAAAnE,WAAA,CAAA4C,GAAA,EAACjD,QAAA,CAAA+D,WAAW,CAACU,KAAK;QAACtB,EAAE,EAAC,IAAI;QAAAI,QAAA,EAAExB;MAAK,CAAoB,CAAC,eACtD,IAAA1B,WAAA,CAAA4C,GAAA;QAAGI,SAAS,EAAC,WAAW;QAAAE,QAAA,EAAElC,aAAa,CAACW,iBAAQ,CAAC0C,aAAa;MAAC,CAAI,CAAC;IAAA,CAClD,CAAC,eACrB,IAAArE,WAAA,CAAA4C,GAAA,EAACjD,QAAA,CAAA+D,WAAW,CAACY,IAAI;MAAApB,QAAA,eACf,IAAAlD,WAAA,CAAA4C,GAAA;QAAII,SAAS,EAAEvB,WAAW,GAAG,oBAAoB,GAAG,yCAA0C;QAAAyB,QAAA,EAC3Ff,QAAQ,CAACoC,GAAG,CAAEC,OAAO,iBACpB,IAAAxE,WAAA,CAAAyD,IAAA;UAAsBT,SAAS,EAAC,aAAa;UAAC,eAAa,8BAA8BwB,OAAO,CAACzC,GAAG,EAAG;UAAAmB,QAAA,gBACrG,IAAAlD,WAAA,CAAA4C,GAAA,EAACjD,QAAA,CAAA8E,IAAI;YAACC,GAAG,EAAEjD,WAAW,GAAGkD,YAAK,GAAGC,yBAAmB;YAAC5B,SAAS,EAAC;UAAoB,CAAE,CAAC,eACtF,IAAAhD,WAAA,CAAAyD,IAAA;YAAAP,QAAA,gBACE,IAAAlD,WAAA,CAAA4C,GAAA;cAAKI,SAAS,EAAC,kBAAkB;cAAAE,QAAA,EAAEsB,OAAO,CAAC9C;YAAK,CAAM,CAAC,eACvD,IAAA1B,WAAA,CAAA4C,GAAA;cAAAM,QAAA,EAAMsB,OAAO,CAACvC;YAAI,CAAM,CAAC;UAAA,CACtB,CAAC;QAAA,GALCuC,OAAO,CAACzC,GAMb,CACL;MAAC,CACA;IAAC,CACW,CAAC,EAClBN,WAAW,gBACV,IAAAzB,WAAA,CAAAyD,IAAA,EAAC9D,QAAA,CAAA+D,WAAW,CAACmB,MAAM;MAAC7B,SAAS,EAAC,aAAa;MAAAE,QAAA,GACxCI,eAAe,EACfX,cAAc;IAAA,CACG,CAAC,gBAErB,IAAA3C,WAAA,CAAA4C,GAAA,EAACjD,QAAA,CAAA+D,WAAW,CAACmB,MAAM;MAAA3B,QAAA,eACjB,IAAAlD,WAAA,CAAAyD,IAAA,EAAC9D,QAAA,CAAAmF,SAAS;QAAA5B,QAAA,GACPP,cAAc,EACdW,eAAe;MAAA,CACP;IAAC,CACM,CACrB;EAAA,CACU,CAAC;AAElB,CAAC;AAED9C,yBAAyB,CAACuE,SAAS,GAAG;EACpCrE,QAAQ,EAAEsE,kBAAS,CAACC,MAAM,CAACC,UAAU;EACrCvE,MAAM,EAAEqE,kBAAS,CAACG,IAAI,CAACD,UAAU;EACjCtE,OAAO,EAAEoE,kBAAS,CAACI,IAAI,CAACF,UAAU;EAClCrE,OAAO,EAAEmE,kBAAS,CAACK,KAAK,CAACC,MAAM,CAACC,MAAM,CAACnF,sBAAsB,CAAC,CAAC;EAC/DU,gBAAgB,EAAEkE,kBAAS,CAACI,IAAI;EAChCrE,eAAe,EAAEiE,kBAAS,CAACI;AAC7B,CAAC;AAED5E,yBAAyB,CAACgF,YAAY,GAAG;EACvC3E,OAAO,EAAET,sBAAsB,CAACG,MAAM;EACtCO,gBAAgB,EAAE2E,SAAS;EAC3B1E,eAAe,EAAE0E;AACnB,CAAC;AAAC,IAAAC,QAAA,GAAArF,OAAA,CAAAF,OAAA,GAEaK,yBAAyB","ignoreList":[]}
@@ -0,0 +1,37 @@
1
+ @use "modal-chrome";
2
+
3
+ // Launch pop-up: Light/200 background with the shared chrome.
4
+ .subscription-benefits-modal--launch.pgn__modal {
5
+ @include modal-chrome.modal-chrome(var(--pgn-color-light-300));
6
+ }
7
+
8
+ // Free trial pop-up (Figma 3339-7937): certificate on Primary/900, white body, 24px padding,
9
+ // upright title. The dark variant is only there to invert the close button; it also darkens the
10
+ // hero and header, so the hero gets the Figma colour and the header goes back to the content colours.
11
+ .subscription-benefits-modal--free-trial.pgn__modal {
12
+ --pgn-size-modal-content-border-radius: 12px;
13
+ max-width: 521px;
14
+
15
+ &.pgn__modal-dark .pgn__modal-hero {
16
+ background-color: var(--pgn-color-primary-900);
17
+ padding: 24px;
18
+ }
19
+
20
+ &.pgn__modal-dark .pgn__modal-header {
21
+ background-color: var(--pgn-color-modal-content-bg);
22
+ color: var(--pgn-color-body-base);
23
+ }
24
+
25
+ .pgn__modal-title {
26
+ font-size: 1.5rem;
27
+ line-height: 1.25;
28
+ font-weight: 800;
29
+ }
30
+
31
+ .pgn__modal-header,
32
+ .pgn__modal-body,
33
+ .pgn__modal-footer {
34
+ padding-left: 24px;
35
+ padding-right: 24px;
36
+ }
37
+ }
@@ -216,6 +216,7 @@ const SubscriptionComparisonModal = _ref => {
216
216
  as: "a",
217
217
  href: offer.subscribeUrl,
218
218
  variant: "primary",
219
+ className: "rounded-pill",
219
220
  onClick: onSubscribeClick,
220
221
  "data-testid": "subscription-comparison-subscribe-button",
221
222
  children: formatMessage(hasTrial ? _messages.default.startFreeTrial : _messages.default.subscribe)
@@ -223,6 +224,7 @@ const SubscriptionComparisonModal = _ref => {
223
224
  as: "a",
224
225
  href: purchaseUrl,
225
226
  variant: "outline-primary",
227
+ className: "rounded-pill",
226
228
  onClick: onPurchaseClick,
227
229
  "data-testid": "subscription-comparison-purchase-button",
228
230
  children: coursePrice ? formatMessage(_messages.default.buyFor, {
@@ -1 +1 @@
1
- {"version":3,"file":"SubscriptionComparisonModal.js","names":["_react","_interopRequireWildcard","require","_propTypes","_interopRequireDefault","_classnames","_i18n","_paragon","_icons","_useSubscriptionOffer","_messages","_jsxRuntime","e","__esModule","default","t","WeakMap","r","n","o","i","f","__proto__","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","SUBSCRIBE","BUY","SubscriptionComparisonModal","_ref","courseId","isOpen","onClose","onSubscribeClick","onPurchaseClick","formatMessage","useIntl","offer","useSubscriptionOffer","isSmallScreen","useWindowSize","width","breakpoints","medium","minWidth","activePlan","setActivePlan","useState","canSubscribe","hasTrial","purchaseUrl","canPurchase","coursePrice","subscribePrice","included","jsx","Icon","src","CheckCircle","screenReaderText","messages","includedAlt","notIncluded","className","children","notIncludedAlt","cell","value","subscribePriceCell","buyPriceCell","jsxs","Fragment","oneTimePurchase","rows","key","label","rowPrice","featureUnlimitedAccess","rowEarnCertificates","certificatesUnlimited","certificatesOne","featureGradedAssignments","featureChangeCourses","cancelAnytime","featureFreeTrial","filter","Boolean","plans","name","subscribeColumn","buyCourseColumn","activeKey","some","plan","visiblePlans","activeIndex","findIndex","showPlanAt","index","length","title","comparisonTitle","ModalDialog","size","hasCloseButton","isFullscreenOnMobile","isOverflowVisible","Header","Title","as","comparisonSubtitle","Body","scope","featureColumn","map","row","IconButton","ChevronLeft","iconAs","alt","previousPlan","onClick","type","classNames","showPlan","ChevronRight","nextPlan","Footer","ActionRow","Button","href","subscribeUrl","variant","startFreeTrial","subscribe","buyFor","price","purchaseNoPrice","propTypes","PropTypes","string","isRequired","bool","func","defaultProps","undefined","_default","exports"],"sources":["../../src/subscription-upsell/SubscriptionComparisonModal.jsx"],"sourcesContent":["/* eslint import/no-unresolved: 0 */\nimport React, { useState } from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport { useIntl } from '@edx/frontend-platform/i18n';\nimport {\n ActionRow, breakpoints, Button, Icon, IconButton, ModalDialog, useWindowSize,\n} from '@openedx/paragon';\nimport { ChevronLeft, ChevronRight, CheckCircle } from '@openedx/paragon/icons';\n\nimport useSubscriptionOffer from './useSubscriptionOffer';\nimport messages from './messages';\nimport './SubscriptionComparisonModal.scss';\n\nconst SUBSCRIBE = 'subscribe';\nconst BUY = 'buy';\n\n/** Subscribe vs Buy course pop-up (Figma 3339-8172); one column at a time on small screens. */\nconst SubscriptionComparisonModal = ({\n courseId,\n isOpen,\n onClose,\n onSubscribeClick,\n onPurchaseClick,\n}) => {\n const { formatMessage } = useIntl();\n const offer = useSubscriptionOffer(courseId);\n const isSmallScreen = useWindowSize().width < breakpoints.medium.minWidth;\n const [activePlan, setActivePlan] = useState(SUBSCRIBE);\n\n if (!offer || !offer.canSubscribe) {\n return null;\n }\n\n const {\n hasTrial, purchaseUrl, canPurchase, coursePrice, subscribePrice,\n } = offer;\n\n const included = <Icon src={CheckCircle} screenReaderText={formatMessage(messages.includedAlt)} />;\n const notIncluded = <span className=\"sr-only\">{formatMessage(messages.notIncludedAlt)}</span>;\n const cell = (value) => {\n if (value === true) { return included; }\n if (value === false) { return notIncluded; }\n return value || null;\n };\n\n const subscribePriceCell = subscribePrice && <div className=\"font-weight-bold\">{subscribePrice}</div>;\n const buyPriceCell = coursePrice && (\n <>\n <div className=\"font-weight-bold\">{coursePrice}</div>\n <small>{formatMessage(messages.oneTimePurchase)}</small>\n </>\n );\n\n const rows = [\n {\n key: 'price', label: formatMessage(messages.rowPrice), [SUBSCRIBE]: subscribePriceCell, [BUY]: buyPriceCell,\n },\n {\n key: 'unlimited-access', label: formatMessage(messages.featureUnlimitedAccess), [SUBSCRIBE]: true, [BUY]: true,\n },\n {\n key: 'certificates',\n label: formatMessage(messages.rowEarnCertificates),\n [SUBSCRIBE]: formatMessage(messages.certificatesUnlimited),\n [BUY]: formatMessage(messages.certificatesOne),\n },\n {\n key: 'graded-assignments', label: formatMessage(messages.featureGradedAssignments), [SUBSCRIBE]: true, [BUY]: true,\n },\n {\n key: 'change-courses', label: formatMessage(messages.featureChangeCourses), [SUBSCRIBE]: true, [BUY]: false,\n },\n {\n key: 'cancel-anytime', label: formatMessage(messages.cancelAnytime), [SUBSCRIBE]: true, [BUY]: false,\n },\n hasTrial && {\n key: 'free-trial', label: formatMessage(messages.featureFreeTrial), [SUBSCRIBE]: true, [BUY]: false,\n },\n ].filter(Boolean);\n\n const plans = [\n { key: SUBSCRIBE, name: formatMessage(messages.subscribeColumn), className: 'plan-subscribe' },\n canPurchase && { key: BUY, name: formatMessage(messages.buyCourseColumn), className: 'plan-buy' },\n ].filter(Boolean);\n // The selected plan can vanish, e.g. Buy was selected and the course lost its purchase link.\n const activeKey = plans.some((plan) => plan.key === activePlan) ? activePlan : plans[0].key;\n const visiblePlans = isSmallScreen ? plans.filter((plan) => plan.key === activeKey) : plans;\n const activeIndex = plans.findIndex((plan) => plan.key === activeKey);\n const showPlanAt = (index) => setActivePlan(plans[(index + plans.length) % plans.length].key);\n\n const title = formatMessage(messages.comparisonTitle);\n\n return (\n <ModalDialog\n title={title}\n isOpen={isOpen}\n onClose={onClose}\n size=\"lg\"\n hasCloseButton\n isFullscreenOnMobile\n isOverflowVisible={false}\n className=\"subscription-comparison-modal\"\n >\n <ModalDialog.Header>\n <ModalDialog.Title as=\"h2\">{title}</ModalDialog.Title>\n <p className=\"mt-2 mb-0\">{formatMessage(messages.comparisonSubtitle)}</p>\n </ModalDialog.Header>\n <ModalDialog.Body>\n <table className=\"w-100 text-center subscription-comparison-table\" data-testid=\"subscription-comparison-table\">\n <thead>\n <tr>\n <th scope=\"col\" className=\"feature-header\"><span className=\"sr-only\">{formatMessage(messages.featureColumn)}</span></th>\n {visiblePlans.map((plan) => (\n <th scope=\"col\" key={plan.key} className={plan.className} data-testid={`subscription-comparison-header-${plan.key}`}>\n {plan.name}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {rows.map((row) => (\n <tr key={row.key} data-testid={`subscription-comparison-row-${row.key}`}>\n <th scope=\"row\" className=\"feature-cell\">{row.label}</th>\n {visiblePlans.map((plan) => (\n <td key={plan.key} className={plan.className} data-testid={`subscription-comparison-cell-${row.key}-${plan.key}`}>\n <div className=\"center-items flex-column\">{cell(row[plan.key])}</div>\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n {isSmallScreen && plans.length > 1 && (\n <div className=\"d-flex align-items-center justify-content-center mt-3\" data-testid=\"subscription-comparison-controls\">\n <IconButton\n src={ChevronLeft}\n iconAs={Icon}\n alt={formatMessage(messages.previousPlan)}\n onClick={() => showPlanAt(activeIndex - 1)}\n />\n {plans.map((plan) => (\n <button\n type=\"button\"\n key={plan.key}\n className={classNames('btn btn-link p-1', { 'font-weight-bold': plan.key === activeKey })}\n aria-pressed={plan.key === activeKey}\n aria-label={formatMessage(messages.showPlan, { plan: plan.name })}\n onClick={() => setActivePlan(plan.key)}\n >\n {plan.key === activeKey ? '●' : '○'}\n </button>\n ))}\n <IconButton\n src={ChevronRight}\n iconAs={Icon}\n alt={formatMessage(messages.nextPlan)}\n onClick={() => showPlanAt(activeIndex + 1)}\n />\n </div>\n )}\n </ModalDialog.Body>\n <ModalDialog.Footer>\n <ActionRow\n className={classNames({ 'subscription-comparison-actions-stacked': isSmallScreen })}\n data-testid=\"subscription-comparison-actions\"\n >\n <Button\n as=\"a\"\n href={offer.subscribeUrl}\n variant=\"primary\"\n onClick={onSubscribeClick}\n data-testid=\"subscription-comparison-subscribe-button\"\n >\n {formatMessage(hasTrial ? messages.startFreeTrial : messages.subscribe)}\n </Button>\n {canPurchase && (\n <Button\n as=\"a\"\n href={purchaseUrl}\n variant=\"outline-primary\"\n onClick={onPurchaseClick}\n data-testid=\"subscription-comparison-purchase-button\"\n >\n {coursePrice\n ? formatMessage(messages.buyFor, { price: coursePrice })\n : formatMessage(messages.purchaseNoPrice)}\n </Button>\n )}\n </ActionRow>\n </ModalDialog.Footer>\n </ModalDialog>\n );\n};\n\nSubscriptionComparisonModal.propTypes = {\n courseId: PropTypes.string.isRequired,\n isOpen: PropTypes.bool.isRequired,\n onClose: PropTypes.func.isRequired,\n onSubscribeClick: PropTypes.func,\n onPurchaseClick: PropTypes.func,\n};\n\nSubscriptionComparisonModal.defaultProps = {\n onSubscribeClick: undefined,\n onPurchaseClick: undefined,\n};\n\nexport default SubscriptionComparisonModal;\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"SubscriptionComparisonModal.js","names":["_react","_interopRequireWildcard","require","_propTypes","_interopRequireDefault","_classnames","_i18n","_paragon","_icons","_useSubscriptionOffer","_messages","_jsxRuntime","e","__esModule","default","t","WeakMap","r","n","o","i","f","__proto__","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","SUBSCRIBE","BUY","SubscriptionComparisonModal","_ref","courseId","isOpen","onClose","onSubscribeClick","onPurchaseClick","formatMessage","useIntl","offer","useSubscriptionOffer","isSmallScreen","useWindowSize","width","breakpoints","medium","minWidth","activePlan","setActivePlan","useState","canSubscribe","hasTrial","purchaseUrl","canPurchase","coursePrice","subscribePrice","included","jsx","Icon","src","CheckCircle","screenReaderText","messages","includedAlt","notIncluded","className","children","notIncludedAlt","cell","value","subscribePriceCell","buyPriceCell","jsxs","Fragment","oneTimePurchase","rows","key","label","rowPrice","featureUnlimitedAccess","rowEarnCertificates","certificatesUnlimited","certificatesOne","featureGradedAssignments","featureChangeCourses","cancelAnytime","featureFreeTrial","filter","Boolean","plans","name","subscribeColumn","buyCourseColumn","activeKey","some","plan","visiblePlans","activeIndex","findIndex","showPlanAt","index","length","title","comparisonTitle","ModalDialog","size","hasCloseButton","isFullscreenOnMobile","isOverflowVisible","Header","Title","as","comparisonSubtitle","Body","scope","featureColumn","map","row","IconButton","ChevronLeft","iconAs","alt","previousPlan","onClick","type","classNames","showPlan","ChevronRight","nextPlan","Footer","ActionRow","Button","href","subscribeUrl","variant","startFreeTrial","subscribe","buyFor","price","purchaseNoPrice","propTypes","PropTypes","string","isRequired","bool","func","defaultProps","undefined","_default","exports"],"sources":["../../src/subscription-upsell/SubscriptionComparisonModal.jsx"],"sourcesContent":["/* eslint import/no-unresolved: 0 */\nimport React, { useState } from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport { useIntl } from '@edx/frontend-platform/i18n';\nimport {\n ActionRow, breakpoints, Button, Icon, IconButton, ModalDialog, useWindowSize,\n} from '@openedx/paragon';\nimport { ChevronLeft, ChevronRight, CheckCircle } from '@openedx/paragon/icons';\n\nimport useSubscriptionOffer from './useSubscriptionOffer';\nimport messages from './messages';\nimport './SubscriptionComparisonModal.scss';\n\nconst SUBSCRIBE = 'subscribe';\nconst BUY = 'buy';\n\n/** Subscribe vs Buy course pop-up (Figma 3339-8172); one column at a time on small screens. */\nconst SubscriptionComparisonModal = ({\n courseId,\n isOpen,\n onClose,\n onSubscribeClick,\n onPurchaseClick,\n}) => {\n const { formatMessage } = useIntl();\n const offer = useSubscriptionOffer(courseId);\n const isSmallScreen = useWindowSize().width < breakpoints.medium.minWidth;\n const [activePlan, setActivePlan] = useState(SUBSCRIBE);\n\n if (!offer || !offer.canSubscribe) {\n return null;\n }\n\n const {\n hasTrial, purchaseUrl, canPurchase, coursePrice, subscribePrice,\n } = offer;\n\n const included = <Icon src={CheckCircle} screenReaderText={formatMessage(messages.includedAlt)} />;\n const notIncluded = <span className=\"sr-only\">{formatMessage(messages.notIncludedAlt)}</span>;\n const cell = (value) => {\n if (value === true) { return included; }\n if (value === false) { return notIncluded; }\n return value || null;\n };\n\n const subscribePriceCell = subscribePrice && <div className=\"font-weight-bold\">{subscribePrice}</div>;\n const buyPriceCell = coursePrice && (\n <>\n <div className=\"font-weight-bold\">{coursePrice}</div>\n <small>{formatMessage(messages.oneTimePurchase)}</small>\n </>\n );\n\n const rows = [\n {\n key: 'price', label: formatMessage(messages.rowPrice), [SUBSCRIBE]: subscribePriceCell, [BUY]: buyPriceCell,\n },\n {\n key: 'unlimited-access', label: formatMessage(messages.featureUnlimitedAccess), [SUBSCRIBE]: true, [BUY]: true,\n },\n {\n key: 'certificates',\n label: formatMessage(messages.rowEarnCertificates),\n [SUBSCRIBE]: formatMessage(messages.certificatesUnlimited),\n [BUY]: formatMessage(messages.certificatesOne),\n },\n {\n key: 'graded-assignments', label: formatMessage(messages.featureGradedAssignments), [SUBSCRIBE]: true, [BUY]: true,\n },\n {\n key: 'change-courses', label: formatMessage(messages.featureChangeCourses), [SUBSCRIBE]: true, [BUY]: false,\n },\n {\n key: 'cancel-anytime', label: formatMessage(messages.cancelAnytime), [SUBSCRIBE]: true, [BUY]: false,\n },\n hasTrial && {\n key: 'free-trial', label: formatMessage(messages.featureFreeTrial), [SUBSCRIBE]: true, [BUY]: false,\n },\n ].filter(Boolean);\n\n const plans = [\n { key: SUBSCRIBE, name: formatMessage(messages.subscribeColumn), className: 'plan-subscribe' },\n canPurchase && { key: BUY, name: formatMessage(messages.buyCourseColumn), className: 'plan-buy' },\n ].filter(Boolean);\n // The selected plan can vanish, e.g. Buy was selected and the course lost its purchase link.\n const activeKey = plans.some((plan) => plan.key === activePlan) ? activePlan : plans[0].key;\n const visiblePlans = isSmallScreen ? plans.filter((plan) => plan.key === activeKey) : plans;\n const activeIndex = plans.findIndex((plan) => plan.key === activeKey);\n const showPlanAt = (index) => setActivePlan(plans[(index + plans.length) % plans.length].key);\n\n const title = formatMessage(messages.comparisonTitle);\n\n return (\n <ModalDialog\n title={title}\n isOpen={isOpen}\n onClose={onClose}\n size=\"lg\"\n hasCloseButton\n isFullscreenOnMobile\n isOverflowVisible={false}\n className=\"subscription-comparison-modal\"\n >\n <ModalDialog.Header>\n <ModalDialog.Title as=\"h2\">{title}</ModalDialog.Title>\n <p className=\"mt-2 mb-0\">{formatMessage(messages.comparisonSubtitle)}</p>\n </ModalDialog.Header>\n <ModalDialog.Body>\n <table className=\"w-100 text-center subscription-comparison-table\" data-testid=\"subscription-comparison-table\">\n <thead>\n <tr>\n <th scope=\"col\" className=\"feature-header\"><span className=\"sr-only\">{formatMessage(messages.featureColumn)}</span></th>\n {visiblePlans.map((plan) => (\n <th scope=\"col\" key={plan.key} className={plan.className} data-testid={`subscription-comparison-header-${plan.key}`}>\n {plan.name}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {rows.map((row) => (\n <tr key={row.key} data-testid={`subscription-comparison-row-${row.key}`}>\n <th scope=\"row\" className=\"feature-cell\">{row.label}</th>\n {visiblePlans.map((plan) => (\n <td key={plan.key} className={plan.className} data-testid={`subscription-comparison-cell-${row.key}-${plan.key}`}>\n <div className=\"center-items flex-column\">{cell(row[plan.key])}</div>\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n {isSmallScreen && plans.length > 1 && (\n <div className=\"d-flex align-items-center justify-content-center mt-3\" data-testid=\"subscription-comparison-controls\">\n <IconButton\n src={ChevronLeft}\n iconAs={Icon}\n alt={formatMessage(messages.previousPlan)}\n onClick={() => showPlanAt(activeIndex - 1)}\n />\n {plans.map((plan) => (\n <button\n type=\"button\"\n key={plan.key}\n className={classNames('btn btn-link p-1', { 'font-weight-bold': plan.key === activeKey })}\n aria-pressed={plan.key === activeKey}\n aria-label={formatMessage(messages.showPlan, { plan: plan.name })}\n onClick={() => setActivePlan(plan.key)}\n >\n {plan.key === activeKey ? '●' : '○'}\n </button>\n ))}\n <IconButton\n src={ChevronRight}\n iconAs={Icon}\n alt={formatMessage(messages.nextPlan)}\n onClick={() => showPlanAt(activeIndex + 1)}\n />\n </div>\n )}\n </ModalDialog.Body>\n <ModalDialog.Footer>\n <ActionRow\n className={classNames({ 'subscription-comparison-actions-stacked': isSmallScreen })}\n data-testid=\"subscription-comparison-actions\"\n >\n <Button\n as=\"a\"\n href={offer.subscribeUrl}\n variant=\"primary\"\n className=\"rounded-pill\"\n onClick={onSubscribeClick}\n data-testid=\"subscription-comparison-subscribe-button\"\n >\n {formatMessage(hasTrial ? messages.startFreeTrial : messages.subscribe)}\n </Button>\n {canPurchase && (\n <Button\n as=\"a\"\n href={purchaseUrl}\n variant=\"outline-primary\"\n className=\"rounded-pill\"\n onClick={onPurchaseClick}\n data-testid=\"subscription-comparison-purchase-button\"\n >\n {coursePrice\n ? formatMessage(messages.buyFor, { price: coursePrice })\n : formatMessage(messages.purchaseNoPrice)}\n </Button>\n )}\n </ActionRow>\n </ModalDialog.Footer>\n </ModalDialog>\n );\n};\n\nSubscriptionComparisonModal.propTypes = {\n courseId: PropTypes.string.isRequired,\n isOpen: PropTypes.bool.isRequired,\n onClose: PropTypes.func.isRequired,\n onSubscribeClick: PropTypes.func,\n onPurchaseClick: PropTypes.func,\n};\n\nSubscriptionComparisonModal.defaultProps = {\n onSubscribeClick: undefined,\n onPurchaseClick: undefined,\n};\n\nexport default SubscriptionComparisonModal;\n"],"mappings":"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","ignoreList":[]}
@@ -1,3 +1,10 @@
1
+ @use "modal-chrome";
2
+
3
+ // Brand/Putty/100 background with the shared chrome.
4
+ .subscription-comparison-modal.pgn__modal {
5
+ @include modal-chrome.modal-chrome(var(--pgn-color-light-200));
6
+ }
7
+
1
8
  // Scoped to the modal so the sidebar card's UpsellTable styles stay untouched.
2
9
  .subscription-comparison-modal {
3
10
  .subscription-comparison-table {
@@ -31,6 +31,12 @@ const UPGRADE_STATE = exports.UPGRADE_STATE = {
31
31
  };
32
32
 
33
33
  // Host callbacks (analytics, refresh) must never change the outcome of the upgrade request.
34
+ // Buy and Subscribe split the card evenly (zero basis), but stay content-sized where the host
35
+ // shrink-wraps the upsell (paywall, Dates banner). flex-fill would size them by label length.
36
+ const equalWidth = {
37
+ flex: '1 1 0',
38
+ minWidth: 'max-content'
39
+ };
34
40
  const safeCall = function (fn) {
35
41
  try {
36
42
  for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
@@ -142,7 +148,8 @@ const SubscriptionUpsell = _ref => {
142
148
  "data-testid": "subscription-upgrade-failed",
143
149
  children: formatMessage(_messages2.default.upgradeFailed)
144
150
  }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_paragon.Button, {
145
- variant: "brand",
151
+ variant: "primary",
152
+ className: "rounded-pill",
146
153
  block: true,
147
154
  onClick: handleUpgrade,
148
155
  disabled: upgradeState === UPGRADE_STATE.LOADING,
@@ -164,7 +171,9 @@ const SubscriptionUpsell = _ref => {
164
171
  children: [canPurchase && /*#__PURE__*/(0, _jsxRuntime.jsx)(_paragon.Button, {
165
172
  as: "a",
166
173
  href: purchaseUrl,
167
- variant: offer.canSubscribe ? 'outline-primary' : 'brand',
174
+ variant: offer.canSubscribe ? 'outline-primary' : 'primary',
175
+ className: "rounded-pill",
176
+ style: equalWidth,
168
177
  onClick: onPurchaseClick,
169
178
  "data-testid": "subscription-purchase-button",
170
179
  children: coursePrice ? formatMessage(_messages2.default.purchase, {
@@ -173,8 +182,9 @@ const SubscriptionUpsell = _ref => {
173
182
  }), offer.canSubscribe && /*#__PURE__*/(0, _jsxRuntime.jsx)(_paragon.Button, {
174
183
  as: "a",
175
184
  href: offer.subscribeUrl,
176
- variant: "brand",
177
- className: "ml-2",
185
+ variant: "primary",
186
+ className: "ml-2 rounded-pill",
187
+ style: equalWidth,
178
188
  onClick: onSubscribeClick,
179
189
  "data-testid": "subscription-subscribe-button",
180
190
  children: formatMessage(_messages2.default.subscribe)
@@ -1 +1 @@
1
- {"version":3,"file":"SubscriptionUpsell.js","names":["_react","_interopRequireWildcard","require","_propTypes","_interopRequireDefault","_i18n","_logging","_paragon","_lms_api","_messages","_reloadWhenUpgraded","_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","pollSignal","useEffect","controller","AbortController","current","signal","abort","purchaseUrl","canPurchase","coursePrice","handleUpgrade","requestedCourseId","startPath","global","location","pathname","add","nextState","result","upgradeEnrollmentWithSubscription","success","SubscriptionUpgradeError","code","status","delete","reloadWhenUpgraded","canUpgradeInPlace","jsx","role","children","messages","upgradePending","jsxs","upgradeNotActive","subscribeUrl","Fragment","Hyperlink","destination","reactivateSubscription","upgradeFailed","Button","variant","block","onClick","disabled","upgrading","upgradeNow","hasUpsell","showNotIncluded","notIncluded","as","href","canSubscribe","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, { useEffect, 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 reloadWhenUpgraded from './reloadWhenUpgraded';\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 // Cancels the reload poll when this component unmounts or shows another course.\n const pollSignal = useRef(null);\n useEffect(() => {\n const controller = new AbortController();\n pollSignal.current = controller.signal;\n return () => controller.abort();\n }, [courseId]);\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 const signal = pollSignal.current;\n // Read before the request, so moving to another unit while it is pending also rules out the reload.\n const startPath = global.location.pathname;\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', result);\n safeCall(onUpgraded || (() => reloadWhenUpgraded(requestedCourseId, { signal, startPath })), 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 (!offer.hasUpsell) {\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 // Called after an accepted upgrade. Without it, the page reloads once the LMS has upgraded the enrollment.\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","_reloadWhenUpgraded","_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","equalWidth","flex","minWidth","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","pollSignal","useEffect","controller","AbortController","current","signal","abort","purchaseUrl","canPurchase","coursePrice","handleUpgrade","requestedCourseId","startPath","global","location","pathname","add","nextState","result","upgradeEnrollmentWithSubscription","success","SubscriptionUpgradeError","code","status","delete","reloadWhenUpgraded","canUpgradeInPlace","jsx","role","children","messages","upgradePending","jsxs","upgradeNotActive","subscribeUrl","Fragment","Hyperlink","destination","reactivateSubscription","upgradeFailed","Button","variant","block","onClick","disabled","upgrading","upgradeNow","hasUpsell","showNotIncluded","notIncluded","as","href","canSubscribe","style","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, { useEffect, 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 reloadWhenUpgraded from './reloadWhenUpgraded';\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.\n// Buy and Subscribe split the card evenly (zero basis), but stay content-sized where the host\n// shrink-wraps the upsell (paywall, Dates banner). flex-fill would size them by label length.\nconst equalWidth = { flex: '1 1 0', minWidth: 'max-content' };\n\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 // Cancels the reload poll when this component unmounts or shows another course.\n const pollSignal = useRef(null);\n useEffect(() => {\n const controller = new AbortController();\n pollSignal.current = controller.signal;\n return () => controller.abort();\n }, [courseId]);\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 const signal = pollSignal.current;\n // Read before the request, so moving to another unit while it is pending also rules out the reload.\n const startPath = global.location.pathname;\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', result);\n safeCall(onUpgraded || (() => reloadWhenUpgraded(requestedCourseId, { signal, startPath })), 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=\"primary\"\n className=\"rounded-pill\"\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 (!offer.hasUpsell) {\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' : 'primary'}\n className=\"rounded-pill\"\n style={equalWidth}\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=\"primary\"\n className=\"ml-2 rounded-pill\"\n style={equalWidth}\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 // Called after an accepted upgrade. Without it, the page reloads once the LMS has upgraded the enrollment.\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":[]}
@@ -0,0 +1,44 @@
1
+ // Shared pop-up chrome from the Figma (launch 3482-70647, comparison 3339-8172): 900px wide,
2
+ // 12px radius, 56px padding with 40px gaps, heavy italic title. Include it under a selector that
3
+ // also carries .pgn__modal, so the rules outweigh Paragon's instead of relying on load order.
4
+ // $bg is the content colour token; the header and footer paint it themselves, so it is set as the
5
+ // token rather than as background-color.
6
+ @mixin modal-chrome($bg) {
7
+ --pgn-color-modal-content-bg: #{$bg};
8
+ --pgn-size-modal-content-border-radius: 12px; // Paragon reads it, and still zeroes it when fullscreen
9
+ max-width: 900px;
10
+
11
+ // Explicit padding on all three replaces Paragon's, so the gaps are exactly 40px.
12
+ .pgn__modal-header {
13
+ padding: 56px 56px 0;
14
+ }
15
+
16
+ .pgn__modal-body {
17
+ padding: 40px 56px 0;
18
+ }
19
+
20
+ .pgn__modal-footer {
21
+ padding: 40px 56px 56px;
22
+ }
23
+
24
+ .pgn__modal-title {
25
+ font-size: 2rem;
26
+ line-height: 1.25; // Paragon's is fixed from the h3 token, so it would crowd 2rem text
27
+ font-weight: 800;
28
+ font-style: italic; // display font TBD (LP-1465 question 7)
29
+ }
30
+
31
+ @media (max-width: 576px) {
32
+ .pgn__modal-header {
33
+ padding: 24px 24px 0;
34
+ }
35
+
36
+ .pgn__modal-body {
37
+ padding: 24px 24px 0;
38
+ }
39
+
40
+ .pgn__modal-footer {
41
+ padding: 24px;
42
+ }
43
+ }
44
+ }
@@ -161,6 +161,11 @@ const messages = (0, _i18n.defineMessages)({
161
161
  defaultMessage: 'This subscription offers unlimited flexibility. Change topics or courses anytime.',
162
162
  description: 'Benefit body: switch courses'
163
163
  },
164
+ benefitChangeCourseBodyFreeTrial: {
165
+ id: 'advertisements.subscription.modal.benefit.change-course.body.free-trial',
166
+ defaultMessage: 'Subscribers get verified access to hundreds of courses and programs',
167
+ description: 'Benefit body: change course, free trial pop-up wording'
168
+ },
164
169
  benefitTrialTitle: {
165
170
  id: 'advertisements.subscription.modal.benefit.trial.title',
166
171
  defaultMessage: 'Get your free trial',
@@ -1 +1 @@
1
- {"version":3,"file":"messages.js","names":["_i18n","require","messages","defineMessages","subscribe","id","defaultMessage","description","purchase","purchaseNoPrice","upgradeNow","upgrading","upgradePending","upgradeNotActive","reactivateSubscription","upgradeFailed","cardHeader","benefitsHeader","featureColumn","buyColumn","subscribeColumn","pricePerInterval","featureFreeTrial","featureChangeCourses","featureCertificates","featureCertificatesLink","featureGradedAssignments","featureUnlimitedAccess","includedAlt","notIncludedAlt","brand","modalTitleFreeTrial","modalTitleLaunch","modalSubtitle","benefitCertificatesTitle","benefitCertificatesBody","benefitChangeCourseTitle","benefitChangeCourseBody","benefitTrialTitle","benefitTrialBody","earnCertificateFor","continueToCheckout","cancelAnytime","comparisonTitle","comparisonSubtitle","buyCourseColumn","rowPrice","oneTimePurchase","rowEarnCertificates","certificatesUnlimited","certificatesOne","startFreeTrial","buyFor","previousPlan","nextPlan","showPlan","notIncluded","_default","exports","default"],"sources":["../../src/subscription-upsell/messages.js"],"sourcesContent":["import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n subscribe: {\n id: 'advertisements.subscription.subscribe',\n defaultMessage: 'Subscribe',\n description: 'Button that sends the learner to subscription checkout',\n },\n purchase: {\n id: 'advertisements.subscription.purchase',\n defaultMessage: 'Buy {price}',\n description: 'Button that sends the learner to one-time purchase checkout for this course. {price} is the formatted course price, for example $49.',\n },\n purchaseNoPrice: {\n id: 'advertisements.subscription.purchase-no-price',\n defaultMessage: 'Buy',\n description: 'Purchase button label when the course price is not known',\n },\n upgradeNow: {\n id: 'advertisements.subscription.upgrade-now',\n defaultMessage: 'Upgrade now',\n description: 'Button for a subscriber to unlock this course under their subscription',\n },\n upgrading: {\n id: 'advertisements.subscription.upgrading',\n defaultMessage: 'Upgrading…',\n description: 'Button label while the upgrade request is in progress',\n },\n upgradePending: {\n id: 'advertisements.subscription.upgrade-pending',\n defaultMessage: 'Your upgrade is being processed. This can take a moment.',\n description: 'Shown after the server accepted the upgrade but has not finished applying it',\n },\n upgradeNotActive: {\n id: 'advertisements.subscription.upgrade-not-active',\n defaultMessage: 'Your subscription is not active, so this course could not be upgraded.',\n description: 'Shown when the upgrade failed because the subscription is not active',\n },\n reactivateSubscription: {\n id: 'advertisements.subscription.reactivate',\n defaultMessage: 'Reactivate your subscription',\n description: 'Link to subscription checkout shown when the subscription is not active',\n },\n upgradeFailed: {\n id: 'advertisements.subscription.upgrade-failed',\n defaultMessage: 'We could not upgrade this course. Please try again.',\n description: 'Shown when the upgrade request failed for an unexpected reason',\n },\n cardHeader: {\n id: 'advertisements.subscription.card.header',\n defaultMessage: 'Make the most out of your learning',\n description: 'Header of the subscription upgrade card in the course sidebar',\n },\n benefitsHeader: {\n id: 'advertisements.subscription.card.benefits-header',\n defaultMessage: 'Upgrading can have huge benefits',\n description: 'Header above the Buy vs Subscribe comparison table',\n },\n featureColumn: {\n id: 'advertisements.subscription.card.feature-column',\n defaultMessage: 'Feature',\n description: 'Screen-reader-only header for the feature column of the comparison table',\n },\n buyColumn: {\n id: 'advertisements.subscription.card.buy-column',\n defaultMessage: 'Buy',\n description: 'Column header for the one-time purchase option',\n },\n subscribeColumn: {\n id: 'advertisements.subscription.card.subscribe-column',\n defaultMessage: 'Subscribe',\n description: 'Column header for the subscription option',\n },\n pricePerInterval: {\n id: 'advertisements.subscription.card.price-per-interval',\n defaultMessage: '{price}/{interval, select, month {month} year {year} other {{interval}}}',\n description: 'Subscription price with its billing interval, for example $59/month. interval is month or year.',\n },\n featureFreeTrial: {\n id: 'advertisements.subscription.card.feature.free-trial',\n defaultMessage: 'Free trial',\n description: 'Comparison row: a free trial is available',\n },\n featureChangeCourses: {\n id: 'advertisements.subscription.card.feature.change-courses',\n defaultMessage: 'Change courses for free',\n description: 'Comparison row: switch to other courses at no extra cost',\n },\n featureCertificates: {\n id: 'advertisements.subscription.card.feature.certificates',\n defaultMessage: 'Earn {certificateLink}',\n description: 'Comparison row: earn verified certificates. {certificateLink} is a link reading \"verified certificates\".',\n },\n featureCertificatesLink: {\n id: 'advertisements.subscription.card.feature.certificates-link',\n defaultMessage: 'verified certificates',\n description: 'Link text inside the earn certificates row',\n },\n featureGradedAssignments: {\n id: 'advertisements.subscription.card.feature.graded-assignments',\n defaultMessage: 'Complete graded assignments',\n description: 'Comparison row: access to graded assignments',\n },\n featureUnlimitedAccess: {\n id: 'advertisements.subscription.card.feature.unlimited-access',\n defaultMessage: 'Unlimited access to course materials',\n description: 'Comparison row: no access expiration',\n },\n includedAlt: {\n id: 'advertisements.subscription.card.included',\n defaultMessage: 'Included',\n description: 'Alt text for the check icon in the comparison table',\n },\n notIncludedAlt: {\n id: 'advertisements.subscription.card.not-included',\n defaultMessage: 'Not included',\n description: 'Alt text for the cross icon in the comparison table',\n },\n brand: {\n id: 'advertisements.subscription.brand',\n defaultMessage: 'edX Plus',\n description: 'Subscription product name shown above the pop-up title',\n },\n modalTitleFreeTrial: {\n id: 'advertisements.subscription.modal.title.free-trial',\n defaultMessage: 'Subscribe to start your free trial',\n description: 'Pop-up title when the learner is eligible for a free trial',\n },\n modalTitleLaunch: {\n id: 'advertisements.subscription.modal.title.launch',\n defaultMessage: 'Subscribe and upgrade this course',\n description: 'Pop-up title when there is no free trial to offer',\n },\n modalSubtitle: {\n id: 'advertisements.subscription.modal.subtitle',\n defaultMessage: 'Give your career a boost with flexible courses and new skills in your field.',\n description: 'Pop-up subtitle under the title',\n },\n benefitCertificatesTitle: {\n id: 'advertisements.subscription.modal.benefit.certificates.title',\n defaultMessage: 'Earn multiple certificates',\n description: 'Benefit title: unlimited certificates',\n },\n benefitCertificatesBody: {\n id: 'advertisements.subscription.modal.benefit.certificates.body',\n defaultMessage: 'There’s no limit to the certificates you can earn and add to your resume.',\n description: 'Benefit body: unlimited certificates',\n },\n benefitChangeCourseTitle: {\n id: 'advertisements.subscription.modal.benefit.change-course.title',\n defaultMessage: 'Change your course at any time',\n description: 'Benefit title: switch courses',\n },\n benefitChangeCourseBody: {\n id: 'advertisements.subscription.modal.benefit.change-course.body',\n defaultMessage: 'This subscription offers unlimited flexibility. Change topics or courses anytime.',\n description: 'Benefit body: switch courses',\n },\n benefitTrialTitle: {\n id: 'advertisements.subscription.modal.benefit.trial.title',\n defaultMessage: 'Get your free trial',\n description: 'Benefit title: free trial',\n },\n benefitTrialBody: {\n id: 'advertisements.subscription.modal.benefit.trial.body',\n defaultMessage: 'Try it for free to see if a subscription is right for you.',\n description: 'Benefit body: free trial',\n },\n earnCertificateFor: {\n id: 'advertisements.subscription.modal.earn-certificate-for',\n defaultMessage: 'Earn certificate for {price}',\n description: 'Pop-up button for one-time purchase. {price} is the course price.',\n },\n continueToCheckout: {\n id: 'advertisements.subscription.modal.continue-to-checkout',\n defaultMessage: 'Continue to checkout',\n description: 'Pop-up button that goes to subscription checkout',\n },\n cancelAnytime: {\n id: 'advertisements.subscription.modal.cancel-anytime',\n defaultMessage: 'Cancel anytime',\n description: 'Small note under the checkout button in the free trial pop-up',\n },\n comparisonTitle: {\n id: 'advertisements.subscription.comparison.title',\n defaultMessage: 'Try our new subscription or upgrade to a certificate',\n description: 'Title of the Subscribe vs Buy comparison pop-up',\n },\n comparisonSubtitle: {\n id: 'advertisements.subscription.comparison.subtitle',\n defaultMessage: 'See what other learning paths have to offer to learn if upgrading is right for you.',\n description: 'Subtitle of the comparison pop-up',\n },\n buyCourseColumn: {\n id: 'advertisements.subscription.comparison.buy-course-column',\n defaultMessage: 'Buy course',\n description: 'Column header for the one-time purchase option in the comparison pop-up',\n },\n rowPrice: {\n id: 'advertisements.subscription.comparison.row.price',\n defaultMessage: 'Price',\n description: 'Comparison row header: price',\n },\n oneTimePurchase: {\n id: 'advertisements.subscription.comparison.one-time-purchase',\n defaultMessage: 'One-time purchase',\n description: 'Small print under the course price',\n },\n rowEarnCertificates: {\n id: 'advertisements.subscription.comparison.row.earn-certificates',\n defaultMessage: 'Earn certificates',\n description: 'Comparison row header: certificates',\n },\n certificatesUnlimited: {\n id: 'advertisements.subscription.comparison.certificates-unlimited',\n defaultMessage: 'Unlimited',\n description: 'Certificates cell for the subscription column',\n },\n certificatesOne: {\n id: 'advertisements.subscription.comparison.certificates-one',\n defaultMessage: '1 certificate',\n description: 'Certificates cell for the one-time purchase column',\n },\n startFreeTrial: {\n id: 'advertisements.subscription.comparison.start-free-trial',\n defaultMessage: 'Start free trial',\n description: 'Subscribe button when a free trial is available',\n },\n buyFor: {\n id: 'advertisements.subscription.comparison.buy-for',\n defaultMessage: 'Buy for {price}',\n description: 'Purchase button in the comparison pop-up. {price} is the course price.',\n },\n previousPlan: {\n id: 'advertisements.subscription.comparison.previous-plan',\n defaultMessage: 'Previous option',\n description: 'Screen reader label for the arrow that shows the previous column on small screens',\n },\n nextPlan: {\n id: 'advertisements.subscription.comparison.next-plan',\n defaultMessage: 'Next option',\n description: 'Screen reader label for the arrow that shows the next column on small screens',\n },\n showPlan: {\n id: 'advertisements.subscription.comparison.show-plan',\n defaultMessage: 'Show {plan}',\n description: 'Screen reader label for the dot that shows one column on small screens. {plan} is the column name.',\n },\n notIncluded: {\n id: 'advertisements.subscription.not-included',\n defaultMessage: 'This course is not included in your subscription.',\n description: 'Note shown to subscribers on a course that is outside the subscription catalog',\n },\n});\n\nexport default messages;\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"messages.js","names":["_i18n","require","messages","defineMessages","subscribe","id","defaultMessage","description","purchase","purchaseNoPrice","upgradeNow","upgrading","upgradePending","upgradeNotActive","reactivateSubscription","upgradeFailed","cardHeader","benefitsHeader","featureColumn","buyColumn","subscribeColumn","pricePerInterval","featureFreeTrial","featureChangeCourses","featureCertificates","featureCertificatesLink","featureGradedAssignments","featureUnlimitedAccess","includedAlt","notIncludedAlt","brand","modalTitleFreeTrial","modalTitleLaunch","modalSubtitle","benefitCertificatesTitle","benefitCertificatesBody","benefitChangeCourseTitle","benefitChangeCourseBody","benefitChangeCourseBodyFreeTrial","benefitTrialTitle","benefitTrialBody","earnCertificateFor","continueToCheckout","cancelAnytime","comparisonTitle","comparisonSubtitle","buyCourseColumn","rowPrice","oneTimePurchase","rowEarnCertificates","certificatesUnlimited","certificatesOne","startFreeTrial","buyFor","previousPlan","nextPlan","showPlan","notIncluded","_default","exports","default"],"sources":["../../src/subscription-upsell/messages.js"],"sourcesContent":["import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n subscribe: {\n id: 'advertisements.subscription.subscribe',\n defaultMessage: 'Subscribe',\n description: 'Button that sends the learner to subscription checkout',\n },\n purchase: {\n id: 'advertisements.subscription.purchase',\n defaultMessage: 'Buy {price}',\n description: 'Button that sends the learner to one-time purchase checkout for this course. {price} is the formatted course price, for example $49.',\n },\n purchaseNoPrice: {\n id: 'advertisements.subscription.purchase-no-price',\n defaultMessage: 'Buy',\n description: 'Purchase button label when the course price is not known',\n },\n upgradeNow: {\n id: 'advertisements.subscription.upgrade-now',\n defaultMessage: 'Upgrade now',\n description: 'Button for a subscriber to unlock this course under their subscription',\n },\n upgrading: {\n id: 'advertisements.subscription.upgrading',\n defaultMessage: 'Upgrading…',\n description: 'Button label while the upgrade request is in progress',\n },\n upgradePending: {\n id: 'advertisements.subscription.upgrade-pending',\n defaultMessage: 'Your upgrade is being processed. This can take a moment.',\n description: 'Shown after the server accepted the upgrade but has not finished applying it',\n },\n upgradeNotActive: {\n id: 'advertisements.subscription.upgrade-not-active',\n defaultMessage: 'Your subscription is not active, so this course could not be upgraded.',\n description: 'Shown when the upgrade failed because the subscription is not active',\n },\n reactivateSubscription: {\n id: 'advertisements.subscription.reactivate',\n defaultMessage: 'Reactivate your subscription',\n description: 'Link to subscription checkout shown when the subscription is not active',\n },\n upgradeFailed: {\n id: 'advertisements.subscription.upgrade-failed',\n defaultMessage: 'We could not upgrade this course. Please try again.',\n description: 'Shown when the upgrade request failed for an unexpected reason',\n },\n cardHeader: {\n id: 'advertisements.subscription.card.header',\n defaultMessage: 'Make the most out of your learning',\n description: 'Header of the subscription upgrade card in the course sidebar',\n },\n benefitsHeader: {\n id: 'advertisements.subscription.card.benefits-header',\n defaultMessage: 'Upgrading can have huge benefits',\n description: 'Header above the Buy vs Subscribe comparison table',\n },\n featureColumn: {\n id: 'advertisements.subscription.card.feature-column',\n defaultMessage: 'Feature',\n description: 'Screen-reader-only header for the feature column of the comparison table',\n },\n buyColumn: {\n id: 'advertisements.subscription.card.buy-column',\n defaultMessage: 'Buy',\n description: 'Column header for the one-time purchase option',\n },\n subscribeColumn: {\n id: 'advertisements.subscription.card.subscribe-column',\n defaultMessage: 'Subscribe',\n description: 'Column header for the subscription option',\n },\n pricePerInterval: {\n id: 'advertisements.subscription.card.price-per-interval',\n defaultMessage: '{price}/{interval, select, month {month} year {year} other {{interval}}}',\n description: 'Subscription price with its billing interval, for example $59/month. interval is month or year.',\n },\n featureFreeTrial: {\n id: 'advertisements.subscription.card.feature.free-trial',\n defaultMessage: 'Free trial',\n description: 'Comparison row: a free trial is available',\n },\n featureChangeCourses: {\n id: 'advertisements.subscription.card.feature.change-courses',\n defaultMessage: 'Change courses for free',\n description: 'Comparison row: switch to other courses at no extra cost',\n },\n featureCertificates: {\n id: 'advertisements.subscription.card.feature.certificates',\n defaultMessage: 'Earn {certificateLink}',\n description: 'Comparison row: earn verified certificates. {certificateLink} is a link reading \"verified certificates\".',\n },\n featureCertificatesLink: {\n id: 'advertisements.subscription.card.feature.certificates-link',\n defaultMessage: 'verified certificates',\n description: 'Link text inside the earn certificates row',\n },\n featureGradedAssignments: {\n id: 'advertisements.subscription.card.feature.graded-assignments',\n defaultMessage: 'Complete graded assignments',\n description: 'Comparison row: access to graded assignments',\n },\n featureUnlimitedAccess: {\n id: 'advertisements.subscription.card.feature.unlimited-access',\n defaultMessage: 'Unlimited access to course materials',\n description: 'Comparison row: no access expiration',\n },\n includedAlt: {\n id: 'advertisements.subscription.card.included',\n defaultMessage: 'Included',\n description: 'Alt text for the check icon in the comparison table',\n },\n notIncludedAlt: {\n id: 'advertisements.subscription.card.not-included',\n defaultMessage: 'Not included',\n description: 'Alt text for the cross icon in the comparison table',\n },\n brand: {\n id: 'advertisements.subscription.brand',\n defaultMessage: 'edX Plus',\n description: 'Subscription product name shown above the pop-up title',\n },\n modalTitleFreeTrial: {\n id: 'advertisements.subscription.modal.title.free-trial',\n defaultMessage: 'Subscribe to start your free trial',\n description: 'Pop-up title when the learner is eligible for a free trial',\n },\n modalTitleLaunch: {\n id: 'advertisements.subscription.modal.title.launch',\n defaultMessage: 'Subscribe and upgrade this course',\n description: 'Pop-up title when there is no free trial to offer',\n },\n modalSubtitle: {\n id: 'advertisements.subscription.modal.subtitle',\n defaultMessage: 'Give your career a boost with flexible courses and new skills in your field.',\n description: 'Pop-up subtitle under the title',\n },\n benefitCertificatesTitle: {\n id: 'advertisements.subscription.modal.benefit.certificates.title',\n defaultMessage: 'Earn multiple certificates',\n description: 'Benefit title: unlimited certificates',\n },\n benefitCertificatesBody: {\n id: 'advertisements.subscription.modal.benefit.certificates.body',\n defaultMessage: 'There’s no limit to the certificates you can earn and add to your resume.',\n description: 'Benefit body: unlimited certificates',\n },\n benefitChangeCourseTitle: {\n id: 'advertisements.subscription.modal.benefit.change-course.title',\n defaultMessage: 'Change your course at any time',\n description: 'Benefit title: switch courses',\n },\n benefitChangeCourseBody: {\n id: 'advertisements.subscription.modal.benefit.change-course.body',\n defaultMessage: 'This subscription offers unlimited flexibility. Change topics or courses anytime.',\n description: 'Benefit body: switch courses',\n },\n benefitChangeCourseBodyFreeTrial: {\n id: 'advertisements.subscription.modal.benefit.change-course.body.free-trial',\n defaultMessage: 'Subscribers get verified access to hundreds of courses and programs',\n description: 'Benefit body: change course, free trial pop-up wording',\n },\n benefitTrialTitle: {\n id: 'advertisements.subscription.modal.benefit.trial.title',\n defaultMessage: 'Get your free trial',\n description: 'Benefit title: free trial',\n },\n benefitTrialBody: {\n id: 'advertisements.subscription.modal.benefit.trial.body',\n defaultMessage: 'Try it for free to see if a subscription is right for you.',\n description: 'Benefit body: free trial',\n },\n earnCertificateFor: {\n id: 'advertisements.subscription.modal.earn-certificate-for',\n defaultMessage: 'Earn certificate for {price}',\n description: 'Pop-up button for one-time purchase. {price} is the course price.',\n },\n continueToCheckout: {\n id: 'advertisements.subscription.modal.continue-to-checkout',\n defaultMessage: 'Continue to checkout',\n description: 'Pop-up button that goes to subscription checkout',\n },\n cancelAnytime: {\n id: 'advertisements.subscription.modal.cancel-anytime',\n defaultMessage: 'Cancel anytime',\n description: 'Small note under the checkout button in the free trial pop-up',\n },\n comparisonTitle: {\n id: 'advertisements.subscription.comparison.title',\n defaultMessage: 'Try our new subscription or upgrade to a certificate',\n description: 'Title of the Subscribe vs Buy comparison pop-up',\n },\n comparisonSubtitle: {\n id: 'advertisements.subscription.comparison.subtitle',\n defaultMessage: 'See what other learning paths have to offer to learn if upgrading is right for you.',\n description: 'Subtitle of the comparison pop-up',\n },\n buyCourseColumn: {\n id: 'advertisements.subscription.comparison.buy-course-column',\n defaultMessage: 'Buy course',\n description: 'Column header for the one-time purchase option in the comparison pop-up',\n },\n rowPrice: {\n id: 'advertisements.subscription.comparison.row.price',\n defaultMessage: 'Price',\n description: 'Comparison row header: price',\n },\n oneTimePurchase: {\n id: 'advertisements.subscription.comparison.one-time-purchase',\n defaultMessage: 'One-time purchase',\n description: 'Small print under the course price',\n },\n rowEarnCertificates: {\n id: 'advertisements.subscription.comparison.row.earn-certificates',\n defaultMessage: 'Earn certificates',\n description: 'Comparison row header: certificates',\n },\n certificatesUnlimited: {\n id: 'advertisements.subscription.comparison.certificates-unlimited',\n defaultMessage: 'Unlimited',\n description: 'Certificates cell for the subscription column',\n },\n certificatesOne: {\n id: 'advertisements.subscription.comparison.certificates-one',\n defaultMessage: '1 certificate',\n description: 'Certificates cell for the one-time purchase column',\n },\n startFreeTrial: {\n id: 'advertisements.subscription.comparison.start-free-trial',\n defaultMessage: 'Start free trial',\n description: 'Subscribe button when a free trial is available',\n },\n buyFor: {\n id: 'advertisements.subscription.comparison.buy-for',\n defaultMessage: 'Buy for {price}',\n description: 'Purchase button in the comparison pop-up. {price} is the course price.',\n },\n previousPlan: {\n id: 'advertisements.subscription.comparison.previous-plan',\n defaultMessage: 'Previous option',\n description: 'Screen reader label for the arrow that shows the previous column on small screens',\n },\n nextPlan: {\n id: 'advertisements.subscription.comparison.next-plan',\n defaultMessage: 'Next option',\n description: 'Screen reader label for the arrow that shows the next column on small screens',\n },\n showPlan: {\n id: 'advertisements.subscription.comparison.show-plan',\n defaultMessage: 'Show {plan}',\n description: 'Screen reader label for the dot that shows one column on small screens. {plan} is the column name.',\n },\n notIncluded: {\n id: 'advertisements.subscription.not-included',\n defaultMessage: 'This course is not included in your subscription.',\n description: 'Note shown to subscribers on a course that is outside the subscription catalog',\n },\n});\n\nexport default messages;\n"],"mappings":"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","ignoreList":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@edx/frontend-plugin-advertisements",
3
- "version": "2.29.0",
3
+ "version": "2.30.0",
4
4
  "description": "Frontend plugin for edX in course advertisements",
5
5
  "main": "dist/index.js",
6
6
  "repository": {