richie-education 2.29.2 → 2.29.3-dev48

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (127) hide show
  1. package/i18n/locales/ar-SA.json +193 -125
  2. package/i18n/locales/es-ES.json +193 -125
  3. package/i18n/locales/fa-IR.json +193 -125
  4. package/i18n/locales/fr-CA.json +193 -125
  5. package/i18n/locales/fr-FR.json +193 -125
  6. package/i18n/locales/ko-KR.json +193 -125
  7. package/i18n/locales/pt-PT.json +193 -125
  8. package/i18n/locales/ru-RU.json +193 -125
  9. package/i18n/locales/vi-VN.json +193 -125
  10. package/js/api/joanie.ts +42 -17
  11. package/js/api/lms/dummy.ts +1 -12
  12. package/js/components/ContractFrame/AbstractContractFrame.spec.tsx +16 -9
  13. package/js/components/ContractFrame/AbstractContractFrame.tsx +28 -23
  14. package/js/components/ContractFrame/LearnerContractFrame.tsx +2 -2
  15. package/js/components/ContractFrame/_styles.scss +6 -14
  16. package/js/components/ContractStatus/index.spec.tsx +1 -1
  17. package/js/components/ContractStatus/index.tsx +1 -1
  18. package/js/components/{SaleTunnel/CreditCardSelector → CreditCardSelector}/index.spec.tsx +15 -45
  19. package/js/components/{SaleTunnel/CreditCardSelector → CreditCardSelector}/index.tsx +19 -26
  20. package/js/components/DownloadContractButton/index.spec.tsx +1 -1
  21. package/js/components/Form/utils.ts +2 -1
  22. package/js/components/OpenEdxFullNameForm/index.spec.tsx +229 -0
  23. package/js/components/OpenEdxFullNameForm/index.tsx +7 -7
  24. package/js/components/PaymentInterfaces/LyraPopIn.tsx +2 -2
  25. package/js/components/PaymentInterfaces/PayplugLightbox.tsx +1 -1
  26. package/js/components/PaymentInterfaces/__mocks__/index.tsx +1 -4
  27. package/js/components/PaymentInterfaces/types.ts +5 -2
  28. package/js/components/PaymentScheduleGrid/_styles.scss +13 -0
  29. package/js/components/PaymentScheduleGrid/index.tsx +50 -70
  30. package/js/components/PurchaseButton/index.spec.tsx +84 -37
  31. package/js/components/PurchaseButton/index.tsx +9 -27
  32. package/js/components/SaleTunnel/AddressSelector/index.spec.tsx +2 -2
  33. package/js/components/SaleTunnel/CertificateSaleTunnel/index.tsx +2 -2
  34. package/js/components/SaleTunnel/CredentialSaleTunnel/index.tsx +6 -10
  35. package/js/components/SaleTunnel/GenericSaleTunnel.tsx +105 -48
  36. package/js/components/SaleTunnel/SaleTunnelInformation/index.tsx +16 -20
  37. package/js/components/SaleTunnel/SaleTunnelSavePaymentMethod/_styles.scss +12 -0
  38. package/js/components/SaleTunnel/SaleTunnelSavePaymentMethod/index.tsx +157 -0
  39. package/js/components/SaleTunnel/SaleTunnelSuccess/index.tsx +15 -29
  40. package/js/components/SaleTunnel/Sponsors/SaleTunnelSponsors.scss +4 -5
  41. package/js/components/SaleTunnel/Sponsors/SaleTunnelSponsors.tsx +39 -11
  42. package/js/components/SaleTunnel/SubscriptionButton/_styles.scss +7 -0
  43. package/js/components/SaleTunnel/SubscriptionButton/index.tsx +202 -0
  44. package/js/components/SaleTunnel/_styles.scss +16 -5
  45. package/js/components/SaleTunnel/hooks/useTerms.tsx +0 -77
  46. package/js/components/SaleTunnel/index.credential.spec.tsx +14 -25
  47. package/js/components/SaleTunnel/index.full-process.spec.tsx +114 -48
  48. package/js/components/SaleTunnel/index.spec.tsx +333 -717
  49. package/js/components/SaleTunnel/index.tsx +2 -1
  50. package/js/components/SignContractButton/index.omniscientOrders.spec.tsx +16 -11
  51. package/js/components/SignContractButton/index.spec.tsx +16 -20
  52. package/js/components/SignContractButton/index.tsx +3 -1
  53. package/js/hooks/useCreditCards/index.spec.tsx +70 -6
  54. package/js/hooks/useCreditCards/index.ts +49 -11
  55. package/js/hooks/useOrders/index.spec.tsx +322 -0
  56. package/js/hooks/{useOrders.ts → useOrders/index.ts} +40 -14
  57. package/js/hooks/usePaymentSchedule.tsx +23 -0
  58. package/js/hooks/useProductOrder/index.spec.tsx +77 -60
  59. package/js/hooks/useProductOrder/index.tsx +2 -2
  60. package/js/hooks/useResources/useResourcesRoot.ts +4 -3
  61. package/js/index.tsx +2 -0
  62. package/js/pages/DashboardCreditCardsManagement/CreditCardBrandLogo.spec.tsx +1 -1
  63. package/js/pages/DashboardCreditCardsManagement/CreditCardBrandLogo.tsx +4 -2
  64. package/js/pages/DashboardOrderLayout/index.spec.tsx +10 -1
  65. package/js/pages/TeacherDashboardContractsLayout/components/ContractActionsBar/index.spec.tsx +8 -5
  66. package/js/pages/TeacherDashboardContractsLayout/components/SignOrganizationContractButton/index.spec.tsx +8 -9
  67. package/js/pages/TeacherDashboardCourseLearnersLayout/components/CourseLearnerDataGrid/index.spec.tsx +1 -1
  68. package/js/pages/TeacherDashboardCourseLearnersLayout/components/CourseLearnerDataGrid/index.tsx +1 -6
  69. package/js/settings/settings.prod.ts +0 -2
  70. package/js/settings/settings.test.ts +16 -2
  71. package/js/translations/ar-SA.json +1 -1
  72. package/js/translations/es-ES.json +1 -1
  73. package/js/translations/fa-IR.json +1 -1
  74. package/js/translations/fr-CA.json +1 -1
  75. package/js/translations/fr-FR.json +1 -1
  76. package/js/translations/ko-KR.json +1 -1
  77. package/js/translations/pt-PT.json +1 -1
  78. package/js/translations/ru-RU.json +1 -1
  79. package/js/translations/vi-VN.json +1 -1
  80. package/js/types/Joanie.ts +81 -32
  81. package/js/utils/OrderHelper/index.ts +46 -38
  82. package/js/utils/PaymentScheduleHelper/index.spec.tsx +78 -0
  83. package/js/utils/PaymentScheduleHelper/index.ts +30 -0
  84. package/js/utils/ProductHelper/index.spec.ts +322 -166
  85. package/js/utils/ProductHelper/index.ts +32 -0
  86. package/js/utils/test/factories/joanie.ts +72 -69
  87. package/js/widgets/Dashboard/components/DashboardItem/Contract/index.spec.tsx +2 -2
  88. package/js/widgets/Dashboard/components/DashboardItem/CourseEnrolling/index.tsx +8 -18
  89. package/js/widgets/Dashboard/components/DashboardItem/Enrollment/DashboardItemEnrollment.spec.tsx +23 -0
  90. package/js/widgets/Dashboard/components/DashboardItem/Enrollment/DashboardItemEnrollment.tsx +23 -1
  91. package/js/widgets/Dashboard/components/DashboardItem/Enrollment/ProductCertificateFooter/index.spec.tsx +145 -34
  92. package/js/widgets/Dashboard/components/DashboardItem/Enrollment/ProductCertificateFooter/index.tsx +175 -37
  93. package/js/widgets/Dashboard/components/DashboardItem/Order/CertificateItem/index.tsx +51 -0
  94. package/js/widgets/Dashboard/components/DashboardItem/Order/ContractItem/index.tsx +52 -0
  95. package/js/widgets/Dashboard/components/DashboardItem/Order/DashboardItemNotResumable.spec.tsx +109 -0
  96. package/js/widgets/Dashboard/components/DashboardItem/Order/DashboardItemOrder.spec.tsx +219 -5
  97. package/js/widgets/Dashboard/components/DashboardItem/Order/DashboardItemOrder.tsx +111 -245
  98. package/js/widgets/Dashboard/components/DashboardItem/Order/DashboardItemOrderContract.spec.tsx +61 -8
  99. package/js/widgets/Dashboard/components/DashboardItem/Order/DashboardItemOrderContract.useUnionResource.cache.spec.tsx +17 -7
  100. package/js/widgets/Dashboard/components/DashboardItem/Order/DashboardItemSavePaymentMethod.spec.tsx +116 -0
  101. package/js/widgets/Dashboard/components/DashboardItem/Order/Installment/index.tsx +175 -0
  102. package/js/widgets/Dashboard/components/DashboardItem/Order/OrderPaymentDetailsModal/_styles.scss +7 -0
  103. package/js/widgets/Dashboard/components/DashboardItem/Order/OrderPaymentDetailsModal/index.tsx +127 -0
  104. package/js/widgets/Dashboard/components/DashboardItem/Order/OrderPaymentRetryModal/index.tsx +216 -0
  105. package/js/widgets/Dashboard/components/DashboardItem/Order/OrderStateLearnerMessage/index.spec.tsx +18 -71
  106. package/js/widgets/Dashboard/components/DashboardItem/Order/OrderStateLearnerMessage/index.tsx +40 -25
  107. package/js/widgets/Dashboard/components/DashboardItem/Order/OrderStateMessage/index.tsx +28 -22
  108. package/js/widgets/Dashboard/components/DashboardItem/Order/OrderStateTeacherMessage/index.spec.tsx +18 -73
  109. package/js/widgets/Dashboard/components/DashboardItem/Order/OrderStateTeacherMessage/index.tsx +32 -16
  110. package/js/widgets/Dashboard/components/DashboardItem/Order/OrganizationBlock/index.tsx +150 -0
  111. package/js/widgets/Dashboard/components/DashboardOrderLoader/index.tsx +32 -14
  112. package/js/widgets/Dashboard/components/Signature/SignatureDummy.tsx +25 -3
  113. package/js/widgets/SyllabusCourseRunsList/components/CourseProductItem/components/CourseProductCourseRuns/EnrollableCourseRunList.tsx +2 -6
  114. package/js/widgets/SyllabusCourseRunsList/components/CourseProductItem/components/CourseProductCourseRuns/index.spec.tsx +7 -14
  115. package/js/widgets/SyllabusCourseRunsList/components/CourseProductItem/components/CourseRunItem/index.spec.tsx +7 -5
  116. package/js/widgets/SyllabusCourseRunsList/components/CourseProductItem/components/CourseRunItem/index.tsx +5 -7
  117. package/js/widgets/SyllabusCourseRunsList/components/CourseProductItem/index.spec.tsx +242 -332
  118. package/js/widgets/SyllabusCourseRunsList/components/CourseProductItem/index.stories.tsx +12 -13
  119. package/js/widgets/SyllabusCourseRunsList/components/CourseProductItem/index.tsx +10 -21
  120. package/js/widgets/SyllabusCourseRunsList/components/CourseRunEnrollment/index.joanie.spec.tsx +2 -2
  121. package/package.json +45 -44
  122. package/scss/components/_index.scss +4 -2
  123. package/js/components/PaymentButton/_styles.scss +0 -27
  124. package/js/components/SaleTunnel/GenericPaymentButton/index.tsx +0 -340
  125. package/js/components/SaleTunnel/SaleTunnelNotValidated/index.tsx +0 -70
  126. package/js/widgets/SyllabusCourseRunsList/components/CourseProductItem/components/ProductSignatureHeader/index.tsx +0 -41
  127. /package/js/components/{SaleTunnel/CreditCardSelector → CreditCardSelector}/_styles.scss +0 -0
@@ -57,16 +57,7 @@ type Story = StoryObj<typeof CourseProductItem>;
57
57
 
58
58
  export const Default: Story = {};
59
59
 
60
- export const WithPendingOrder: Story = {
61
- args: {
62
- productId: 'AAA',
63
- course: PacedCourseFactory({ code: 'BBB' }).one(),
64
- },
65
- render: (args) =>
66
- render(args, { order: CredentialOrderFactory({ state: OrderState.PENDING }).one() }),
67
- };
68
-
69
- export const WithValidatedOrder: Story = {
60
+ export const WithCompletedOrder: Story = {
70
61
  args: {
71
62
  productId: 'AAA',
72
63
  course: PacedCourseFactory({ code: 'BBB' }).one(),
@@ -75,7 +66,7 @@ export const WithValidatedOrder: Story = {
75
66
  const courseRunWithEnrollment = CourseRunFactory().one();
76
67
  return render(args, {
77
68
  order: CredentialOrderFactory({
78
- state: OrderState.VALIDATED,
69
+ state: OrderState.COMPLETED,
79
70
  target_enrollments: EnrollmentFactory({
80
71
  is_active: true,
81
72
  course_run: courseRunWithEnrollment,
@@ -91,11 +82,19 @@ export const WithValidatedOrder: Story = {
91
82
  },
92
83
  };
93
84
 
94
- export const WithSubmittedOrder: Story = {
85
+ export const WithPendingOrder: Story = {
95
86
  args: {
96
87
  productId: 'AAA',
97
88
  course: PacedCourseFactory({ code: 'BBB' }).one(),
98
89
  },
99
90
  render: (args) =>
100
- render(args, { order: CredentialOrderFactory({ state: OrderState.SUBMITTED }).one() }),
91
+ render(args, { order: CredentialOrderFactory({ state: OrderState.PENDING }).one() }),
92
+ };
93
+
94
+ export const WithNoOrder: Story = {
95
+ args: {
96
+ productId: 'AAA',
97
+ course: PacedCourseFactory({ code: 'BBB' }).one(),
98
+ },
99
+ render: (args) => render(args),
101
100
  };
@@ -1,7 +1,7 @@
1
1
  import { Children, useEffect, useMemo } from 'react';
2
2
  import { defineMessages, FormattedMessage, FormattedNumber, useIntl } from 'react-intl';
3
3
  import c from 'classnames';
4
- import { ProductType, OrderState, Product, CredentialOrder } from 'types/Joanie';
4
+ import { ProductType, Product, CredentialOrder } from 'types/Joanie';
5
5
  import { useCourseProduct } from 'hooks/useCourseProducts';
6
6
  import { Spinner } from 'components/Spinner';
7
7
  import { Icon, IconTypeEnum } from 'components/Icon';
@@ -11,7 +11,6 @@ import { ProductHelper } from 'utils/ProductHelper';
11
11
  import useProductOrder from 'hooks/useProductOrder';
12
12
  import { OrderHelper } from 'utils/OrderHelper';
13
13
  import { handle } from 'utils/errors/handle';
14
- import { ProductSignatureHeader } from 'widgets/SyllabusCourseRunsList/components/CourseProductItem/components/ProductSignatureHeader';
15
14
  import { PacedCourse } from 'types';
16
15
  import CertificateItem from './components/CourseProductCertificateItem';
17
16
  import CourseRunItem from './components/CourseRunItem';
@@ -23,12 +22,6 @@ const messages = defineMessages({
23
22
  description: 'Message displayed when authenticated user owned the product',
24
23
  id: 'components.CourseProductItem.purchased',
25
24
  },
26
- pending: {
27
- defaultMessage: 'Pending',
28
- description:
29
- 'Message displayed when authenticated user has purchased the product but order is still pending',
30
- id: 'components.CourseProductItem.pending',
31
- },
32
25
  loading: {
33
26
  defaultMessage: 'Loading product information...',
34
27
  description:
@@ -64,10 +57,10 @@ const Header = ({ product, order, hasPurchased, canPurchase, compact }: HeaderPr
64
57
  const intl = useIntl();
65
58
  const formatDate = useDateFormat();
66
59
 
67
- // compact mode is available for product until they got a VALIDATED order.
60
+ // compact mode is available for product until they got an active order.
68
61
  const canShowMetadata = useMemo(() => {
69
- return compact && (!order || [OrderState.SUBMITTED, OrderState.PENDING].includes(order!.state));
70
- }, [compact, hasPurchased]);
62
+ return compact && (!order || canPurchase);
63
+ }, [compact, hasPurchased, canPurchase]);
71
64
 
72
65
  const [minDate, maxDate] = useMemo(() => {
73
66
  if (!canShowMetadata) return [undefined, undefined];
@@ -84,8 +77,7 @@ const Header = ({ product, order, hasPurchased, canPurchase, compact }: HeaderPr
84
77
  <div className="product-widget__header-main">
85
78
  <h3 className="product-widget__title">{product.title}</h3>
86
79
  <strong className="product-widget__price h6">
87
- {order?.state === OrderState.VALIDATED && <FormattedMessage {...messages.purchased} />}
88
- {order?.state === OrderState.SUBMITTED && <FormattedMessage {...messages.pending} />}
80
+ {hasPurchased && <FormattedMessage {...messages.purchased} />}
89
81
  {canPurchase && (
90
82
  <FormattedNumber
91
83
  currency={product.price_currency}
@@ -123,9 +115,6 @@ const Header = ({ product, order, hasPurchased, canPurchase, compact }: HeaderPr
123
115
  );
124
116
  };
125
117
  const Content = ({ product, order }: { product: Product; order?: CredentialOrder }) => {
126
- const needsSignature = order
127
- ? OrderHelper.orderNeedsSignature(order, product.contract_definition)
128
- : false;
129
118
  const targetCourses = useMemo(() => {
130
119
  if (order) {
131
120
  return order.target_courses;
@@ -140,10 +129,9 @@ const Content = ({ product, order }: { product: Product; order?: CredentialOrder
140
129
 
141
130
  return (
142
131
  <ol className="product-widget__content">
143
- {needsSignature && <ProductSignatureHeader order={order} />}
144
132
  {Children.toArray(
145
133
  targetCourses.map((target_course) => (
146
- <CourseRunItem targetCourse={target_course} order={order} product={product} />
134
+ <CourseRunItem targetCourse={target_course} order={order} />
147
135
  )),
148
136
  )}
149
137
  {product.certificate_definition && (
@@ -168,12 +156,13 @@ const CourseProductItem = ({ productId, course, compact = false }: CourseProduct
168
156
  });
169
157
 
170
158
  const order = productOrder as CredentialOrder;
171
- const canPurchase = !order || order.state === OrderState.PENDING;
172
- const hasPurchased = (order && order.state === OrderState.VALIDATED) ?? false;
159
+ const canPurchase = OrderHelper.isPurchasable(order);
160
+ const hasPurchased = OrderHelper.isActive(order);
161
+ const canEnroll = OrderHelper.allowEnrollment(order);
173
162
 
174
163
  const hasError = Boolean(productQueryStates.error);
175
164
  const isFetching = productQueryStates.fetching || orderQueryStates.fetching;
176
- const canShowContent = !compact || hasPurchased;
165
+ const canShowContent = !compact || canEnroll;
177
166
 
178
167
  useEffect(() => {
179
168
  if (product && product.type !== ProductType.CREDENTIAL) {
@@ -2,12 +2,12 @@ import { act, fireEvent, screen } from '@testing-library/react';
2
2
  import fetchMock from 'fetch-mock';
3
3
 
4
4
  import { faker } from '@faker-js/faker';
5
- import { Deferred } from 'utils/test/deferred';
6
- import { EnrollmentFactory as JoanieEnrollment } from 'utils/test/factories/joanie';
7
5
  import {
8
6
  CourseRunFactory,
9
7
  RichieContextFactory as mockRichieContextFactory,
10
8
  } from 'utils/test/factories/richie';
9
+ import { Deferred } from 'utils/test/deferred';
10
+ import { EnrollmentFactory as JoanieEnrollment } from 'utils/test/factories/joanie';
11
11
  import { HttpStatusCode } from 'utils/errors/HttpError';
12
12
  import { Priority } from 'types';
13
13
  import { setupJoanieSession } from 'utils/test/wrappers/JoanieAppWrapper';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "richie-education",
3
- "version": "2.29.2",
3
+ "version": "2.29.3-dev48",
4
4
  "description": "A CMS to build learning portals for Open Education",
5
5
  "main": "sandbox/manage.py",
6
6
  "scripts": {
@@ -41,72 +41,73 @@
41
41
  "@babel/core": "7.25.2",
42
42
  "@babel/plugin-syntax-dynamic-import": "7.8.3",
43
43
  "@babel/plugin-transform-modules-commonjs": "7.24.8",
44
- "@babel/preset-env": "7.25.3",
44
+ "@babel/preset-env": "7.25.4",
45
45
  "@babel/preset-react": "7.24.7",
46
46
  "@babel/preset-typescript": "7.24.7",
47
- "@faker-js/faker": "8.4.1",
47
+ "@faker-js/faker": "9.0.3",
48
48
  "@formatjs/cli": "6.2.12",
49
49
  "@formatjs/intl-relativetimeformat": "11.2.14",
50
50
  "@hookform/resolvers": "3.9.0",
51
51
  "@lyracom/embedded-form-glue": "1.4.2",
52
- "@openfun/cunningham-react": "2.9.3",
52
+ "@openfun/cunningham-react": "2.9.4",
53
53
  "@openfun/cunningham-tokens": "2.1.1",
54
- "@sentry/browser": "8.26.0",
55
- "@sentry/types": "8.26.0",
56
- "@storybook/addon-actions": "8.2.9",
57
- "@storybook/addon-essentials": "8.2.9",
58
- "@storybook/addon-interactions": "8.2.9",
59
- "@storybook/addon-links": "8.2.9",
60
- "@storybook/react": "8.2.9",
61
- "@storybook/react-webpack5": "8.2.9",
62
- "@storybook/test": "8.2.9",
63
- "@tanstack/query-core": "5.51.24",
64
- "@tanstack/query-sync-storage-persister": "5.51.24",
65
- "@tanstack/react-query": "5.51.24",
66
- "@tanstack/react-query-persist-client": "5.51.24",
54
+ "@sentry/browser": "8.32.0",
55
+ "@sentry/types": "8.32.0",
56
+ "@storybook/addon-actions": "8.3.4",
57
+ "@storybook/addon-essentials": "8.3.4",
58
+ "@storybook/addon-interactions": "8.3.4",
59
+ "@storybook/addon-links": "8.3.4",
60
+ "@storybook/react": "8.3.4",
61
+ "@storybook/react-webpack5": "8.3.4",
62
+ "@storybook/test": "8.3.4",
63
+ "@tanstack/query-core": "5.56.2",
64
+ "@tanstack/query-sync-storage-persister": "5.56.2",
65
+ "@tanstack/react-query": "5.56.2",
66
+ "@tanstack/react-query-devtools": "5.56.2",
67
+ "@tanstack/react-query-persist-client": "5.56.2",
67
68
  "@testing-library/dom": "10.4.0",
68
- "@testing-library/jest-dom": "6.4.8",
69
- "@testing-library/react": "16.0.0",
69
+ "@testing-library/jest-dom": "6.5.0",
70
+ "@testing-library/react": "16.0.1",
70
71
  "@testing-library/user-event": "14.5.2",
71
72
  "@types/fetch-mock": "7.3.8",
72
73
  "@types/iframe-resizer": "3.5.13",
73
- "@types/jest": "29.5.12",
74
+ "@types/jest": "29.5.13",
74
75
  "@types/js-cookie": "3.0.6",
75
76
  "@types/lodash-es": "4.17.12",
76
77
  "@types/node-fetch": "2.6.11",
77
78
  "@types/query-string": "6.3.0",
78
- "@types/react": "18.3.3",
79
+ "@types/react": "18.3.10",
79
80
  "@types/react-autosuggest": "10.1.11",
80
81
  "@types/react-dom": "18.3.0",
81
82
  "@types/react-modal": "3.16.3",
82
83
  "@types/uuid": "10.0.0",
83
- "@typescript-eslint/eslint-plugin": "8.1.0",
84
- "@typescript-eslint/parser": "8.1.0",
84
+ "@typescript-eslint/eslint-plugin": "8.7.0",
85
+ "@typescript-eslint/parser": "8.7.0",
85
86
  "babel-jest": "29.7.0",
86
- "babel-loader": "9.1.3",
87
+ "babel-loader": "9.2.1",
87
88
  "babel-plugin-react-intl": "8.2.25",
88
89
  "bootstrap": ">=4.6.0 <5",
89
90
  "classnames": "2.5.1",
90
91
  "cljs-merge": "1.1.1",
91
- "core-js": "3.38.0",
92
+ "core-js": "3.38.1",
92
93
  "downshift": "9.0.8",
93
94
  "eslint": ">=8.57.0 <9",
94
95
  "eslint-config-airbnb": "19.0.4",
95
96
  "eslint-config-airbnb-typescript": "18.0.0",
96
97
  "eslint-config-prettier": "9.1.0",
97
- "eslint-import-resolver-webpack": "0.13.8",
98
- "eslint-plugin-compat": "6.0.0",
99
- "eslint-plugin-formatjs": "4.13.3",
100
- "eslint-plugin-import": "2.29.1",
101
- "eslint-plugin-jsx-a11y": "6.9.0",
98
+ "eslint-import-resolver-webpack": "0.13.9",
99
+ "eslint-plugin-compat": "6.0.1",
100
+ "eslint-plugin-formatjs": "5.0.0",
101
+ "eslint-plugin-import": "2.30.0",
102
+ "eslint-plugin-jsx-a11y": "6.10.0",
102
103
  "eslint-plugin-prettier": "5.2.1",
103
- "eslint-plugin-react": "7.35.0",
104
+ "eslint-plugin-react": "7.37.0",
104
105
  "eslint-plugin-react-hooks": "4.6.2",
105
- "eslint-plugin-storybook": "0.8.0",
106
+ "eslint-plugin-storybook": "0.9.0",
106
107
  "fetch-mock": "<10",
107
108
  "file-loader": "6.2.0",
108
109
  "glob": "11.0.0",
109
- "i18n-iso-countries": "7.11.3",
110
+ "i18n-iso-countries": "7.12.0",
110
111
  "iframe-resizer": "<5",
111
112
  "intl-pluralrules": "2.0.1",
112
113
  "jest": "29.7.0",
@@ -114,25 +115,25 @@
114
115
  "js-cookie": "3.0.5",
115
116
  "lodash-es": "4.17.21",
116
117
  "mdn-polyfills": "5.20.0",
117
- "msw": "2.3.5",
118
+ "msw": "2.4.9",
118
119
  "node-fetch": ">2.6.6 <3",
119
- "nodemon": "3.1.4",
120
+ "nodemon": "3.1.7",
120
121
  "prettier": "3.3.3",
121
122
  "query-string": "9.1.0",
122
123
  "react": "18.3.1",
123
124
  "react-autosuggest": "10.1.0",
124
125
  "react-dom": "18.3.1",
125
- "react-hook-form": "7.52.2",
126
- "react-intl": "6.6.8",
126
+ "react-hook-form": "7.53.0",
127
+ "react-intl": "6.7.0",
127
128
  "react-modal": "3.16.1",
128
- "react-router-dom": "6.26.1",
129
- "sass": "1.77.8",
129
+ "react-router-dom": "6.26.2",
130
+ "sass": "1.79.4",
130
131
  "source-map-loader": "5.0.0",
131
- "storybook": "8.2.9",
132
+ "storybook": "8.3.4",
132
133
  "tsconfig-paths-webpack-plugin": "4.1.0",
133
- "typescript": "5.5.4",
134
+ "typescript": "5.6.2",
134
135
  "uuid": "10.0.0",
135
- "webpack": "5.93.0",
136
+ "webpack": "5.95.0",
136
137
  "webpack-cli": "5.1.4",
137
138
  "whatwg-fetch": "3.6.20",
138
139
  "xhr-mock": "2.5.1",
@@ -141,7 +142,7 @@
141
142
  },
142
143
  "resolutions": {
143
144
  "@testing-library/dom": "10.4.0",
144
- "@types/react": "18.3.3",
145
+ "@types/react": "18.3.10",
145
146
  "@types/react-dom": "18.3.0"
146
147
  },
147
148
  "msw": {
@@ -151,7 +152,7 @@
151
152
  "node": "20.11.0"
152
153
  },
153
154
  "devDependencies": {
154
- "@storybook/addon-mdx-gfm": "8.2.9",
155
+ "@storybook/addon-mdx-gfm": "8.3.4",
155
156
  "@storybook/addon-webpack5-compiler-babel": "3.0.3"
156
157
  }
157
158
  }
@@ -1,16 +1,17 @@
1
1
  @import '../../js/components/AddressesManagement/styles';
2
+ @import '../../js/components/CreditCardSelector/styles';
2
3
  @import '../../js/components/ContractFrame/styles';
3
4
  @import '../../js/components/Tabs/styles';
4
5
  @import '../../js/components/TeacherDashboardCourseList/styles';
5
6
  @import '../../js/components/Modal/styles';
6
- @import '../../js/components/PaymentButton/styles';
7
+ @import '../../js/components/SaleTunnel/SubscriptionButton/styles';
7
8
  @import '../../js/components/PaymentScheduleGrid/styles';
8
9
  @import '../../js/components/PurchaseButton/styles';
9
10
  @import '../../js/components/SaleTunnel/styles';
10
11
  @import '../../js/components/SaleTunnel/AddressSelector/styles';
11
- @import '../../js/components/SaleTunnel/CreditCardSelector/styles';
12
12
  @import '../../js/components/SaleTunnel/ProductPath/styles';
13
13
  @import '../../js/components/SaleTunnel/Sponsors/SaleTunnelSponsors';
14
+ @import '../../js/components/SaleTunnel/SaleTunnelSavePaymentMethod/styles';
14
15
  @import '../../js/components/SuccessIcon/styles';
15
16
  @import '../../js/components/WarningIcon/styles';
16
17
  @import '../../js/components/RegisteredAddress/styles';
@@ -32,6 +33,7 @@
32
33
  @import '../../js/widgets/Dashboard/components/DashboardCard/styles';
33
34
  @import '../../js/widgets/Dashboard/components/DashboardItem/Certificate/styles';
34
35
  @import '../../js/widgets/Dashboard/components/DashboardItem/Order/styles';
36
+ @import '../../js/widgets/Dashboard/components/DashboardItem/Order/OrderPaymentDetailsModal/styles';
35
37
  @import '../../js/widgets/Dashboard/components/DashboardItem/Contract/_styles';
36
38
  @import '../../js/widgets/Dashboard/components/DashboardItem/styles';
37
39
  @import '../../js/widgets/Dashboard/components/DashboardLayout/styles';
@@ -1,27 +0,0 @@
1
- .payment-button {
2
- text-align: center;
3
- display: flex;
4
- flex-direction: column;
5
- justify-content: center;
6
- align-items: center;
7
-
8
- &__error {
9
- color: r-color('firebrick6');
10
- margin-top: 0.5rem;
11
- margin-bottom: 0;
12
- }
13
-
14
- &__terms {
15
- button {
16
- color: $link-color;
17
- text-decoration: underline;
18
- background-color: transparent;
19
- border: none;
20
- padding: 0;
21
-
22
- &:hover {
23
- color: $link-hover-color;
24
- }
25
- }
26
- }
27
- }