@edx/frontend-app-subscription-manage 1.18.1 → 1.19.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (107) hide show
  1. package/dist/Main.js +8 -2
  2. package/dist/Main.js.map +1 -1
  3. package/dist/components/ActiveSubscription/ActiveSubscription.js +5 -5
  4. package/dist/components/ActiveSubscription/ActiveSubscription.js.map +1 -1
  5. package/dist/components/BecomeSubscriber/BecomeSubscriber.js +3 -3
  6. package/dist/components/BecomeSubscriber/BecomeSubscriber.js.map +1 -1
  7. package/dist/components/CancelConfirmation/CancelConfirmation.js +6 -6
  8. package/dist/components/CancelConfirmation/CancelConfirmation.js.map +1 -1
  9. package/dist/components/CancelSuccess/CancelSuccess.js +3 -3
  10. package/dist/components/CancelSuccess/CancelSuccess.js.map +1 -1
  11. package/dist/components/CanceledSubscription/CanceledSubscription.js +8 -9
  12. package/dist/components/CanceledSubscription/CanceledSubscription.js.map +1 -1
  13. package/dist/components/EnrolledCoursesList/EnrolledCoursesList.js +2 -2
  14. package/dist/components/EnrolledCoursesList/EnrolledCoursesList.js.map +1 -1
  15. package/dist/components/HelpFooter/HelpFooter.js +1 -1
  16. package/dist/components/HelpFooter/HelpFooter.js.map +1 -1
  17. package/dist/components/OrderHistory/OrderHistoryCard.d.ts +11 -0
  18. package/dist/components/OrderHistory/OrderHistoryCard.js +6 -0
  19. package/dist/components/OrderHistory/OrderHistoryCard.js.map +1 -0
  20. package/dist/components/OrderHistory/OrderHistoryDetails.d.ts +2 -0
  21. package/dist/components/OrderHistory/OrderHistoryDetails.js +120 -0
  22. package/dist/components/OrderHistory/OrderHistoryDetails.js.map +1 -0
  23. package/dist/components/OrderHistory/OrderList.d.ts +3 -0
  24. package/dist/components/OrderHistory/OrderList.js +13 -0
  25. package/dist/components/OrderHistory/OrderList.js.map +1 -0
  26. package/dist/components/OrderHistory/OrderPurchases.d.ts +4 -0
  27. package/dist/components/OrderHistory/OrderPurchases.js +44 -0
  28. package/dist/components/OrderHistory/OrderPurchases.js.map +1 -0
  29. package/dist/components/OrderHistory/ProgramItemsTable.d.ts +7 -0
  30. package/dist/components/OrderHistory/ProgramItemsTable.js +49 -0
  31. package/dist/components/OrderHistory/ProgramItemsTable.js.map +1 -0
  32. package/dist/components/OrderHistory/data/receiptRows.d.ts +17 -0
  33. package/dist/components/OrderHistory/data/receiptRows.js +16 -0
  34. package/dist/components/OrderHistory/data/receiptRows.js.map +1 -0
  35. package/dist/components/OrderHistory/messages.d.ts +118 -0
  36. package/dist/components/OrderHistory/messages.js +120 -0
  37. package/dist/components/OrderHistory/messages.js.map +1 -0
  38. package/dist/components/OrderHistoryHeader/OrderHistoryHeader.js +1 -1
  39. package/dist/components/OrderHistoryHeader/OrderHistoryHeader.js.map +1 -1
  40. package/dist/components/PaymentHistory/PaymentHistory.js +5 -5
  41. package/dist/components/PaymentHistory/PaymentHistory.js.map +1 -1
  42. package/dist/components/RefundNotice/RefundNotice.d.ts +3 -0
  43. package/dist/components/RefundNotice/RefundNotice.js +15 -0
  44. package/dist/components/RefundNotice/RefundNotice.js.map +1 -0
  45. package/dist/components/RefundNotice/messages.d.ts +18 -0
  46. package/dist/components/RefundNotice/messages.js +20 -0
  47. package/dist/components/RefundNotice/messages.js.map +1 -0
  48. package/dist/components/RenewSubscriptionModal/RenewSubscriptionModal.js +12 -12
  49. package/dist/components/RenewSubscriptionModal/RenewSubscriptionModal.js.map +1 -1
  50. package/dist/components/ResubscribeCard/ResubscribeCard.js +5 -5
  51. package/dist/components/ResubscribeCard/ResubscribeCard.js.map +1 -1
  52. package/dist/components/UpdatePaymentMethodModal/UpdatePaymentMethodModal.js +12 -12
  53. package/dist/components/UpdatePaymentMethodModal/UpdatePaymentMethodModal.js.map +1 -1
  54. package/dist/components/messages.d.ts +89 -99
  55. package/dist/components/messages.js +180 -190
  56. package/dist/components/messages.js.map +1 -1
  57. package/dist/constants.d.ts +7 -1
  58. package/dist/constants.js +7 -1
  59. package/dist/constants.js.map +1 -1
  60. package/dist/data/hooks/keys.d.ts +5 -0
  61. package/dist/data/hooks/keys.js +5 -0
  62. package/dist/data/hooks/keys.js.map +1 -1
  63. package/dist/data/hooks/useOrderHistoryQueries.d.ts +11 -0
  64. package/dist/data/hooks/useOrderHistoryQueries.js +30 -0
  65. package/dist/data/hooks/useOrderHistoryQueries.js.map +1 -0
  66. package/dist/data/services/orderHistory/orderHistory.d.ts +7 -0
  67. package/dist/data/services/orderHistory/orderHistory.js +40 -0
  68. package/dist/data/services/orderHistory/orderHistory.js.map +1 -0
  69. package/dist/data/services/segment/AnalyticsPageWrap.d.ts +9 -0
  70. package/dist/data/services/segment/AnalyticsPageWrap.js +14 -0
  71. package/dist/data/services/segment/AnalyticsPageWrap.js.map +1 -0
  72. package/dist/data/services/segment/index.js +4 -1
  73. package/dist/data/services/segment/index.js.map +1 -1
  74. package/dist/{manageSubscriptionPage → orderHistory}/CancelSubscriptionPage.js +4 -4
  75. package/dist/orderHistory/CancelSubscriptionPage.js.map +1 -0
  76. package/dist/{manageSubscriptionPage → orderHistory}/CancelSuccessPage.js +2 -2
  77. package/dist/orderHistory/CancelSuccessPage.js.map +1 -0
  78. package/dist/orderHistory/OrderHistoryPage.d.ts +3 -0
  79. package/dist/orderHistory/OrderHistoryPage.js +127 -0
  80. package/dist/orderHistory/OrderHistoryPage.js.map +1 -0
  81. package/dist/routes.d.ts +23 -2
  82. package/dist/routes.js +44 -19
  83. package/dist/routes.js.map +1 -1
  84. package/dist/style.scss +1 -1
  85. package/dist/styles/components/{manageSubscription.scss → orderHistory.scss} +60 -24
  86. package/dist/tracking/trackingContext.d.ts +1 -1
  87. package/dist/tracking/trackingContext.js +1 -1
  88. package/dist/tracking/trackingContext.js.map +1 -1
  89. package/dist/types.d.ts +55 -0
  90. package/dist/types.js.map +1 -1
  91. package/dist/utils/currency.d.ts +6 -0
  92. package/dist/utils/currency.js +6 -0
  93. package/dist/utils/currency.js.map +1 -0
  94. package/dist/utils/queries.d.ts +6 -0
  95. package/dist/utils/queries.js +12 -0
  96. package/dist/utils/queries.js.map +1 -1
  97. package/package.json +1 -1
  98. package/dist/components/SubscriptionTabs/SubscriptionTabs.d.ts +0 -8
  99. package/dist/components/SubscriptionTabs/SubscriptionTabs.js +0 -15
  100. package/dist/components/SubscriptionTabs/SubscriptionTabs.js.map +0 -1
  101. package/dist/manageSubscriptionPage/CancelSubscriptionPage.js.map +0 -1
  102. package/dist/manageSubscriptionPage/CancelSuccessPage.js.map +0 -1
  103. package/dist/manageSubscriptionPage/ManageSubscriptionPage.d.ts +0 -3
  104. package/dist/manageSubscriptionPage/ManageSubscriptionPage.js +0 -88
  105. package/dist/manageSubscriptionPage/ManageSubscriptionPage.js.map +0 -1
  106. /package/dist/{manageSubscriptionPage → orderHistory}/CancelSubscriptionPage.d.ts +0 -0
  107. /package/dist/{manageSubscriptionPage → orderHistory}/CancelSuccessPage.d.ts +0 -0
@@ -0,0 +1,120 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useMemo } from 'react';
3
+ import { useParams } from 'react-router-dom';
4
+ import { Alert, Breadcrumb, Container, Spinner } from '@openedx/paragon';
5
+ import { useIntl } from '@openedx/frontend-base';
6
+ import { ORDER_HISTORY_PATH } from '../../constants';
7
+ import getFormattedCurrency from '../../utils/currency';
8
+ import { useViaxClient, useViaxSession } from '../../data/hooks/useManageQueries';
9
+ import { useOrderDetailsQuery } from '../../data/hooks/useOrderHistoryQueries';
10
+ import messages from './messages';
11
+ import { getOrderSummaryRows, getOrderItemRows } from './data/receiptRows';
12
+ import { ProgramItemsTable } from './ProgramItemsTable';
13
+ const formatDate = (isoDate) => (new Date(isoDate).toLocaleDateString('en-US', {
14
+ month: 'short',
15
+ day: 'numeric',
16
+ year: 'numeric',
17
+ }));
18
+ const ReceiptRow = ({ label, children }) => (_jsxs("div", { className: "d-flex align-items-baseline mb-2", children: [_jsx("span", { className: "font-weight-bold text-gray-700", children: label }), _jsx("span", { className: "flex-grow-1 mx-2 text-gray-700", style: { borderBottom: '1px dotted #B4B1A8' } }), _jsx("span", { children: children })] }));
19
+ const normalizeDiscountCode = (value) => {
20
+ var _a;
21
+ if (!value) {
22
+ return null;
23
+ }
24
+ const cleaned = (_a = value.split(':')[0]) === null || _a === void 0 ? void 0 : _a.trim();
25
+ return cleaned || null;
26
+ };
27
+ const normalizeOrderDetails = (payload) => {
28
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0, _1, _2, _3, _4, _5, _6, _7;
29
+ if (!payload || typeof payload !== 'object') {
30
+ return null;
31
+ }
32
+ const order = (_a = payload.order) !== null && _a !== void 0 ? _a : payload;
33
+ if (!order || typeof order !== 'object') {
34
+ return null;
35
+ }
36
+ const totals = (_b = order.totals) !== null && _b !== void 0 ? _b : {
37
+ amount: (_c = order.amount) !== null && _c !== void 0 ? _c : 0,
38
+ currency: (_d = order.currency) !== null && _d !== void 0 ? _d : 'USD',
39
+ };
40
+ const currency = String((_h = (_g = (_f = (_e = order.pricing) === null || _e === void 0 ? void 0 : _e.total) === null || _f === void 0 ? void 0 : _f.currency) !== null && _g !== void 0 ? _g : totals.currency) !== null && _h !== void 0 ? _h : 'USD');
41
+ const money = (amount) => ({
42
+ amount: Number.isFinite(Number(amount)) ? Number(amount) : 0,
43
+ currency,
44
+ });
45
+ const discounts = Array.isArray((_j = order.pricing) === null || _j === void 0 ? void 0 : _j.discounts) ? order.pricing.discounts : null;
46
+ const discountTotal = discounts
47
+ ? discounts.reduce((sum, item) => { var _a; return sum + Number((_a = item === null || item === void 0 ? void 0 : item.amount) !== null && _a !== void 0 ? _a : 0); }, 0)
48
+ : Number((_m = (_l = (_k = order.totals) === null || _k === void 0 ? void 0 : _k.discount) !== null && _l !== void 0 ? _l : order.discount) !== null && _m !== void 0 ? _m : 0);
49
+ const firstDiscount = discounts === null || discounts === void 0 ? void 0 : discounts[0];
50
+ const discountCode = normalizeDiscountCode((_q = (_p = (_o = firstDiscount === null || firstDiscount === void 0 ? void 0 : firstDiscount.code) !== null && _o !== void 0 ? _o : firstDiscount === null || firstDiscount === void 0 ? void 0 : firstDiscount.offerId) !== null && _p !== void 0 ? _p : order.discountCode) !== null && _q !== void 0 ? _q : null);
51
+ const firstItem = Array.isArray(order.items) ? order.items[0] : null;
52
+ const item = firstItem !== null && firstItem !== void 0 ? firstItem : (Array.isArray(order.lines) ? order.lines[0] : null);
53
+ const itemName = String((_u = (_t = (_s = (_r = item === null || item === void 0 ? void 0 : item.name) !== null && _r !== void 0 ? _r : item === null || item === void 0 ? void 0 : item.productName) !== null && _s !== void 0 ? _s : item === null || item === void 0 ? void 0 : item.title) !== null && _t !== void 0 ? _t : order.name) !== null && _u !== void 0 ? _u : 'Order');
54
+ const base = {
55
+ orderId: String((_v = order.orderId) !== null && _v !== void 0 ? _v : ''),
56
+ orderNumber: String((_w = order.orderNumber) !== null && _w !== void 0 ? _w : ''),
57
+ purchasedAt: String((_z = (_y = (_x = order.purchasedAt) !== null && _x !== void 0 ? _x : order.placedAt) !== null && _y !== void 0 ? _y : order.createdAt) !== null && _z !== void 0 ? _z : new Date().toISOString()),
58
+ paymentIntentId: String((_0 = order.paymentIntentId) !== null && _0 !== void 0 ? _0 : ''),
59
+ subtotalAmount: money((_2 = (_1 = order.pricing) === null || _1 === void 0 ? void 0 : _1.subtotal) === null || _2 === void 0 ? void 0 : _2.amount),
60
+ itemPriceAmount: money((_3 = item === null || item === void 0 ? void 0 : item.price) === null || _3 === void 0 ? void 0 : _3.amount),
61
+ discountCode,
62
+ total: money((_6 = (_5 = (_4 = order.pricing) === null || _4 === void 0 ? void 0 : _4.total) === null || _5 === void 0 ? void 0 : _5.amount) !== null && _6 !== void 0 ? _6 : totals.paid),
63
+ discountAmount: money(discountTotal),
64
+ };
65
+ if ((firstItem === null || firstItem === void 0 ? void 0 : firstItem.kind) === 'program') {
66
+ const programCourses = Array.isArray(firstItem.courses) ? firstItem.courses : [];
67
+ return Object.assign(Object.assign({}, base), { name: String((_7 = firstItem.name) !== null && _7 !== void 0 ? _7 : itemName), itemType: 'program', items: programCourses.map((entry) => {
68
+ var _a, _b, _c, _d;
69
+ return ({
70
+ productId: entry.productId,
71
+ courseRunKey: entry.courseRunKey,
72
+ name: (_a = entry.name) !== null && _a !== void 0 ? _a : itemName,
73
+ price: (_b = entry.price) !== null && _b !== void 0 ? _b : money(entry.amount),
74
+ discount: (_c = entry.discount) !== null && _c !== void 0 ? _c : money(0),
75
+ total: (_d = entry.total) !== null && _d !== void 0 ? _d : money(entry.amount),
76
+ });
77
+ }) });
78
+ }
79
+ return Object.assign(Object.assign({}, base), { name: itemName, itemType: 'course' });
80
+ };
81
+ const OrderReceipt = ({ order }) => {
82
+ var _a, _b, _c, _d, _e;
83
+ const { formatMessage } = useIntl();
84
+ const orderDate = formatDate(order.purchasedAt);
85
+ const subtotal = getFormattedCurrency((_a = order.subtotalAmount) !== null && _a !== void 0 ? _a : order.total);
86
+ const itemPrice = getFormattedCurrency((_b = order.itemPriceAmount) !== null && _b !== void 0 ? _b : order.total);
87
+ const total = getFormattedCurrency(order.total);
88
+ const discountValue = (_c = order.discountAmount) !== null && _c !== void 0 ? _c : { amount: 0, currency: order.total.currency };
89
+ const discountAmount = getFormattedCurrency({
90
+ amount: -Math.abs(discountValue.amount) || 0,
91
+ currency: discountValue.currency,
92
+ });
93
+ const orderSummaryRows = getOrderSummaryRows(order, orderDate, subtotal, total, discountAmount, (_d = order.discountCode) !== null && _d !== void 0 ? _d : '');
94
+ const orderItemRows = getOrderItemRows(order, itemPrice, total, discountAmount);
95
+ const renderRows = (rows) => rows.map(({ label, value }) => (_jsx(ReceiptRow, { label: formatMessage(label), children: value }, label.id)));
96
+ return (_jsxs(_Fragment, { children: [_jsx("div", { className: "my-2", children: _jsx(Breadcrumb, { ariaLabel: "breadcrumb", links: [{ label: formatMessage(messages.orderHistoryTitle), href: `${ORDER_HISTORY_PATH}?tab=payment-history` }], activeLabel: `${formatMessage(messages.orderDateTitle)}: ${orderDate}` }) }), _jsxs("h1", { className: "h1 mb-4 mt-4 text-primary-500 orderHistoryTitle", children: [formatMessage(messages.orderDateTitle), ": ", orderDate] }), _jsx("h3", { className: "h3 font-weight-bold mb-3 text-primary-500", children: formatMessage(messages.orderSummaryTitle) }), renderRows(orderSummaryRows), _jsx("hr", { className: "my-4 divider" }), _jsx("h3", { className: "font-weight-bold mb-3 text-primary-500", children: formatMessage(messages.orderItemsTitle) }), order.itemType === 'program' ? (_jsxs(_Fragment, { children: [_jsxs("div", { className: "mb-2 text-gray-700 mb-1", children: [_jsx("span", { className: "font-weight-bold", children: formatMessage(messages.receiptNameLabel) }), ' ', _jsx("span", { children: order.name })] }), _jsx(ProgramItemsTable, { items: (_e = order.items) !== null && _e !== void 0 ? _e : [], currency: order.total.currency })] })) : renderRows(orderItemRows), _jsx("hr", { className: "my-4 divider" }), _jsx("h3", { className: "font-weight-bold mb-3 text-primary-500", children: formatMessage(messages.paymentTitle) }), _jsx(ReceiptRow, { label: formatMessage(messages.receiptAmountLabel), children: total })] }));
97
+ };
98
+ const OrderHistoryDetails = () => {
99
+ const { formatMessage } = useIntl();
100
+ const { orderNumber } = useParams();
101
+ const client = useViaxClient();
102
+ const { sessionReady } = useViaxSession(client);
103
+ const orderDetailsQuery = useOrderDetailsQuery(client, orderNumber !== null && orderNumber !== void 0 ? orderNumber : null, sessionReady);
104
+ const order = useMemo(() => normalizeOrderDetails(orderDetailsQuery.data), [orderDetailsQuery.data]);
105
+ let content;
106
+ if (orderDetailsQuery.isError) {
107
+ content = _jsx(Alert, { variant: "danger", children: formatMessage(messages.purchaseHistoryError) });
108
+ }
109
+ else if (!orderDetailsQuery.isSuccess) {
110
+ content = (_jsx("div", { className: "d-flex justify-content-center py-4", children: _jsx(Spinner, { animation: "border", screenReaderText: formatMessage(messages.loadingOrders) }) }));
111
+ }
112
+ else {
113
+ content = order
114
+ ? _jsx(OrderReceipt, { order: order })
115
+ : _jsx(Alert, { variant: "warning", children: formatMessage(messages.orderNotFound) });
116
+ }
117
+ return (_jsx(Container, { fluid: true, size: "xl", className: "py-4 orderHistory", children: content }));
118
+ };
119
+ export default OrderHistoryDetails;
120
+ //# sourceMappingURL=OrderHistoryDetails.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OrderHistoryDetails.js","sourceRoot":"","sources":["../../../src/components/OrderHistory/OrderHistoryDetails.tsx"],"names":[],"mappings":"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","sourcesContent":["import type { ReactNode } from 'react';\nimport { useMemo } from 'react';\nimport { useParams } from 'react-router-dom';\nimport { Alert, Breadcrumb, Container, Spinner } from '@openedx/paragon';\nimport { useIntl } from '@openedx/frontend-base';\n\nimport type { MoneyAmount, OrderDetailsData } from '../../types';\nimport { ORDER_HISTORY_PATH } from '../../constants';\nimport getFormattedCurrency from '../../utils/currency';\nimport { useViaxClient, useViaxSession } from '../../data/hooks/useManageQueries';\nimport { useOrderDetailsQuery } from '../../data/hooks/useOrderHistoryQueries';\nimport messages from './messages';\nimport { getOrderSummaryRows, getOrderItemRows } from './data/receiptRows';\nimport { ProgramItemsTable } from './ProgramItemsTable';\n\nconst formatDate = (isoDate: string) => (\n new Date(isoDate).toLocaleDateString('en-US', {\n month: 'short',\n day: 'numeric',\n year: 'numeric',\n })\n);\n\ninterface ReceiptRowProps {\n label: string,\n children: ReactNode,\n}\n\nconst ReceiptRow = ({ label, children }: ReceiptRowProps) => (\n <div className=\"d-flex align-items-baseline mb-2\">\n <span className=\"font-weight-bold text-gray-700\">{label}</span>\n <span\n className=\"flex-grow-1 mx-2 text-gray-700\"\n style={{ borderBottom: '1px dotted #B4B1A8' }}\n />\n <span>{children}</span>\n </div>\n);\n\nconst normalizeDiscountCode = (value?: string | null): string | null => {\n if (!value) {\n return null;\n }\n\n const cleaned = value.split(':')[0]?.trim();\n return cleaned || null;\n};\n\nconst normalizeOrderDetails = (payload: any): OrderDetailsData | null => {\n if (!payload || typeof payload !== 'object') {\n return null;\n }\n\n const order = payload.order ?? payload;\n if (!order || typeof order !== 'object') {\n return null;\n }\n\n const totals = order.totals ?? {\n amount: order.amount ?? 0,\n currency: order.currency ?? 'USD',\n };\n const currency = String(order.pricing?.total?.currency ?? totals.currency ?? 'USD');\n const money = (amount: unknown): MoneyAmount => ({\n amount: Number.isFinite(Number(amount)) ? Number(amount) : 0,\n currency,\n });\n\n const discounts: any[] | null = Array.isArray(order.pricing?.discounts) ? order.pricing.discounts : null;\n const discountTotal = discounts\n ? discounts.reduce((sum, item) => sum + Number(item?.amount ?? 0), 0)\n : Number(order.totals?.discount ?? order.discount ?? 0);\n const firstDiscount = discounts?.[0];\n const discountCode = normalizeDiscountCode(\n firstDiscount?.code ?? firstDiscount?.offerId ?? order.discountCode ?? null,\n );\n\n const firstItem = Array.isArray(order.items) ? order.items[0] : null;\n const item = firstItem ?? (Array.isArray(order.lines) ? order.lines[0] : null);\n const itemName = String(item?.name ?? item?.productName ?? item?.title ?? order.name ?? 'Order');\n\n const base = {\n orderId: String(order.orderId ?? ''),\n orderNumber: String(order.orderNumber ?? ''),\n purchasedAt: String(order.purchasedAt ?? order.placedAt ?? order.createdAt ?? new Date().toISOString()),\n paymentIntentId: String(order.paymentIntentId ?? ''),\n subtotalAmount: money(order.pricing?.subtotal?.amount),\n itemPriceAmount: money(item?.price?.amount),\n discountCode,\n total: money(order.pricing?.total?.amount ?? totals.paid),\n discountAmount: money(discountTotal),\n };\n\n if (firstItem?.kind === 'program') {\n const programCourses: any[] = Array.isArray(firstItem.courses) ? firstItem.courses : [];\n\n return {\n ...base,\n name: String(firstItem.name ?? itemName),\n itemType: 'program',\n items: programCourses.map((entry) => ({\n productId: entry.productId,\n courseRunKey: entry.courseRunKey,\n name: entry.name ?? itemName,\n price: entry.price ?? money(entry.amount),\n discount: entry.discount ?? money(0),\n total: entry.total ?? money(entry.amount),\n })),\n };\n }\n\n return { ...base, name: itemName, itemType: 'course' };\n};\n\nconst OrderReceipt = ({ order }: { order: OrderDetailsData }) => {\n const { formatMessage } = useIntl();\n const orderDate = formatDate(order.purchasedAt);\n const subtotal = getFormattedCurrency(order.subtotalAmount ?? order.total);\n const itemPrice = getFormattedCurrency(order.itemPriceAmount ?? order.total);\n const total = getFormattedCurrency(order.total);\n const discountValue = order.discountAmount ?? { amount: 0, currency: order.total.currency };\n const discountAmount = getFormattedCurrency({\n amount: -Math.abs(discountValue.amount) || 0,\n currency: discountValue.currency,\n });\n\n const orderSummaryRows = getOrderSummaryRows(\n order,\n orderDate,\n subtotal,\n total,\n discountAmount,\n order.discountCode ?? '',\n );\n const orderItemRows = getOrderItemRows(order, itemPrice, total, discountAmount);\n\n const renderRows = (rows: typeof orderSummaryRows | typeof orderItemRows) =>\n rows.map(({ label, value }) => (\n <ReceiptRow key={label.id} label={formatMessage(label)}>\n {value}\n </ReceiptRow>\n ));\n\n return (\n <>\n <div className=\"my-2\">\n <Breadcrumb\n ariaLabel=\"breadcrumb\"\n links={[{ label: formatMessage(messages.orderHistoryTitle), href: `${ORDER_HISTORY_PATH}?tab=payment-history` }]}\n activeLabel={`${formatMessage(messages.orderDateTitle)}: ${orderDate}`}\n />\n </div>\n <h1 className=\"h1 mb-4 mt-4 text-primary-500 orderHistoryTitle\">\n {formatMessage(messages.orderDateTitle)}: {orderDate}\n </h1>\n\n <h3 className=\"h3 font-weight-bold mb-3 text-primary-500\">\n {formatMessage(messages.orderSummaryTitle)}\n </h3>\n {renderRows(orderSummaryRows)}\n\n <hr className=\"my-4 divider\" />\n\n <h3 className=\"font-weight-bold mb-3 text-primary-500\">\n {formatMessage(messages.orderItemsTitle)}\n </h3>\n {order.itemType === 'program' ? (\n <>\n <div className=\"mb-2 text-gray-700 mb-1\">\n <span className=\"font-weight-bold\">{formatMessage(messages.receiptNameLabel)}</span>{' '}\n <span>{order.name}</span>\n </div>\n <ProgramItemsTable items={order.items ?? []} currency={order.total.currency} />\n </>\n ) : renderRows(orderItemRows)}\n\n <hr className=\"my-4 divider\" />\n\n <h3 className=\"font-weight-bold mb-3 text-primary-500\">\n {formatMessage(messages.paymentTitle)}\n </h3>\n <ReceiptRow label={formatMessage(messages.receiptAmountLabel)}>\n {total}\n </ReceiptRow>\n </>\n );\n};\n\nconst OrderHistoryDetails = () => {\n const { formatMessage } = useIntl();\n const { orderNumber } = useParams<{ orderNumber: string }>();\n const client = useViaxClient();\n const { sessionReady } = useViaxSession(client);\n const orderDetailsQuery = useOrderDetailsQuery(client, orderNumber ?? null, sessionReady);\n const order = useMemo(() => normalizeOrderDetails(orderDetailsQuery.data), [orderDetailsQuery.data]);\n\n let content: ReactNode;\n if (orderDetailsQuery.isError) {\n content = <Alert variant=\"danger\">{formatMessage(messages.purchaseHistoryError)}</Alert>;\n } else if (!orderDetailsQuery.isSuccess) {\n content = (\n <div className=\"d-flex justify-content-center py-4\">\n <Spinner animation=\"border\" screenReaderText={formatMessage(messages.loadingOrders)} />\n </div>\n );\n } else {\n content = order\n ? <OrderReceipt order={order} />\n : <Alert variant=\"warning\">{formatMessage(messages.orderNotFound)}</Alert>;\n }\n\n return (\n <Container fluid size=\"xl\" className=\"py-4 orderHistory\">\n {content}\n </Container>\n );\n};\n\nexport default OrderHistoryDetails;\n"]}
@@ -0,0 +1,3 @@
1
+ import type { OrdersListProps } from '../../types';
2
+ declare const OrdersList: ({ orders, onViewReceipt }: OrdersListProps) => import("react/jsx-runtime").JSX.Element;
3
+ export default OrdersList;
@@ -0,0 +1,13 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { useNavigate } from 'react-router-dom';
3
+ import getFormattedCurrency from '../../utils/currency';
4
+ import { ORDER_DETAILS_PATH } from '../../constants';
5
+ import OrderHistoryCard from './OrderHistoryCard';
6
+ const OrdersList = ({ orders, onViewReceipt }) => {
7
+ const navigate = useNavigate();
8
+ return (_jsx("div", { children: orders.map((order) => (_jsx("div", { className: "mb-3", children: _jsx(OrderHistoryCard, { title: order.name, purchaseDate: new Date(order.purchasedAt).toLocaleDateString('en-US'), totalCost: getFormattedCurrency(order.total), orderNumber: order.orderNumber,
9
+ // TODO: Enable when paymentMethodType is in the API response.
10
+ isReceiptDisabled: false, onViewReceipt: () => onViewReceipt === null || onViewReceipt === void 0 ? void 0 : onViewReceipt(order), onViewOrderDetails: () => navigate(`${ORDER_DETAILS_PATH}/${encodeURIComponent(order.orderNumber)}`) }) }, order.orderId))) }));
11
+ };
12
+ export default OrdersList;
13
+ //# sourceMappingURL=OrderList.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OrderList.js","sourceRoot":"","sources":["../../../src/components/OrderHistory/OrderList.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,OAAO,oBAAoB,MAAM,sBAAsB,CAAC;AAExD,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,gBAAgB,MAAM,oBAAoB,CAAC;AAElD,MAAM,UAAU,GAAG,CAAC,EAAE,MAAM,EAAE,aAAa,EAAmB,EAAE,EAAE;IAChE,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAE/B,OAAO,CACL,wBACG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CACrB,cAAyB,SAAS,EAAC,MAAM,YACvC,KAAC,gBAAgB,IACf,KAAK,EAAE,KAAK,CAAC,IAAI,EACjB,YAAY,EAAE,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,kBAAkB,CAAC,OAAO,CAAC,EACrE,SAAS,EAAE,oBAAoB,CAAC,KAAK,CAAC,KAAK,CAAC,EAC5C,WAAW,EAAE,KAAK,CAAC,WAAW;gBAC9B,8DAA8D;gBAC9D,iBAAiB,EAAE,KAAK,EACxB,aAAa,EAAE,GAAG,EAAE,CAAC,aAAa,aAAb,aAAa,uBAAb,aAAa,CAAG,KAAK,CAAC,EAC3C,kBAAkB,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,GAAG,kBAAkB,IAAI,kBAAkB,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC,GACpG,IAVM,KAAK,CAAC,OAAO,CAWjB,CACP,CAAC,GACE,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,UAAU,CAAC","sourcesContent":["import { useNavigate } from 'react-router-dom';\n\nimport getFormattedCurrency from '../../utils/currency';\nimport type { OrdersListProps } from '../../types';\nimport { ORDER_DETAILS_PATH } from '../../constants';\nimport OrderHistoryCard from './OrderHistoryCard';\n\nconst OrdersList = ({ orders, onViewReceipt }: OrdersListProps) => {\n const navigate = useNavigate();\n\n return (\n <div>\n {orders.map((order) => (\n <div key={order.orderId} className=\"mb-3\">\n <OrderHistoryCard\n title={order.name}\n purchaseDate={new Date(order.purchasedAt).toLocaleDateString('en-US')}\n totalCost={getFormattedCurrency(order.total)}\n orderNumber={order.orderNumber}\n // TODO: Enable when paymentMethodType is in the API response.\n isReceiptDisabled={false}\n onViewReceipt={() => onViewReceipt?.(order)}\n onViewOrderDetails={() => navigate(`${ORDER_DETAILS_PATH}/${encodeURIComponent(order.orderNumber)}`)}\n />\n </div>\n ))}\n </div>\n );\n};\n\nexport default OrdersList;\n"]}
@@ -0,0 +1,4 @@
1
+ import React from 'react';
2
+ /** One-off course and program purchases, shown in the payment history tab. */
3
+ declare const OrderPurchases: React.FC;
4
+ export default OrderPurchases;
@@ -0,0 +1,44 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
11
+ import { Alert, Spinner } from '@openedx/paragon';
12
+ import { useIntl } from '@openedx/frontend-base';
13
+ import { getStripePaymentReceipt } from '../../data/services/orderHistory/orderHistory';
14
+ import { usePurchaseHistoryQuery } from '../../data/hooks/useOrderHistoryQueries';
15
+ import { useViaxClient, useViaxSession } from '../../data/hooks/useManageQueries';
16
+ import OrdersList from './OrderList';
17
+ import RefundNotice from '../RefundNotice/RefundNotice';
18
+ import messages from './messages';
19
+ /** One-off course and program purchases, shown in the payment history tab. */
20
+ const OrderPurchases = () => {
21
+ var _a;
22
+ const { formatMessage } = useIntl();
23
+ const client = useViaxClient();
24
+ const { sessionReady } = useViaxSession(client);
25
+ const purchaseHistoryQuery = usePurchaseHistoryQuery(client, sessionReady);
26
+ const orders = (_a = purchaseHistoryQuery.data) !== null && _a !== void 0 ? _a : [];
27
+ const handleViewReceipt = (order) => __awaiter(void 0, void 0, void 0, function* () {
28
+ if (!client || !order.orderId) {
29
+ return;
30
+ }
31
+ try {
32
+ const receiptUrl = yield getStripePaymentReceipt(client.gql, order.orderId);
33
+ if (receiptUrl) {
34
+ window.open(receiptUrl, '_blank', 'noopener,noreferrer');
35
+ }
36
+ }
37
+ catch (error) {
38
+ console.error('Unable to load payment receipt.', error);
39
+ }
40
+ });
41
+ return (_jsxs("section", { className: "manage-section mt-5", "aria-labelledby": "order-purchases-title", children: [_jsx("h2", { id: "order-purchases-title", className: "manage-section__title h3 font-weight-bold text-primary-500 mb-1", children: formatMessage(messages.otherPurchasesTitle) }), purchaseHistoryQuery.isError && (_jsx(Alert, { variant: "danger", children: formatMessage(messages.purchaseHistoryError) })), !purchaseHistoryQuery.isError && !purchaseHistoryQuery.isSuccess && (_jsx("div", { className: "d-flex justify-content-center py-4", children: _jsx(Spinner, { animation: "border", screenReaderText: formatMessage(messages.loadingOrders) }) })), purchaseHistoryQuery.isSuccess && orders.length === 0 && (_jsx("p", { className: "manage-section__subtitle text-gray-700 mb-3", children: formatMessage(messages.coursePurchasesEmptyMessage) })), purchaseHistoryQuery.isSuccess && orders.length > 0 && (_jsxs(_Fragment, { children: [_jsx(OrdersList, { orders: orders, onViewReceipt: handleViewReceipt }), _jsx(RefundNotice, {})] }))] }));
42
+ };
43
+ export default OrderPurchases;
44
+ //# sourceMappingURL=OrderPurchases.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OrderPurchases.js","sourceRoot":"","sources":["../../../src/components/OrderHistory/OrderPurchases.tsx"],"names":[],"mappings":";;;;;;;;;;AACA,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAGjD,OAAO,EAAE,uBAAuB,EAAE,MAAM,+CAA+C,CAAC;AACxF,OAAO,EAAE,uBAAuB,EAAE,MAAM,yCAAyC,CAAC;AAClF,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AAClF,OAAO,UAAU,MAAM,aAAa,CAAC;AACrC,OAAO,YAAY,MAAM,8BAA8B,CAAC;AACxD,OAAO,QAAQ,MAAM,YAAY,CAAC;AAElC,8EAA8E;AAC9E,MAAM,cAAc,GAAa,GAAG,EAAE;;IACpC,MAAM,EAAE,aAAa,EAAE,GAAG,OAAO,EAAE,CAAC;IACpC,MAAM,MAAM,GAAG,aAAa,EAAE,CAAC;IAC/B,MAAM,EAAE,YAAY,EAAE,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IAChD,MAAM,oBAAoB,GAAG,uBAAuB,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAC3E,MAAM,MAAM,GAAG,MAAA,oBAAoB,CAAC,IAAI,mCAAI,EAAE,CAAC;IAE/C,MAAM,iBAAiB,GAAG,CAAO,KAA0B,EAAE,EAAE;QAC7D,IAAI,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;YAC9B,OAAO;QACT,CAAC;QAED,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,MAAM,uBAAuB,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;YAC5E,IAAI,UAAU,EAAE,CAAC;gBACf,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,EAAE,qBAAqB,CAAC,CAAC;YAC3D,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,iCAAiC,EAAE,KAAK,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC,CAAA,CAAC;IAEF,OAAO,CACL,mBAAS,SAAS,EAAC,qBAAqB,qBAAiB,uBAAuB,aAC9E,aAAI,EAAE,EAAC,uBAAuB,EAAC,SAAS,EAAC,iEAAiE,YACvG,aAAa,CAAC,QAAQ,CAAC,mBAAmB,CAAC,GACzC,EAEJ,oBAAoB,CAAC,OAAO,IAAI,CAC/B,KAAC,KAAK,IAAC,OAAO,EAAC,QAAQ,YAAE,aAAa,CAAC,QAAQ,CAAC,oBAAoB,CAAC,GAAS,CAC/E,EAEA,CAAC,oBAAoB,CAAC,OAAO,IAAI,CAAC,oBAAoB,CAAC,SAAS,IAAI,CACnE,cAAK,SAAS,EAAC,oCAAoC,YACjD,KAAC,OAAO,IAAC,SAAS,EAAC,QAAQ,EAAC,gBAAgB,EAAE,aAAa,CAAC,QAAQ,CAAC,aAAa,CAAC,GAAI,GACnF,CACP,EAEA,oBAAoB,CAAC,SAAS,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,CACxD,YAAG,SAAS,EAAC,6CAA6C,YACvD,aAAa,CAAC,QAAQ,CAAC,2BAA2B,CAAC,GAClD,CACL,EAEA,oBAAoB,CAAC,SAAS,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,CACtD,8BACE,KAAC,UAAU,IAAC,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,iBAAiB,GAAI,EAChE,KAAC,YAAY,KAAG,IACf,CACJ,IACO,CACX,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,cAAc,CAAC","sourcesContent":["import React from 'react';\nimport { Alert, Spinner } from '@openedx/paragon';\nimport { useIntl } from '@openedx/frontend-base';\n\nimport type { PurchaseHistoryItem } from '../../types';\nimport { getStripePaymentReceipt } from '../../data/services/orderHistory/orderHistory';\nimport { usePurchaseHistoryQuery } from '../../data/hooks/useOrderHistoryQueries';\nimport { useViaxClient, useViaxSession } from '../../data/hooks/useManageQueries';\nimport OrdersList from './OrderList';\nimport RefundNotice from '../RefundNotice/RefundNotice';\nimport messages from './messages';\n\n/** One-off course and program purchases, shown in the payment history tab. */\nconst OrderPurchases: React.FC = () => {\n const { formatMessage } = useIntl();\n const client = useViaxClient();\n const { sessionReady } = useViaxSession(client);\n const purchaseHistoryQuery = usePurchaseHistoryQuery(client, sessionReady);\n const orders = purchaseHistoryQuery.data ?? [];\n\n const handleViewReceipt = async (order: PurchaseHistoryItem) => {\n if (!client || !order.orderId) {\n return;\n }\n\n try {\n const receiptUrl = await getStripePaymentReceipt(client.gql, order.orderId);\n if (receiptUrl) {\n window.open(receiptUrl, '_blank', 'noopener,noreferrer');\n }\n } catch (error) {\n console.error('Unable to load payment receipt.', error);\n }\n };\n\n return (\n <section className=\"manage-section mt-5\" aria-labelledby=\"order-purchases-title\">\n <h2 id=\"order-purchases-title\" className=\"manage-section__title h3 font-weight-bold text-primary-500 mb-1\">\n {formatMessage(messages.otherPurchasesTitle)}\n </h2>\n\n {purchaseHistoryQuery.isError && (\n <Alert variant=\"danger\">{formatMessage(messages.purchaseHistoryError)}</Alert>\n )}\n\n {!purchaseHistoryQuery.isError && !purchaseHistoryQuery.isSuccess && (\n <div className=\"d-flex justify-content-center py-4\">\n <Spinner animation=\"border\" screenReaderText={formatMessage(messages.loadingOrders)} />\n </div>\n )}\n\n {purchaseHistoryQuery.isSuccess && orders.length === 0 && (\n <p className=\"manage-section__subtitle text-gray-700 mb-3\">\n {formatMessage(messages.coursePurchasesEmptyMessage)}\n </p>\n )}\n\n {purchaseHistoryQuery.isSuccess && orders.length > 0 && (\n <>\n <OrdersList orders={orders} onViewReceipt={handleViewReceipt} />\n <RefundNotice />\n </>\n )}\n </section>\n );\n};\n\nexport default OrderPurchases;\n"]}
@@ -0,0 +1,7 @@
1
+ import type { OrderProgramItem } from '../../types';
2
+ interface ProgramItemsTableProps {
3
+ items: OrderProgramItem[];
4
+ currency: string;
5
+ }
6
+ export declare const ProgramItemsTable: ({ items, currency }: ProgramItemsTableProps) => import("react/jsx-runtime").JSX.Element;
7
+ export default ProgramItemsTable;
@@ -0,0 +1,49 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { DataTable } from '@openedx/paragon';
3
+ import { useIntl } from '@openedx/frontend-base';
4
+ import messages from './messages';
5
+ const formatAmount = (amount, currency) => (`${currency === 'USD' ? '$' : ''}${amount.toFixed(2)} ${currency}`);
6
+ export const ProgramItemsTable = ({ items, currency }) => {
7
+ const { formatMessage } = useIntl();
8
+ const data = items.map((item, index) => {
9
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t;
10
+ const itemPrice = (_d = (_b = (_a = item.price) === null || _a === void 0 ? void 0 : _a.amount) !== null && _b !== void 0 ? _b : (_c = item.total) === null || _c === void 0 ? void 0 : _c.amount) !== null && _d !== void 0 ? _d : 0;
11
+ const discountAmount = (_f = (_e = item.discount) === null || _e === void 0 ? void 0 : _e.amount) !== null && _f !== void 0 ? _f : 0;
12
+ const totalAfterDiscount = (_h = (_g = item.total) === null || _g === void 0 ? void 0 : _g.amount) !== null && _h !== void 0 ? _h : itemPrice - discountAmount;
13
+ return {
14
+ id: (_k = (_j = item.productId) !== null && _j !== void 0 ? _j : item.courseRunKey) !== null && _k !== void 0 ? _k : `${item.name}-${index}`,
15
+ name: item.name,
16
+ price: formatAmount(itemPrice, (_m = (_l = item.price) === null || _l === void 0 ? void 0 : _l.currency) !== null && _m !== void 0 ? _m : currency),
17
+ discountAmount: `-${formatAmount(discountAmount, (_p = (_o = item.discount) === null || _o === void 0 ? void 0 : _o.currency) !== null && _p !== void 0 ? _p : currency)}`,
18
+ totalAfterDiscount: formatAmount(totalAfterDiscount, (_t = (_r = (_q = item.total) === null || _q === void 0 ? void 0 : _q.currency) !== null && _r !== void 0 ? _r : (_s = item.price) === null || _s === void 0 ? void 0 : _s.currency) !== null && _t !== void 0 ? _t : currency),
19
+ };
20
+ });
21
+ const columns = [
22
+ {
23
+ Header: formatMessage(messages.receiptTableCourseHeader),
24
+ accessor: 'name',
25
+ cellClassName: 'text-left',
26
+ },
27
+ {
28
+ Header: formatMessage(messages.receiptTablePriceHeader),
29
+ accessor: 'price',
30
+ headerClassName: 'text-left',
31
+ cellClassName: 'text-left',
32
+ },
33
+ {
34
+ Header: formatMessage(messages.receiptTableDiscountAmountHeader),
35
+ accessor: 'discountAmount',
36
+ headerClassName: 'text-left',
37
+ cellClassName: 'text-left',
38
+ },
39
+ {
40
+ Header: formatMessage(messages.receiptTableTotalAfterDiscountHeader),
41
+ accessor: 'totalAfterDiscount',
42
+ headerClassName: 'text-left',
43
+ cellClassName: 'text-left',
44
+ },
45
+ ];
46
+ return (_jsx("div", { className: "table-responsive mb-2 programItemsTable", children: _jsx(DataTable, { itemCount: data.length, data: data, columns: columns, children: _jsx(DataTable.Table, {}) }) }));
47
+ };
48
+ export default ProgramItemsTable;
49
+ //# sourceMappingURL=ProgramItemsTable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProgramItemsTable.js","sourceRoot":"","sources":["../../../src/components/OrderHistory/ProgramItemsTable.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAGjD,OAAO,QAAQ,MAAM,YAAY,CAAC;AAElC,MAAM,YAAY,GAAG,CAAC,MAAc,EAAE,QAAgB,EAAE,EAAE,CAAC,CACzD,GAAG,QAAQ,KAAK,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,QAAQ,EAAE,CACnE,CAAC;AAOF,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,EAAE,KAAK,EAAE,QAAQ,EAA0B,EAAE,EAAE;IAC/E,MAAM,EAAE,aAAa,EAAE,GAAG,OAAO,EAAE,CAAC;IACpC,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;;QACrC,MAAM,SAAS,GAAG,MAAA,MAAA,MAAA,IAAI,CAAC,KAAK,0CAAE,MAAM,mCAAI,MAAA,IAAI,CAAC,KAAK,0CAAE,MAAM,mCAAI,CAAC,CAAC;QAChE,MAAM,cAAc,GAAG,MAAA,MAAA,IAAI,CAAC,QAAQ,0CAAE,MAAM,mCAAI,CAAC,CAAC;QAClD,MAAM,kBAAkB,GAAG,MAAA,MAAA,IAAI,CAAC,KAAK,0CAAE,MAAM,mCAAI,SAAS,GAAG,cAAc,CAAC;QAE5E,OAAO;YACL,EAAE,EAAE,MAAA,MAAA,IAAI,CAAC,SAAS,mCAAI,IAAI,CAAC,YAAY,mCAAI,GAAG,IAAI,CAAC,IAAI,IAAI,KAAK,EAAE;YAClE,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,KAAK,EAAE,YAAY,CAAC,SAAS,EAAE,MAAA,MAAA,IAAI,CAAC,KAAK,0CAAE,QAAQ,mCAAI,QAAQ,CAAC;YAChE,cAAc,EAAE,IAAI,YAAY,CAAC,cAAc,EAAE,MAAA,MAAA,IAAI,CAAC,QAAQ,0CAAE,QAAQ,mCAAI,QAAQ,CAAC,EAAE;YACvF,kBAAkB,EAAE,YAAY,CAAC,kBAAkB,EAAE,MAAA,MAAA,MAAA,IAAI,CAAC,KAAK,0CAAE,QAAQ,mCAAI,MAAA,IAAI,CAAC,KAAK,0CAAE,QAAQ,mCAAI,QAAQ,CAAC;SAC/G,CAAC;IACJ,CAAC,CAAC,CAAC;IACH,MAAM,OAAO,GAAG;QACd;YACE,MAAM,EAAE,aAAa,CAAC,QAAQ,CAAC,wBAAwB,CAAC;YACxD,QAAQ,EAAE,MAAM;YAChB,aAAa,EAAE,WAAW;SAC3B;QACD;YACE,MAAM,EAAE,aAAa,CAAC,QAAQ,CAAC,uBAAuB,CAAC;YACvD,QAAQ,EAAE,OAAO;YACjB,eAAe,EAAE,WAAW;YAC5B,aAAa,EAAE,WAAW;SAC3B;QACD;YACE,MAAM,EAAE,aAAa,CAAC,QAAQ,CAAC,gCAAgC,CAAC;YAChE,QAAQ,EAAE,gBAAgB;YAC1B,eAAe,EAAE,WAAW;YAC5B,aAAa,EAAE,WAAW;SAC3B;QACD;YACE,MAAM,EAAE,aAAa,CAAC,QAAQ,CAAC,oCAAoC,CAAC;YACpE,QAAQ,EAAE,oBAAoB;YAC9B,eAAe,EAAE,WAAW;YAC5B,aAAa,EAAE,WAAW;SAC3B;KACF,CAAC;IAEF,OAAO,CACL,cAAK,SAAS,EAAC,yCAAyC,YACtD,KAAC,SAAS,IAAC,SAAS,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,YAC7D,KAAC,SAAS,CAAC,KAAK,KAAG,GACT,GACR,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,iBAAiB,CAAC","sourcesContent":["import { DataTable } from '@openedx/paragon';\nimport { useIntl } from '@openedx/frontend-base';\n\nimport type { OrderProgramItem } from '../../types';\nimport messages from './messages';\n\nconst formatAmount = (amount: number, currency: string) => (\n `${currency === 'USD' ? '$' : ''}${amount.toFixed(2)} ${currency}`\n);\n\ninterface ProgramItemsTableProps {\n items: OrderProgramItem[],\n currency: string,\n}\n\nexport const ProgramItemsTable = ({ items, currency }: ProgramItemsTableProps) => {\n const { formatMessage } = useIntl();\n const data = items.map((item, index) => {\n const itemPrice = item.price?.amount ?? item.total?.amount ?? 0;\n const discountAmount = item.discount?.amount ?? 0;\n const totalAfterDiscount = item.total?.amount ?? itemPrice - discountAmount;\n\n return {\n id: item.productId ?? item.courseRunKey ?? `${item.name}-${index}`,\n name: item.name,\n price: formatAmount(itemPrice, item.price?.currency ?? currency),\n discountAmount: `-${formatAmount(discountAmount, item.discount?.currency ?? currency)}`,\n totalAfterDiscount: formatAmount(totalAfterDiscount, item.total?.currency ?? item.price?.currency ?? currency),\n };\n });\n const columns = [\n {\n Header: formatMessage(messages.receiptTableCourseHeader),\n accessor: 'name',\n cellClassName: 'text-left',\n },\n {\n Header: formatMessage(messages.receiptTablePriceHeader),\n accessor: 'price',\n headerClassName: 'text-left',\n cellClassName: 'text-left',\n },\n {\n Header: formatMessage(messages.receiptTableDiscountAmountHeader),\n accessor: 'discountAmount',\n headerClassName: 'text-left',\n cellClassName: 'text-left',\n },\n {\n Header: formatMessage(messages.receiptTableTotalAfterDiscountHeader),\n accessor: 'totalAfterDiscount',\n headerClassName: 'text-left',\n cellClassName: 'text-left',\n },\n ];\n\n return (\n <div className=\"table-responsive mb-2 programItemsTable\">\n <DataTable itemCount={data.length} data={data} columns={columns}>\n <DataTable.Table />\n </DataTable>\n </div>\n );\n};\n\nexport default ProgramItemsTable;\n"]}
@@ -0,0 +1,17 @@
1
+ import type { OrderDetailsData } from '../../../types';
2
+ export declare const getOrderSummaryRows: (order: OrderDetailsData, orderDate: string, subtotal: string, total: string, discountAmount: string, discountCode: string) => {
3
+ label: {
4
+ id: string;
5
+ defaultMessage: string;
6
+ description: string;
7
+ };
8
+ value: string;
9
+ }[];
10
+ export declare const getOrderItemRows: (order: OrderDetailsData, itemPrice: string, total: string, discountAmount: string) => {
11
+ label: {
12
+ id: string;
13
+ defaultMessage: string;
14
+ description: string;
15
+ };
16
+ value: string;
17
+ }[];
@@ -0,0 +1,16 @@
1
+ import messages from '../messages';
2
+ export const getOrderSummaryRows = (order, orderDate, subtotal, total, discountAmount, discountCode) => [
3
+ { label: messages.receiptOrderNumberLabel, value: order.orderNumber },
4
+ { label: messages.receiptOrderDateLabel, value: orderDate },
5
+ { label: messages.receiptSubtotalLabel, value: subtotal },
6
+ { label: messages.receiptDiscountCodeLabel, value: discountCode || 'None' },
7
+ { label: messages.receiptDiscountAmountLabel, value: discountAmount },
8
+ { label: messages.receiptTotalAfterDiscountLabel, value: total },
9
+ ];
10
+ export const getOrderItemRows = (order, itemPrice, total, discountAmount) => [
11
+ { label: messages.receiptNameLabel, value: order.name },
12
+ { label: messages.receiptPriceLabel, value: itemPrice },
13
+ { label: messages.receiptDiscountAmountLabel, value: discountAmount },
14
+ { label: messages.receiptTotalAfterDiscountLabel, value: total },
15
+ ];
16
+ //# sourceMappingURL=receiptRows.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"receiptRows.js","sourceRoot":"","sources":["../../../../src/components/OrderHistory/data/receiptRows.ts"],"names":[],"mappings":"AACA,OAAO,QAAQ,MAAM,aAAa,CAAC;AAEnC,MAAM,CAAC,MAAM,mBAAmB,GAAG,CACjC,KAAuB,EACvB,SAAiB,EACjB,QAAgB,EAChB,KAAa,EACb,cAAsB,EACtB,YAAoB,EACpB,EAAE,CAAC;IACH,EAAE,KAAK,EAAE,QAAQ,CAAC,uBAAuB,EAAE,KAAK,EAAE,KAAK,CAAC,WAAW,EAAE;IACrE,EAAE,KAAK,EAAE,QAAQ,CAAC,qBAAqB,EAAE,KAAK,EAAE,SAAS,EAAE;IAC3D,EAAE,KAAK,EAAE,QAAQ,CAAC,oBAAoB,EAAE,KAAK,EAAE,QAAQ,EAAE;IACzD,EAAE,KAAK,EAAE,QAAQ,CAAC,wBAAwB,EAAE,KAAK,EAAE,YAAY,IAAI,MAAM,EAAE;IAC3E,EAAE,KAAK,EAAE,QAAQ,CAAC,0BAA0B,EAAE,KAAK,EAAE,cAAc,EAAE;IACrE,EAAE,KAAK,EAAE,QAAQ,CAAC,8BAA8B,EAAE,KAAK,EAAE,KAAK,EAAE;CACjE,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAC9B,KAAuB,EACvB,SAAiB,EACjB,KAAa,EACb,cAAsB,EACtB,EAAE,CAAC;IACH,EAAE,KAAK,EAAE,QAAQ,CAAC,gBAAgB,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE;IACvD,EAAE,KAAK,EAAE,QAAQ,CAAC,iBAAiB,EAAE,KAAK,EAAE,SAAS,EAAE;IACvD,EAAE,KAAK,EAAE,QAAQ,CAAC,0BAA0B,EAAE,KAAK,EAAE,cAAc,EAAE;IACrE,EAAE,KAAK,EAAE,QAAQ,CAAC,8BAA8B,EAAE,KAAK,EAAE,KAAK,EAAE;CACjE,CAAC","sourcesContent":["import type { OrderDetailsData } from '../../../types';\nimport messages from '../messages';\n\nexport const getOrderSummaryRows = (\n order: OrderDetailsData,\n orderDate: string,\n subtotal: string,\n total: string,\n discountAmount: string,\n discountCode: string,\n) => [\n { label: messages.receiptOrderNumberLabel, value: order.orderNumber },\n { label: messages.receiptOrderDateLabel, value: orderDate },\n { label: messages.receiptSubtotalLabel, value: subtotal },\n { label: messages.receiptDiscountCodeLabel, value: discountCode || 'None' },\n { label: messages.receiptDiscountAmountLabel, value: discountAmount },\n { label: messages.receiptTotalAfterDiscountLabel, value: total },\n];\n\nexport const getOrderItemRows = (\n order: OrderDetailsData,\n itemPrice: string,\n total: string,\n discountAmount: string,\n) => [\n { label: messages.receiptNameLabel, value: order.name },\n { label: messages.receiptPriceLabel, value: itemPrice },\n { label: messages.receiptDiscountAmountLabel, value: discountAmount },\n { label: messages.receiptTotalAfterDiscountLabel, value: total },\n];\n"]}
@@ -0,0 +1,118 @@
1
+ declare const messages: {
2
+ orderHistoryTitle: {
3
+ id: string;
4
+ defaultMessage: string;
5
+ description: string;
6
+ };
7
+ otherPurchasesTitle: {
8
+ id: string;
9
+ defaultMessage: string;
10
+ description: string;
11
+ };
12
+ coursePurchasesEmptyMessage: {
13
+ id: string;
14
+ defaultMessage: string;
15
+ description: string;
16
+ };
17
+ loadingOrders: {
18
+ id: string;
19
+ defaultMessage: string;
20
+ description: string;
21
+ };
22
+ purchaseHistoryError: {
23
+ id: string;
24
+ defaultMessage: string;
25
+ description: string;
26
+ };
27
+ orderNotFound: {
28
+ id: string;
29
+ defaultMessage: string;
30
+ description: string;
31
+ };
32
+ orderDateTitle: {
33
+ id: string;
34
+ defaultMessage: string;
35
+ description: string;
36
+ };
37
+ orderSummaryTitle: {
38
+ id: string;
39
+ defaultMessage: string;
40
+ description: string;
41
+ };
42
+ orderItemsTitle: {
43
+ id: string;
44
+ defaultMessage: string;
45
+ description: string;
46
+ };
47
+ paymentTitle: {
48
+ id: string;
49
+ defaultMessage: string;
50
+ description: string;
51
+ };
52
+ receiptOrderNumberLabel: {
53
+ id: string;
54
+ defaultMessage: string;
55
+ description: string;
56
+ };
57
+ receiptOrderDateLabel: {
58
+ id: string;
59
+ defaultMessage: string;
60
+ description: string;
61
+ };
62
+ receiptSubtotalLabel: {
63
+ id: string;
64
+ defaultMessage: string;
65
+ description: string;
66
+ };
67
+ receiptDiscountCodeLabel: {
68
+ id: string;
69
+ defaultMessage: string;
70
+ description: string;
71
+ };
72
+ receiptDiscountAmountLabel: {
73
+ id: string;
74
+ defaultMessage: string;
75
+ description: string;
76
+ };
77
+ receiptTotalAfterDiscountLabel: {
78
+ id: string;
79
+ defaultMessage: string;
80
+ description: string;
81
+ };
82
+ receiptNameLabel: {
83
+ id: string;
84
+ defaultMessage: string;
85
+ description: string;
86
+ };
87
+ receiptPriceLabel: {
88
+ id: string;
89
+ defaultMessage: string;
90
+ description: string;
91
+ };
92
+ receiptAmountLabel: {
93
+ id: string;
94
+ defaultMessage: string;
95
+ description: string;
96
+ };
97
+ receiptTableCourseHeader: {
98
+ id: string;
99
+ defaultMessage: string;
100
+ description: string;
101
+ };
102
+ receiptTablePriceHeader: {
103
+ id: string;
104
+ defaultMessage: string;
105
+ description: string;
106
+ };
107
+ receiptTableDiscountAmountHeader: {
108
+ id: string;
109
+ defaultMessage: string;
110
+ description: string;
111
+ };
112
+ receiptTableTotalAfterDiscountHeader: {
113
+ id: string;
114
+ defaultMessage: string;
115
+ description: string;
116
+ };
117
+ };
118
+ export default messages;
@@ -0,0 +1,120 @@
1
+ import { defineMessages } from '@openedx/frontend-base';
2
+ const messages = defineMessages({
3
+ orderHistoryTitle: {
4
+ id: 'orderHistoryTitle',
5
+ defaultMessage: 'Order History',
6
+ description: 'Heading for order history',
7
+ },
8
+ otherPurchasesTitle: {
9
+ id: 'orderHistory.coursePayments.otherPurchasesTitle',
10
+ defaultMessage: 'Other purchases',
11
+ description: 'Heading above the list of course and program purchases.',
12
+ },
13
+ coursePurchasesEmptyMessage: {
14
+ id: 'orderHistory.coursePayments.emptyMessage',
15
+ defaultMessage: 'Courses you purchased in the last 180 days will appear here. If possible, please retain receipts for your records.',
16
+ description: 'Message shown when there are no course purchases to display.',
17
+ },
18
+ loadingOrders: {
19
+ id: 'orderHistory.loadingOrders',
20
+ defaultMessage: 'Loading orders…',
21
+ description: 'Loading state while the order history is fetched',
22
+ },
23
+ purchaseHistoryError: {
24
+ id: 'orderHistory.purchaseHistoryError',
25
+ defaultMessage: 'We could not load your orders. Please try again later.',
26
+ description: 'Error alert when the order history fails to load',
27
+ },
28
+ orderNotFound: {
29
+ id: 'orderHistory.orderNotFound',
30
+ defaultMessage: 'We could not find this order.',
31
+ description: 'Shown on the order details page when no matching order exists',
32
+ },
33
+ orderDateTitle: {
34
+ id: 'orderDateTitle',
35
+ defaultMessage: 'Order date',
36
+ description: 'Label for order date',
37
+ },
38
+ orderSummaryTitle: {
39
+ id: 'orderSummaryTitle',
40
+ defaultMessage: 'Order summary',
41
+ description: 'Heading for order summary section',
42
+ },
43
+ orderItemsTitle: {
44
+ id: 'orderItemsTitle',
45
+ defaultMessage: 'Order items',
46
+ description: 'Heading for order items section',
47
+ },
48
+ paymentTitle: {
49
+ id: 'paymentTitle',
50
+ defaultMessage: 'Payment',
51
+ description: 'Heading for payment section',
52
+ },
53
+ receiptOrderNumberLabel: {
54
+ id: 'receiptOrderNumberLabel',
55
+ defaultMessage: 'Order number:',
56
+ description: 'Receipt label for the order number',
57
+ },
58
+ receiptOrderDateLabel: {
59
+ id: 'receiptOrderDateLabel',
60
+ defaultMessage: 'Order date:',
61
+ description: 'Receipt label for the order date',
62
+ },
63
+ receiptSubtotalLabel: {
64
+ id: 'receiptSubtotalLabel',
65
+ defaultMessage: 'Subtotal:',
66
+ description: 'Receipt label for the subtotal amount',
67
+ },
68
+ receiptDiscountCodeLabel: {
69
+ id: 'receiptDiscountCodeLabel',
70
+ defaultMessage: 'Discount code:',
71
+ description: 'Receipt label for the discount code',
72
+ },
73
+ receiptDiscountAmountLabel: {
74
+ id: 'receiptDiscountAmountLabel',
75
+ defaultMessage: 'Discount amount:',
76
+ description: 'Receipt label for the discount amount',
77
+ },
78
+ receiptTotalAfterDiscountLabel: {
79
+ id: 'receiptTotalAfterDiscountLabel',
80
+ defaultMessage: 'Total after discount:',
81
+ description: 'Receipt label for the total after discount',
82
+ },
83
+ receiptNameLabel: {
84
+ id: 'receiptNameLabel',
85
+ defaultMessage: 'Name:',
86
+ description: 'Receipt label for the item name',
87
+ },
88
+ receiptPriceLabel: {
89
+ id: 'receiptPriceLabel',
90
+ defaultMessage: 'Price:',
91
+ description: 'Receipt label for the item price',
92
+ },
93
+ receiptAmountLabel: {
94
+ id: 'receiptAmountLabel',
95
+ defaultMessage: 'Amount:',
96
+ description: 'Receipt label for the payment amount',
97
+ },
98
+ receiptTableCourseHeader: {
99
+ id: 'receiptTableCourseHeader',
100
+ defaultMessage: 'Course',
101
+ description: 'Program order items table header for the course name column',
102
+ },
103
+ receiptTablePriceHeader: {
104
+ id: 'receiptTablePriceHeader',
105
+ defaultMessage: 'Price',
106
+ description: 'Program order items table header for the course price column',
107
+ },
108
+ receiptTableDiscountAmountHeader: {
109
+ id: 'receiptTableDiscountAmountHeader',
110
+ defaultMessage: 'Discount amount',
111
+ description: 'Program order items table header for the discount amount column',
112
+ },
113
+ receiptTableTotalAfterDiscountHeader: {
114
+ id: 'receiptTableTotalAfterDiscountHeader',
115
+ defaultMessage: 'Total after discount',
116
+ description: 'Program order items table header for the total after discount column',
117
+ },
118
+ });
119
+ export default messages;
120
+ //# sourceMappingURL=messages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messages.js","sourceRoot":"","sources":["../../../src/components/OrderHistory/messages.ts"],"names":[],"mappings":"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","sourcesContent":["import { defineMessages } from '@openedx/frontend-base';\n\nconst messages = defineMessages({\n orderHistoryTitle: {\n id: 'orderHistoryTitle',\n defaultMessage: 'Order History',\n description: 'Heading for order history',\n },\n otherPurchasesTitle: {\n id: 'orderHistory.coursePayments.otherPurchasesTitle',\n defaultMessage: 'Other purchases',\n description: 'Heading above the list of course and program purchases.',\n },\n coursePurchasesEmptyMessage: {\n id: 'orderHistory.coursePayments.emptyMessage',\n defaultMessage: 'Courses you purchased in the last 180 days will appear here. If possible, please retain receipts for your records.',\n description: 'Message shown when there are no course purchases to display.',\n },\n loadingOrders: {\n id: 'orderHistory.loadingOrders',\n defaultMessage: 'Loading orders…',\n description: 'Loading state while the order history is fetched',\n },\n purchaseHistoryError: {\n id: 'orderHistory.purchaseHistoryError',\n defaultMessage: 'We could not load your orders. Please try again later.',\n description: 'Error alert when the order history fails to load',\n },\n orderNotFound: {\n id: 'orderHistory.orderNotFound',\n defaultMessage: 'We could not find this order.',\n description: 'Shown on the order details page when no matching order exists',\n },\n orderDateTitle: {\n id: 'orderDateTitle',\n defaultMessage: 'Order date',\n description: 'Label for order date',\n },\n orderSummaryTitle: {\n id: 'orderSummaryTitle',\n defaultMessage: 'Order summary',\n description: 'Heading for order summary section',\n },\n orderItemsTitle: {\n id: 'orderItemsTitle',\n defaultMessage: 'Order items',\n description: 'Heading for order items section',\n },\n paymentTitle: {\n id: 'paymentTitle',\n defaultMessage: 'Payment',\n description: 'Heading for payment section',\n },\n receiptOrderNumberLabel: {\n id: 'receiptOrderNumberLabel',\n defaultMessage: 'Order number:',\n description: 'Receipt label for the order number',\n },\n receiptOrderDateLabel: {\n id: 'receiptOrderDateLabel',\n defaultMessage: 'Order date:',\n description: 'Receipt label for the order date',\n },\n receiptSubtotalLabel: {\n id: 'receiptSubtotalLabel',\n defaultMessage: 'Subtotal:',\n description: 'Receipt label for the subtotal amount',\n },\n receiptDiscountCodeLabel: {\n id: 'receiptDiscountCodeLabel',\n defaultMessage: 'Discount code:',\n description: 'Receipt label for the discount code',\n },\n receiptDiscountAmountLabel: {\n id: 'receiptDiscountAmountLabel',\n defaultMessage: 'Discount amount:',\n description: 'Receipt label for the discount amount',\n },\n receiptTotalAfterDiscountLabel: {\n id: 'receiptTotalAfterDiscountLabel',\n defaultMessage: 'Total after discount:',\n description: 'Receipt label for the total after discount',\n },\n receiptNameLabel: {\n id: 'receiptNameLabel',\n defaultMessage: 'Name:',\n description: 'Receipt label for the item name',\n },\n receiptPriceLabel: {\n id: 'receiptPriceLabel',\n defaultMessage: 'Price:',\n description: 'Receipt label for the item price',\n },\n receiptAmountLabel: {\n id: 'receiptAmountLabel',\n defaultMessage: 'Amount:',\n description: 'Receipt label for the payment amount',\n },\n receiptTableCourseHeader: {\n id: 'receiptTableCourseHeader',\n defaultMessage: 'Course',\n description: 'Program order items table header for the course name column',\n },\n receiptTablePriceHeader: {\n id: 'receiptTablePriceHeader',\n defaultMessage: 'Price',\n description: 'Program order items table header for the course price column',\n },\n receiptTableDiscountAmountHeader: {\n id: 'receiptTableDiscountAmountHeader',\n defaultMessage: 'Discount amount',\n description: 'Program order items table header for the discount amount column',\n },\n receiptTableTotalAfterDiscountHeader: {\n id: 'receiptTableTotalAfterDiscountHeader',\n defaultMessage: 'Total after discount',\n description: 'Program order items table header for the total after discount column',\n },\n});\n\nexport default messages;\n"]}