@thorprovider/blocks 3.0.1 → 4.0.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 (192) hide show
  1. package/README.md +61 -21
  2. package/dist/blocks/designs/marketplace-product-card/block.d.ts +12 -0
  3. package/dist/blocks/designs/marketplace-product-card/block.d.ts.map +1 -0
  4. package/dist/blocks/designs/marketplace-product-card/block.js +243 -0
  5. package/dist/blocks/designs/marketplace-product-card/block.js.map +1 -0
  6. package/dist/blocks/designs/marketplace-product-card/block.mjs +233 -0
  7. package/dist/blocks/designs/marketplace-product-card/block.mjs.map +1 -0
  8. package/dist/blocks/designs/marketplace-product-card/index.d.ts +3 -0
  9. package/dist/blocks/designs/marketplace-product-card/index.d.ts.map +1 -0
  10. package/dist/blocks/designs/marketplace-product-card/index.js +36 -0
  11. package/dist/blocks/designs/marketplace-product-card/index.js.map +1 -0
  12. package/dist/blocks/designs/marketplace-product-card/index.mjs +6 -0
  13. package/dist/blocks/designs/marketplace-product-card/index.mjs.map +1 -0
  14. package/dist/blocks/designs/marketplace-product-card/normalize.d.ts +13 -0
  15. package/dist/blocks/designs/marketplace-product-card/normalize.d.ts.map +1 -0
  16. package/dist/blocks/designs/marketplace-product-card/normalize.js +36 -0
  17. package/dist/blocks/designs/marketplace-product-card/normalize.js.map +1 -0
  18. package/dist/blocks/designs/marketplace-product-card/normalize.mjs +12 -0
  19. package/dist/blocks/designs/marketplace-product-card/normalize.mjs.map +1 -0
  20. package/dist/blocks/designs/marketplace-product-card/variants.d.ts +72 -0
  21. package/dist/blocks/designs/marketplace-product-card/variants.d.ts.map +1 -0
  22. package/dist/blocks/designs/marketplace-product-card/variants.js +123 -0
  23. package/dist/blocks/designs/marketplace-product-card/variants.js.map +1 -0
  24. package/dist/blocks/designs/marketplace-product-card/variants.mjs +89 -0
  25. package/dist/blocks/designs/marketplace-product-card/variants.mjs.map +1 -0
  26. package/dist/blocks/e-commerce/checkout-forms/checkbox-check.js +1 -1
  27. package/dist/blocks/e-commerce/checkout-forms/checkbox-check.js.map +1 -1
  28. package/dist/blocks/e-commerce/checkout-forms/checkbox-check.mjs +1 -1
  29. package/dist/blocks/e-commerce/checkout-forms/checkbox-check.mjs.map +1 -1
  30. package/dist/blocks/e-commerce/checkout-forms/checkout-address-equality.d.ts +11 -0
  31. package/dist/blocks/e-commerce/checkout-forms/checkout-address-equality.d.ts.map +1 -0
  32. package/dist/blocks/e-commerce/checkout-forms/checkout-address-equality.js +46 -0
  33. package/dist/blocks/e-commerce/checkout-forms/checkout-address-equality.js.map +1 -0
  34. package/dist/blocks/e-commerce/checkout-forms/checkout-address-equality.mjs +22 -0
  35. package/dist/blocks/e-commerce/checkout-forms/checkout-address-equality.mjs.map +1 -0
  36. package/dist/blocks/e-commerce/checkout-forms/checkout-address-fields.d.ts +28 -0
  37. package/dist/blocks/e-commerce/checkout-forms/checkout-address-fields.d.ts.map +1 -0
  38. package/dist/blocks/e-commerce/checkout-forms/checkout-address-fields.js +278 -0
  39. package/dist/blocks/e-commerce/checkout-forms/checkout-address-fields.js.map +1 -0
  40. package/dist/blocks/e-commerce/checkout-forms/checkout-address-fields.mjs +260 -0
  41. package/dist/blocks/e-commerce/checkout-forms/checkout-address-fields.mjs.map +1 -0
  42. package/dist/blocks/e-commerce/checkout-forms/checkout-contact-step.d.ts +12 -9
  43. package/dist/blocks/e-commerce/checkout-forms/checkout-contact-step.d.ts.map +1 -1
  44. package/dist/blocks/e-commerce/checkout-forms/checkout-contact-step.js +49 -71
  45. package/dist/blocks/e-commerce/checkout-forms/checkout-contact-step.js.map +1 -1
  46. package/dist/blocks/e-commerce/checkout-forms/checkout-contact-step.mjs +50 -72
  47. package/dist/blocks/e-commerce/checkout-forms/checkout-contact-step.mjs.map +1 -1
  48. package/dist/blocks/e-commerce/checkout-forms/checkout-country-field.d.ts.map +1 -1
  49. package/dist/blocks/e-commerce/checkout-forms/checkout-country-field.js +6 -3
  50. package/dist/blocks/e-commerce/checkout-forms/checkout-country-field.js.map +1 -1
  51. package/dist/blocks/e-commerce/checkout-forms/checkout-country-field.mjs +6 -3
  52. package/dist/blocks/e-commerce/checkout-forms/checkout-country-field.mjs.map +1 -1
  53. package/dist/blocks/e-commerce/checkout-forms/checkout-id-context.d.ts +7 -0
  54. package/dist/blocks/e-commerce/checkout-forms/checkout-id-context.d.ts.map +1 -0
  55. package/dist/blocks/e-commerce/checkout-forms/checkout-id-context.js +41 -0
  56. package/dist/blocks/e-commerce/checkout-forms/checkout-id-context.js.map +1 -0
  57. package/dist/blocks/e-commerce/checkout-forms/checkout-id-context.mjs +16 -0
  58. package/dist/blocks/e-commerce/checkout-forms/checkout-id-context.mjs.map +1 -0
  59. package/dist/blocks/e-commerce/checkout-forms/checkout-location-select.d.ts +24 -0
  60. package/dist/blocks/e-commerce/checkout-forms/checkout-location-select.d.ts.map +1 -0
  61. package/dist/blocks/e-commerce/checkout-forms/checkout-location-select.js +75 -0
  62. package/dist/blocks/e-commerce/checkout-forms/checkout-location-select.js.map +1 -0
  63. package/dist/blocks/e-commerce/checkout-forms/checkout-location-select.mjs +58 -0
  64. package/dist/blocks/e-commerce/checkout-forms/checkout-location-select.mjs.map +1 -0
  65. package/dist/blocks/e-commerce/checkout-forms/checkout-order-summary.d.ts +3 -2
  66. package/dist/blocks/e-commerce/checkout-forms/checkout-order-summary.d.ts.map +1 -1
  67. package/dist/blocks/e-commerce/checkout-forms/checkout-order-summary.js +9 -2
  68. package/dist/blocks/e-commerce/checkout-forms/checkout-order-summary.js.map +1 -1
  69. package/dist/blocks/e-commerce/checkout-forms/checkout-order-summary.mjs +9 -2
  70. package/dist/blocks/e-commerce/checkout-forms/checkout-order-summary.mjs.map +1 -1
  71. package/dist/blocks/e-commerce/checkout-forms/checkout-payment-step.d.ts +23 -8
  72. package/dist/blocks/e-commerce/checkout-forms/checkout-payment-step.d.ts.map +1 -1
  73. package/dist/blocks/e-commerce/checkout-forms/checkout-payment-step.js +136 -31
  74. package/dist/blocks/e-commerce/checkout-forms/checkout-payment-step.js.map +1 -1
  75. package/dist/blocks/e-commerce/checkout-forms/checkout-payment-step.mjs +143 -32
  76. package/dist/blocks/e-commerce/checkout-forms/checkout-payment-step.mjs.map +1 -1
  77. package/dist/blocks/e-commerce/checkout-forms/checkout-review-step.d.ts +13 -7
  78. package/dist/blocks/e-commerce/checkout-forms/checkout-review-step.d.ts.map +1 -1
  79. package/dist/blocks/e-commerce/checkout-forms/checkout-review-step.js +179 -28
  80. package/dist/blocks/e-commerce/checkout-forms/checkout-review-step.js.map +1 -1
  81. package/dist/blocks/e-commerce/checkout-forms/checkout-review-step.mjs +180 -29
  82. package/dist/blocks/e-commerce/checkout-forms/checkout-review-step.mjs.map +1 -1
  83. package/dist/blocks/e-commerce/checkout-forms/checkout-saved-addresses.d.ts +20 -0
  84. package/dist/blocks/e-commerce/checkout-forms/checkout-saved-addresses.d.ts.map +1 -0
  85. package/dist/blocks/e-commerce/checkout-forms/checkout-saved-addresses.js +199 -0
  86. package/dist/blocks/e-commerce/checkout-forms/checkout-saved-addresses.js.map +1 -0
  87. package/dist/blocks/e-commerce/checkout-forms/checkout-saved-addresses.mjs +175 -0
  88. package/dist/blocks/e-commerce/checkout-forms/checkout-saved-addresses.mjs.map +1 -0
  89. package/dist/blocks/e-commerce/checkout-forms/checkout-section-nav.d.ts +14 -0
  90. package/dist/blocks/e-commerce/checkout-forms/checkout-section-nav.d.ts.map +1 -0
  91. package/dist/blocks/e-commerce/checkout-forms/checkout-section-nav.js +136 -0
  92. package/dist/blocks/e-commerce/checkout-forms/checkout-section-nav.js.map +1 -0
  93. package/dist/blocks/e-commerce/checkout-forms/checkout-section-nav.mjs +109 -0
  94. package/dist/blocks/e-commerce/checkout-forms/checkout-section-nav.mjs.map +1 -0
  95. package/dist/blocks/e-commerce/checkout-forms/checkout-shipping-step.d.ts +32 -10
  96. package/dist/blocks/e-commerce/checkout-forms/checkout-shipping-step.d.ts.map +1 -1
  97. package/dist/blocks/e-commerce/checkout-forms/checkout-shipping-step.js +265 -147
  98. package/dist/blocks/e-commerce/checkout-forms/checkout-shipping-step.js.map +1 -1
  99. package/dist/blocks/e-commerce/checkout-forms/checkout-shipping-step.mjs +272 -148
  100. package/dist/blocks/e-commerce/checkout-forms/checkout-shipping-step.mjs.map +1 -1
  101. package/dist/blocks/e-commerce/checkout-forms/checkout-step-header.d.ts +13 -0
  102. package/dist/blocks/e-commerce/checkout-forms/checkout-step-header.d.ts.map +1 -0
  103. package/dist/blocks/e-commerce/checkout-forms/checkout-step-header.js +74 -0
  104. package/dist/blocks/e-commerce/checkout-forms/checkout-step-header.js.map +1 -0
  105. package/dist/blocks/e-commerce/checkout-forms/checkout-step-header.mjs +50 -0
  106. package/dist/blocks/e-commerce/checkout-forms/checkout-step-header.mjs.map +1 -0
  107. package/dist/blocks/e-commerce/checkout-forms/checkout-step-summary.d.ts +7 -0
  108. package/dist/blocks/e-commerce/checkout-forms/checkout-step-summary.d.ts.map +1 -0
  109. package/dist/blocks/e-commerce/checkout-forms/checkout-step-summary.js +91 -0
  110. package/dist/blocks/e-commerce/checkout-forms/checkout-step-summary.js.map +1 -0
  111. package/dist/blocks/e-commerce/checkout-forms/checkout-step-summary.mjs +65 -0
  112. package/dist/blocks/e-commerce/checkout-forms/checkout-step-summary.mjs.map +1 -0
  113. package/dist/blocks/e-commerce/checkout-forms/checkout.d.ts +174 -44
  114. package/dist/blocks/e-commerce/checkout-forms/checkout.d.ts.map +1 -1
  115. package/dist/blocks/e-commerce/checkout-forms/checkout.js +532 -108
  116. package/dist/blocks/e-commerce/checkout-forms/checkout.js.map +1 -1
  117. package/dist/blocks/e-commerce/checkout-forms/checkout.mjs +542 -109
  118. package/dist/blocks/e-commerce/checkout-forms/checkout.mjs.map +1 -1
  119. package/dist/blocks/e-commerce/navigation/storefront-navbar-cart-sheet.d.ts.map +1 -1
  120. package/dist/blocks/e-commerce/navigation/storefront-navbar-cart-sheet.js +44 -20
  121. package/dist/blocks/e-commerce/navigation/storefront-navbar-cart-sheet.js.map +1 -1
  122. package/dist/blocks/e-commerce/navigation/storefront-navbar-cart-sheet.mjs +44 -20
  123. package/dist/blocks/e-commerce/navigation/storefront-navbar-cart-sheet.mjs.map +1 -1
  124. package/dist/blocks/e-commerce/navigation/storefront-navbar.d.ts.map +1 -1
  125. package/dist/blocks/e-commerce/navigation/storefront-navbar.js +21 -10
  126. package/dist/blocks/e-commerce/navigation/storefront-navbar.js.map +1 -1
  127. package/dist/blocks/e-commerce/navigation/storefront-navbar.mjs +21 -10
  128. package/dist/blocks/e-commerce/navigation/storefront-navbar.mjs.map +1 -1
  129. package/dist/blocks/e-commerce/product-list/product-card.d.ts.map +1 -1
  130. package/dist/blocks/e-commerce/product-list/product-card.js +36 -9
  131. package/dist/blocks/e-commerce/product-list/product-card.js.map +1 -1
  132. package/dist/blocks/e-commerce/product-list/product-card.mjs +36 -9
  133. package/dist/blocks/e-commerce/product-list/product-card.mjs.map +1 -1
  134. package/dist/blocks/e-commerce/product-list/product-showcase-1.d.ts.map +1 -1
  135. package/dist/blocks/e-commerce/product-list/product-showcase-1.js +7 -2
  136. package/dist/blocks/e-commerce/product-list/product-showcase-1.js.map +1 -1
  137. package/dist/blocks/e-commerce/product-list/product-showcase-1.mjs +7 -2
  138. package/dist/blocks/e-commerce/product-list/product-showcase-1.mjs.map +1 -1
  139. package/dist/blocks/e-commerce/product-overview/product-quick-view-dialog.d.ts.map +1 -1
  140. package/dist/blocks/e-commerce/product-overview/product-quick-view-dialog.js +5 -1
  141. package/dist/blocks/e-commerce/product-overview/product-quick-view-dialog.js.map +1 -1
  142. package/dist/blocks/e-commerce/product-overview/product-quick-view-dialog.mjs +5 -1
  143. package/dist/blocks/e-commerce/product-overview/product-quick-view-dialog.mjs.map +1 -1
  144. package/dist/blocks/e-commerce/storefront-hero/storefront-hero.d.ts.map +1 -1
  145. package/dist/blocks/e-commerce/storefront-hero/storefront-hero.js +71 -51
  146. package/dist/blocks/e-commerce/storefront-hero/storefront-hero.js.map +1 -1
  147. package/dist/blocks/e-commerce/storefront-hero/storefront-hero.mjs +71 -51
  148. package/dist/blocks/e-commerce/storefront-hero/storefront-hero.mjs.map +1 -1
  149. package/dist/blocks/marketing/banners/banner-1.d.ts.map +1 -1
  150. package/dist/blocks/marketing/banners/banner-1.js +15 -27
  151. package/dist/blocks/marketing/banners/banner-1.js.map +1 -1
  152. package/dist/blocks/marketing/banners/banner-1.mjs +16 -28
  153. package/dist/blocks/marketing/banners/banner-1.mjs.map +1 -1
  154. package/dist/index.d.ts +6 -3
  155. package/dist/index.d.ts.map +1 -1
  156. package/dist/index.js +5 -0
  157. package/dist/index.js.map +1 -1
  158. package/dist/index.mjs +4 -0
  159. package/dist/index.mjs.map +1 -1
  160. package/dist/lib/contracts/marketplace-product-card.d.ts +324 -0
  161. package/dist/lib/contracts/marketplace-product-card.d.ts.map +1 -0
  162. package/dist/lib/contracts/marketplace-product-card.js +85 -0
  163. package/dist/lib/contracts/marketplace-product-card.js.map +1 -0
  164. package/dist/lib/contracts/marketplace-product-card.mjs +61 -0
  165. package/dist/lib/contracts/marketplace-product-card.mjs.map +1 -0
  166. package/dist/lib/contracts.d.ts +1861 -88
  167. package/dist/lib/contracts.d.ts.map +1 -1
  168. package/dist/lib/contracts.js +252 -25
  169. package/dist/lib/contracts.js.map +1 -1
  170. package/dist/lib/contracts.mjs +208 -5
  171. package/dist/lib/contracts.mjs.map +1 -1
  172. package/dist/lib/money-schema.d.ts +19 -0
  173. package/dist/lib/money-schema.d.ts.map +1 -0
  174. package/dist/lib/money-schema.js +33 -0
  175. package/dist/lib/money-schema.js.map +1 -0
  176. package/dist/lib/money-schema.mjs +9 -0
  177. package/dist/lib/money-schema.mjs.map +1 -0
  178. package/dist/lib/motion.d.ts +29 -0
  179. package/dist/lib/motion.d.ts.map +1 -0
  180. package/dist/lib/motion.js +65 -0
  181. package/dist/lib/motion.js.map +1 -0
  182. package/dist/lib/motion.mjs +41 -0
  183. package/dist/lib/motion.mjs.map +1 -0
  184. package/dist/ui/accordion.d.ts +3 -1
  185. package/dist/ui/accordion.d.ts.map +1 -1
  186. package/dist/ui/accordion.js +21 -5
  187. package/dist/ui/accordion.js.map +1 -1
  188. package/dist/ui/accordion.mjs +21 -5
  189. package/dist/ui/accordion.mjs.map +1 -1
  190. package/dist/ui/input-group.d.ts +1 -1
  191. package/package.json +19 -5
  192. package/dist/.tsbuildinfo +0 -1
@@ -1,44 +1,80 @@
1
1
  "use client";
2
2
  import { jsx, jsxs } from "react/jsx-runtime";
3
- import { Field, FieldContent, FieldLabel, FieldLegend, FieldSet } from "../../../ui/field.mjs";
3
+ import { useState } from "react";
4
+ import { Button } from "../../../ui/button.mjs";
5
+ import {
6
+ Field,
7
+ FieldContent,
8
+ FieldLabel,
9
+ FieldLegend,
10
+ FieldSet
11
+ } from "../../../ui/field.mjs";
12
+ import { Input } from "../../../ui/input.mjs";
4
13
  import { RadioGroup, RadioGroupItem } from "../../../ui/radio-group.mjs";
14
+ import { formatMoney, isAvailableMoney } from "../../../lib/money.mjs";
5
15
  import { CheckoutFieldFeedback } from "./checkout-field-feedback.mjs";
16
+ import { useCheckoutIds } from "./checkout-id-context.mjs";
6
17
  function CheckoutPaymentStep({
7
- values,
8
- onChange,
9
- labels,
10
18
  paymentMethods = [],
19
+ paymentState = "idle",
20
+ paymentMethod,
21
+ onSelectPaymentMethod,
22
+ onRetryPayment,
23
+ adjustmentPayments,
24
+ onApplyGiftCard,
25
+ giftCardState = "idle",
26
+ giftCardMessage,
27
+ onRemoveAdjustment,
28
+ storeCredit,
29
+ labels,
30
+ formatMoney: formatMoneyProp,
11
31
  fieldErrors,
12
- fieldDescriptions
32
+ description
13
33
  }) {
14
- const selectedMethod = paymentMethods.find((method) => method.id === values.paymentMethod);
15
- return /* @__PURE__ */ jsxs(FieldSet, { children: [
16
- /* @__PURE__ */ jsx(FieldLegend, { children: labels.paymentMethodLegend }),
17
- paymentMethods.length === 0 ? /* @__PURE__ */ jsx("p", { className: "text-muted-foreground text-sm", children: labels.noPaymentMethodsLabel }) : /* @__PURE__ */ jsx(
34
+ const checkoutId = useCheckoutIds();
35
+ const [giftCardCode, setGiftCardCode] = useState("");
36
+ const selectedMethod = paymentMethods.find((method) => method.id === paymentMethod);
37
+ const pending = paymentState === "pending";
38
+ const failed = paymentState === "error";
39
+ const unavailable = paymentState === "unavailable";
40
+ return /* @__PURE__ */ jsxs(FieldSet, { className: "gap-3", children: [
41
+ /* @__PURE__ */ jsx(FieldLegend, { className: "mb-0", children: labels.paymentMethodLegend }),
42
+ pending ? /* @__PURE__ */ jsx("p", { className: "text-muted-foreground text-sm", role: "status", children: labels.paymentLoadingLabel }) : failed ? /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-2", role: "alert", children: [
43
+ /* @__PURE__ */ jsx("p", { className: "text-destructive text-sm", children: labels.paymentErrorLabel }),
44
+ onRetryPayment ? /* @__PURE__ */ jsx(Button, { type: "button", variant: "outline", size: "sm", className: "w-fit", onClick: onRetryPayment, children: labels.retryLabel }) : null
45
+ ] }) : unavailable ? /* @__PURE__ */ jsx("p", { className: "text-muted-foreground text-sm", role: "status", children: labels.paymentUnavailableLabel }) : paymentMethods.length === 0 ? /* @__PURE__ */ jsx("p", { className: "text-muted-foreground text-sm", children: labels.noPaymentMethodsLabel }) : /* @__PURE__ */ jsx(
18
46
  RadioGroup,
19
47
  {
20
- value: values.paymentMethod,
21
- onValueChange: (value) => value && onChange("paymentMethod", String(value)),
48
+ value: paymentMethod,
49
+ onValueChange: (value) => value && onSelectPaymentMethod(String(value)),
22
50
  className: "grid grid-cols-1 gap-3",
23
51
  children: paymentMethods.map((method) => {
24
- const unavailable = method.isEnabled === false;
52
+ const disabled = method.isEnabled === false;
25
53
  return /* @__PURE__ */ jsxs(
26
54
  Field,
27
55
  {
28
56
  orientation: "horizontal",
29
57
  className: "flex-wrap items-start justify-between gap-3 rounded-lg border p-4",
30
58
  children: [
31
- /* @__PURE__ */ jsx(FieldContent, { className: "min-w-0", children: /* @__PURE__ */ jsxs(FieldLabel, { htmlFor: `payment-${method.id}`, className: "flex flex-col gap-0.5", children: [
32
- /* @__PURE__ */ jsx("span", { children: method.name }),
33
- method.description ? /* @__PURE__ */ jsx("span", { className: "text-muted-foreground text-xs font-normal", children: method.description }) : null,
34
- unavailable ? /* @__PURE__ */ jsx("span", { className: "text-muted-foreground text-xs font-normal", children: labels.unavailableMethodLabel }) : null
35
- ] }) }),
59
+ /* @__PURE__ */ jsx(FieldContent, { className: "min-w-0", children: /* @__PURE__ */ jsxs(
60
+ FieldLabel,
61
+ {
62
+ htmlFor: checkoutId(`payment-${method.id}`),
63
+ className: "flex flex-col items-start gap-0.5 text-left",
64
+ children: [
65
+ /* @__PURE__ */ jsx("span", { children: method.name }),
66
+ method.description ? /* @__PURE__ */ jsx("span", { className: "text-muted-foreground text-xs font-normal", children: method.description }) : null,
67
+ disabled ? /* @__PURE__ */ jsx("span", { className: "text-muted-foreground text-xs font-normal", children: labels.unavailableMethodLabel }) : null
68
+ ]
69
+ }
70
+ ) }),
36
71
  /* @__PURE__ */ jsx(
37
72
  RadioGroupItem,
38
73
  {
39
74
  value: method.id,
40
- id: `payment-${method.id}`,
41
- disabled: unavailable
75
+ id: checkoutId(`payment-${method.id}`),
76
+ "data-checkout-payment-method": method.id,
77
+ disabled
42
78
  }
43
79
  )
44
80
  ]
@@ -48,19 +84,94 @@ function CheckoutPaymentStep({
48
84
  })
49
85
  }
50
86
  ),
51
- selectedMethod ? /* @__PURE__ */ jsxs("div", { className: "bg-muted/50 rounded-lg p-4 text-sm", children: [
52
- /* @__PURE__ */ jsx("p", { className: "font-medium", children: selectedMethod.name }),
53
- selectedMethod.description ? /* @__PURE__ */ jsx("p", { className: "text-muted-foreground mt-1", children: selectedMethod.description }) : null,
54
- selectedMethod.requiresSetup ? /* @__PURE__ */ jsx("p", { className: "text-muted-foreground mt-1 text-xs", children: labels.requiresSetupLabel }) : null
55
- ] }) : null,
56
- /* @__PURE__ */ jsx(Field, { "data-invalid": !!fieldErrors?.paymentMethod?.length, children: /* @__PURE__ */ jsx(
57
- CheckoutFieldFeedback,
58
- {
59
- id: "checkout-payment-method",
60
- errors: fieldErrors?.paymentMethod,
61
- description: fieldDescriptions?.paymentMethod
62
- }
63
- ) })
87
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-6", children: [
88
+ selectedMethod ? /* @__PURE__ */ jsxs("div", { className: "bg-muted/50 rounded-lg p-4 text-sm", children: [
89
+ /* @__PURE__ */ jsx("p", { className: "font-medium", children: selectedMethod.name }),
90
+ selectedMethod.description ? /* @__PURE__ */ jsx("p", { className: "text-muted-foreground mt-1", children: selectedMethod.description }) : null,
91
+ selectedMethod.requiresSetup ? /* @__PURE__ */ jsx("p", { className: "text-muted-foreground mt-1 text-xs", children: labels.requiresSetupLabel }) : null
92
+ ] }) : null,
93
+ /* @__PURE__ */ jsx(Field, { "data-invalid": !!fieldErrors?.length, children: /* @__PURE__ */ jsx(
94
+ CheckoutFieldFeedback,
95
+ {
96
+ id: checkoutId("checkout-payment-method"),
97
+ errors: fieldErrors,
98
+ description
99
+ }
100
+ ) }),
101
+ onApplyGiftCard ? /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-2 rounded-lg border p-4", children: [
102
+ /* @__PURE__ */ jsx("p", { className: "text-sm font-medium", children: labels.giftCardLabel }),
103
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap gap-2", children: [
104
+ /* @__PURE__ */ jsx(
105
+ Input,
106
+ {
107
+ id: checkoutId("checkout-gift-card"),
108
+ value: giftCardCode,
109
+ placeholder: labels.giftCardPlaceholder,
110
+ onChange: (e) => setGiftCardCode(e.target.value),
111
+ className: "min-w-0 flex-1"
112
+ }
113
+ ),
114
+ /* @__PURE__ */ jsx(
115
+ Button,
116
+ {
117
+ type: "button",
118
+ variant: "outline",
119
+ disabled: giftCardState === "pending" || giftCardCode.trim() === "",
120
+ onClick: () => onApplyGiftCard(giftCardCode.trim()),
121
+ children: labels.applyLabel
122
+ }
123
+ )
124
+ ] }),
125
+ giftCardMessage ? /* @__PURE__ */ jsx(
126
+ "p",
127
+ {
128
+ className: giftCardState === "invalid" ? "text-destructive text-sm" : "text-muted-foreground text-sm",
129
+ role: giftCardState === "invalid" ? "alert" : "status",
130
+ children: giftCardMessage
131
+ }
132
+ ) : null
133
+ ] }) : null,
134
+ adjustmentPayments && adjustmentPayments.length > 0 ? /* @__PURE__ */ jsx("div", { className: "flex flex-col gap-2", children: adjustmentPayments.map((adjustment) => /* @__PURE__ */ jsxs(
135
+ "div",
136
+ {
137
+ className: "flex flex-wrap items-center justify-between gap-2 rounded-lg border px-4 py-3 text-sm",
138
+ children: [
139
+ /* @__PURE__ */ jsx("span", { children: adjustment.label }),
140
+ /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-3", children: [
141
+ /* @__PURE__ */ jsx("span", { className: "tabular-nums", children: formatMoney(adjustment.amount, formatMoneyProp) }),
142
+ onRemoveAdjustment ? /* @__PURE__ */ jsx(
143
+ Button,
144
+ {
145
+ type: "button",
146
+ variant: "ghost",
147
+ size: "sm",
148
+ onClick: () => onRemoveAdjustment(adjustment.id),
149
+ children: labels.removeLabel
150
+ }
151
+ ) : null
152
+ ] })
153
+ ]
154
+ },
155
+ adjustment.id
156
+ )) }) : null,
157
+ storeCredit ? /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-2 rounded-lg border p-4 text-sm", children: [
158
+ /* @__PURE__ */ jsx("p", { className: "font-medium", children: labels.storeCreditLabel }),
159
+ /* @__PURE__ */ jsxs("p", { className: "text-muted-foreground", children: [
160
+ labels.availableCreditLabel,
161
+ ": ",
162
+ formatMoney(storeCredit.available, formatMoneyProp)
163
+ ] }),
164
+ isAvailableMoney(storeCredit.applied) ? /* @__PURE__ */ jsxs("p", { children: [
165
+ labels.applyLabel,
166
+ ": ",
167
+ formatMoney(storeCredit.applied, formatMoneyProp)
168
+ ] }) : null,
169
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap gap-2", children: [
170
+ storeCredit.onApply ? /* @__PURE__ */ jsx(Button, { type: "button", variant: "outline", size: "sm", onClick: storeCredit.onApply, children: labels.applyLabel }) : null,
171
+ storeCredit.onRemove ? /* @__PURE__ */ jsx(Button, { type: "button", variant: "ghost", size: "sm", onClick: storeCredit.onRemove, children: labels.removeLabel }) : null
172
+ ] })
173
+ ] }) : null
174
+ ] })
64
175
  ] });
65
176
  }
66
177
  export {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/blocks/e-commerce/checkout-forms/checkout-payment-step.tsx"],"sourcesContent":["'use client'\n\nimport { Field, FieldContent, FieldLabel, FieldLegend, FieldSet } from '../../../ui/field'\nimport { RadioGroup, RadioGroupItem } from '../../../ui/radio-group'\nimport { CheckoutFieldFeedback, checkoutFieldAria } from './checkout-field-feedback'\nimport type { PaymentMethod } from '@thorprovider/types'\nimport type {\n CheckoutChangeHandler,\n CheckoutFieldDescriptions,\n CheckoutValuesFieldErrors,\n CheckoutLabels,\n CheckoutValues,\n} from './checkout'\n\nexport interface CheckoutPaymentStepProps {\n values: CheckoutValues\n onChange: CheckoutChangeHandler\n labels: CheckoutLabels\n paymentMethods?: PaymentMethod[]\n fieldErrors?: CheckoutValuesFieldErrors\n fieldDescriptions?: CheckoutFieldDescriptions\n}\n\nexport function CheckoutPaymentStep({\n values,\n onChange,\n labels,\n paymentMethods = [],\n fieldErrors,\n fieldDescriptions,\n}: CheckoutPaymentStepProps) {\n const selectedMethod = paymentMethods.find((method) => method.id === values.paymentMethod)\n\n return (\n <FieldSet>\n <FieldLegend>{labels.paymentMethodLegend}</FieldLegend>\n {paymentMethods.length === 0 ? (\n <p className=\"text-muted-foreground text-sm\">{labels.noPaymentMethodsLabel}</p>\n ) : (\n <RadioGroup\n value={values.paymentMethod}\n onValueChange={(value) => value && onChange('paymentMethod', String(value))}\n className=\"grid grid-cols-1 gap-3\"\n >\n {paymentMethods.map((method) => {\n const unavailable = method.isEnabled === false\n return (\n <Field\n key={method.id}\n orientation=\"horizontal\"\n className=\"flex-wrap items-start justify-between gap-3 rounded-lg border p-4\"\n >\n <FieldContent className=\"min-w-0\">\n <FieldLabel htmlFor={`payment-${method.id}`} className=\"flex flex-col gap-0.5\">\n <span>{method.name}</span>\n {method.description ? (\n <span className=\"text-muted-foreground text-xs font-normal\">\n {method.description}\n </span>\n ) : null}\n {unavailable ? (\n <span className=\"text-muted-foreground text-xs font-normal\">\n {labels.unavailableMethodLabel}\n </span>\n ) : null}\n </FieldLabel>\n </FieldContent>\n <RadioGroupItem\n value={method.id}\n id={`payment-${method.id}`}\n disabled={unavailable}\n />\n </Field>\n )\n })}\n </RadioGroup>\n )}\n\n {selectedMethod ? (\n <div className=\"bg-muted/50 rounded-lg p-4 text-sm\">\n <p className=\"font-medium\">{selectedMethod.name}</p>\n {selectedMethod.description ? (\n <p className=\"text-muted-foreground mt-1\">{selectedMethod.description}</p>\n ) : null}\n {selectedMethod.requiresSetup ? (\n <p className=\"text-muted-foreground mt-1 text-xs\">{labels.requiresSetupLabel}</p>\n ) : null}\n </div>\n ) : null}\n\n <Field data-invalid={!!fieldErrors?.paymentMethod?.length}>\n <CheckoutFieldFeedback\n id=\"checkout-payment-method\"\n errors={fieldErrors?.paymentMethod}\n description={fieldDescriptions?.paymentMethod}\n />\n </Field>\n </FieldSet>\n )\n}\n"],"mappings":";AAmCM,cAkBY,YAlBZ;AAjCN,SAAS,OAAO,cAAc,YAAY,aAAa,gBAAgB;AACvE,SAAS,YAAY,sBAAsB;AAC3C,SAAS,6BAAgD;AAmBlD,SAAS,oBAAoB;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AAAA,EACA,iBAAiB,CAAC;AAAA,EAClB;AAAA,EACA;AACF,GAA6B;AAC3B,QAAM,iBAAiB,eAAe,KAAK,CAAC,WAAW,OAAO,OAAO,OAAO,aAAa;AAEzF,SACE,qBAAC,YACC;AAAA,wBAAC,eAAa,iBAAO,qBAAoB;AAAA,IACxC,eAAe,WAAW,IACzB,oBAAC,OAAE,WAAU,iCAAiC,iBAAO,uBAAsB,IAE3E;AAAA,MAAC;AAAA;AAAA,QACC,OAAO,OAAO;AAAA,QACd,eAAe,CAAC,UAAU,SAAS,SAAS,iBAAiB,OAAO,KAAK,CAAC;AAAA,QAC1E,WAAU;AAAA,QAET,yBAAe,IAAI,CAAC,WAAW;AAC9B,gBAAM,cAAc,OAAO,cAAc;AACzC,iBACE;AAAA,YAAC;AAAA;AAAA,cAEC,aAAY;AAAA,cACZ,WAAU;AAAA,cAEV;AAAA,oCAAC,gBAAa,WAAU,WACtB,+BAAC,cAAW,SAAS,WAAW,OAAO,EAAE,IAAI,WAAU,yBACrD;AAAA,sCAAC,UAAM,iBAAO,MAAK;AAAA,kBAClB,OAAO,cACN,oBAAC,UAAK,WAAU,6CACb,iBAAO,aACV,IACE;AAAA,kBACH,cACC,oBAAC,UAAK,WAAU,6CACb,iBAAO,wBACV,IACE;AAAA,mBACN,GACF;AAAA,gBACA;AAAA,kBAAC;AAAA;AAAA,oBACC,OAAO,OAAO;AAAA,oBACd,IAAI,WAAW,OAAO,EAAE;AAAA,oBACxB,UAAU;AAAA;AAAA,gBACZ;AAAA;AAAA;AAAA,YAvBK,OAAO;AAAA,UAwBd;AAAA,QAEJ,CAAC;AAAA;AAAA,IACH;AAAA,IAGD,iBACC,qBAAC,SAAI,WAAU,sCACb;AAAA,0BAAC,OAAE,WAAU,eAAe,yBAAe,MAAK;AAAA,MAC/C,eAAe,cACd,oBAAC,OAAE,WAAU,8BAA8B,yBAAe,aAAY,IACpE;AAAA,MACH,eAAe,gBACd,oBAAC,OAAE,WAAU,sCAAsC,iBAAO,oBAAmB,IAC3E;AAAA,OACN,IACE;AAAA,IAEJ,oBAAC,SAAM,gBAAc,CAAC,CAAC,aAAa,eAAe,QACjD;AAAA,MAAC;AAAA;AAAA,QACC,IAAG;AAAA,QACH,QAAQ,aAAa;AAAA,QACrB,aAAa,mBAAmB;AAAA;AAAA,IAClC,GACF;AAAA,KACF;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../../src/blocks/e-commerce/checkout-forms/checkout-payment-step.tsx"],"sourcesContent":["'use client'\n\nimport { useState } from 'react'\nimport { Button } from '../../../ui/button'\nimport {\n Field,\n FieldContent,\n FieldLabel,\n FieldLegend,\n FieldSet,\n} from '../../../ui/field'\nimport { Input } from '../../../ui/input'\nimport { RadioGroup, RadioGroupItem } from '../../../ui/radio-group'\nimport { formatMoney, isAvailableMoney } from '../../../lib/money'\nimport type { CheckoutAdjustmentPayment, Money, PaymentMethod } from '@thorprovider/types'\nimport { CheckoutFieldFeedback } from './checkout-field-feedback'\nimport { useCheckoutIds } from './checkout-id-context'\nimport type { CheckoutFieldError } from './checkout-form-types'\nimport type { CheckoutLabels } from './checkout'\n\nexport interface CheckoutPaymentStepProps {\n paymentMethods?: PaymentMethod[]\n paymentState?: 'idle' | 'pending' | 'error' | 'unavailable'\n paymentMethod: string\n onSelectPaymentMethod: (id: string) => void\n onRetryPayment?: () => void\n adjustmentPayments?: CheckoutAdjustmentPayment[]\n onApplyGiftCard?: (code: string) => void\n giftCardState?: 'idle' | 'pending' | 'valid' | 'invalid'\n giftCardMessage?: string\n onRemoveAdjustment?: (id: string) => void\n storeCredit?: {\n available: Money\n applied?: Money\n onApply?: () => void\n onRemove?: () => void\n }\n labels: CheckoutLabels\n formatMoney?: (money: Money) => string\n fieldErrors?: CheckoutFieldError[]\n description?: string\n}\n\nexport function CheckoutPaymentStep({\n paymentMethods = [],\n paymentState = 'idle',\n paymentMethod,\n onSelectPaymentMethod,\n onRetryPayment,\n adjustmentPayments,\n onApplyGiftCard,\n giftCardState = 'idle',\n giftCardMessage,\n onRemoveAdjustment,\n storeCredit,\n labels,\n formatMoney: formatMoneyProp,\n fieldErrors,\n description,\n}: CheckoutPaymentStepProps) {\n const checkoutId = useCheckoutIds()\n const [giftCardCode, setGiftCardCode] = useState('')\n const selectedMethod = paymentMethods.find((method) => method.id === paymentMethod)\n const pending = paymentState === 'pending'\n const failed = paymentState === 'error'\n const unavailable = paymentState === 'unavailable'\n\n return (\n <FieldSet className=\"gap-3\">\n <FieldLegend className=\"mb-0\">{labels.paymentMethodLegend}</FieldLegend>\n\n {pending ? (\n <p className=\"text-muted-foreground text-sm\" role=\"status\">\n {labels.paymentLoadingLabel}\n </p>\n ) : failed ? (\n <div className=\"flex flex-col gap-2\" role=\"alert\">\n <p className=\"text-destructive text-sm\">{labels.paymentErrorLabel}</p>\n {onRetryPayment ? (\n <Button type=\"button\" variant=\"outline\" size=\"sm\" className=\"w-fit\" onClick={onRetryPayment}>\n {labels.retryLabel}\n </Button>\n ) : null}\n </div>\n ) : unavailable ? (\n <p className=\"text-muted-foreground text-sm\" role=\"status\">\n {labels.paymentUnavailableLabel}\n </p>\n ) : paymentMethods.length === 0 ? (\n <p className=\"text-muted-foreground text-sm\">{labels.noPaymentMethodsLabel}</p>\n ) : (\n <RadioGroup\n value={paymentMethod}\n onValueChange={(value) => value && onSelectPaymentMethod(String(value))}\n className=\"grid grid-cols-1 gap-3\"\n >\n {paymentMethods.map((method) => {\n const disabled = method.isEnabled === false\n return (\n <Field\n key={method.id}\n orientation=\"horizontal\"\n className=\"flex-wrap items-start justify-between gap-3 rounded-lg border p-4\"\n >\n <FieldContent className=\"min-w-0\">\n <FieldLabel\n htmlFor={checkoutId(`payment-${method.id}`)}\n className=\"flex flex-col items-start gap-0.5 text-left\"\n >\n <span>{method.name}</span>\n {method.description ? (\n <span className=\"text-muted-foreground text-xs font-normal\">\n {method.description}\n </span>\n ) : null}\n {disabled ? (\n <span className=\"text-muted-foreground text-xs font-normal\">\n {labels.unavailableMethodLabel}\n </span>\n ) : null}\n </FieldLabel>\n </FieldContent>\n <RadioGroupItem\n value={method.id}\n id={checkoutId(`payment-${method.id}`)}\n data-checkout-payment-method={method.id}\n disabled={disabled}\n />\n </Field>\n )\n })}\n </RadioGroup>\n )}\n\n <div className=\"flex flex-col gap-6\">\n {selectedMethod ? (\n <div className=\"bg-muted/50 rounded-lg p-4 text-sm\">\n <p className=\"font-medium\">{selectedMethod.name}</p>\n {selectedMethod.description ? (\n <p className=\"text-muted-foreground mt-1\">{selectedMethod.description}</p>\n ) : null}\n {selectedMethod.requiresSetup ? (\n <p className=\"text-muted-foreground mt-1 text-xs\">{labels.requiresSetupLabel}</p>\n ) : null}\n </div>\n ) : null}\n\n <Field data-invalid={!!fieldErrors?.length}>\n <CheckoutFieldFeedback\n id={checkoutId('checkout-payment-method')}\n errors={fieldErrors}\n description={description}\n />\n </Field>\n\n {onApplyGiftCard ? (\n <div className=\"flex flex-col gap-2 rounded-lg border p-4\">\n <p className=\"text-sm font-medium\">{labels.giftCardLabel}</p>\n <div className=\"flex flex-wrap gap-2\">\n <Input\n id={checkoutId('checkout-gift-card')}\n value={giftCardCode}\n placeholder={labels.giftCardPlaceholder}\n onChange={(e) => setGiftCardCode(e.target.value)}\n className=\"min-w-0 flex-1\"\n />\n <Button\n type=\"button\"\n variant=\"outline\"\n disabled={giftCardState === 'pending' || giftCardCode.trim() === ''}\n onClick={() => onApplyGiftCard(giftCardCode.trim())}\n >\n {labels.applyLabel}\n </Button>\n </div>\n {giftCardMessage ? (\n <p\n className={giftCardState === 'invalid' ? 'text-destructive text-sm' : 'text-muted-foreground text-sm'}\n role={giftCardState === 'invalid' ? 'alert' : 'status'}\n >\n {giftCardMessage}\n </p>\n ) : null}\n </div>\n ) : null}\n\n {adjustmentPayments && adjustmentPayments.length > 0 ? (\n <div className=\"flex flex-col gap-2\">\n {adjustmentPayments.map((adjustment) => (\n <div\n key={adjustment.id}\n className=\"flex flex-wrap items-center justify-between gap-2 rounded-lg border px-4 py-3 text-sm\"\n >\n <span>{adjustment.label}</span>\n <span className=\"flex items-center gap-3\">\n <span className=\"tabular-nums\">\n {formatMoney(adjustment.amount, formatMoneyProp)}\n </span>\n {onRemoveAdjustment ? (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => onRemoveAdjustment(adjustment.id)}\n >\n {labels.removeLabel}\n </Button>\n ) : null}\n </span>\n </div>\n ))}\n </div>\n ) : null}\n\n {storeCredit ? (\n <div className=\"flex flex-col gap-2 rounded-lg border p-4 text-sm\">\n <p className=\"font-medium\">{labels.storeCreditLabel}</p>\n <p className=\"text-muted-foreground\">\n {labels.availableCreditLabel}: {formatMoney(storeCredit.available, formatMoneyProp)}\n </p>\n {isAvailableMoney(storeCredit.applied) ? (\n <p>\n {labels.applyLabel}: {formatMoney(storeCredit.applied, formatMoneyProp)}\n </p>\n ) : null}\n <div className=\"flex flex-wrap gap-2\">\n {storeCredit.onApply ? (\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={storeCredit.onApply}>\n {labels.applyLabel}\n </Button>\n ) : null}\n {storeCredit.onRemove ? (\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" onClick={storeCredit.onRemove}>\n {labels.removeLabel}\n </Button>\n ) : null}\n </div>\n </div>\n ) : null}\n </div>\n </FieldSet>\n )\n}\n"],"mappings":"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","names":[]}
@@ -1,11 +1,17 @@
1
- import type { PaymentMethod } from '@thorprovider/types';
2
- import type { CheckoutLabels, CheckoutShippingOption, CheckoutValues } from './checkout';
1
+ import type { CheckoutAddressValues, CheckoutAdjustmentPayment, CheckoutContactValues, CheckoutShippingGroup, Money, PaymentMethod } from '@thorprovider/types';
2
+ import type { CheckoutLabels, CheckoutOrderSummary } from './checkout';
3
3
  export interface CheckoutReviewStepProps {
4
- values: CheckoutValues;
5
- labels: CheckoutLabels;
6
- selectedShippingOptionId?: string;
7
- shippingOptions?: CheckoutShippingOption[];
4
+ contact: CheckoutContactValues;
5
+ shippingAddress: CheckoutAddressValues;
6
+ billingAddress?: CheckoutAddressValues;
7
+ sameAsShipping: boolean;
8
+ shippingGroups?: CheckoutShippingGroup[];
9
+ paymentMethod: string;
8
10
  paymentMethods?: PaymentMethod[];
11
+ adjustmentPayments?: CheckoutAdjustmentPayment[];
12
+ orderSummary?: CheckoutOrderSummary;
13
+ labels: CheckoutLabels;
14
+ formatMoney?: (money: Money) => string;
9
15
  }
10
- export declare function CheckoutReviewStep({ values, labels, selectedShippingOptionId, shippingOptions, paymentMethods, }: CheckoutReviewStepProps): import("react").JSX.Element;
16
+ export declare function CheckoutReviewStep({ contact, shippingAddress, billingAddress, sameAsShipping, shippingGroups, paymentMethod, paymentMethods, adjustmentPayments, orderSummary, labels, formatMoney: formatMoneyProp, }: CheckoutReviewStepProps): import("react").JSX.Element;
11
17
  //# sourceMappingURL=checkout-review-step.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"checkout-review-step.d.ts","sourceRoot":"","sources":["../../../../src/blocks/e-commerce/checkout-forms/checkout-review-step.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACxD,OAAO,KAAK,EAAE,cAAc,EAAE,sBAAsB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAExF,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,cAAc,CAAA;IACtB,MAAM,EAAE,cAAc,CAAA;IACtB,wBAAwB,CAAC,EAAE,MAAM,CAAA;IACjC,eAAe,CAAC,EAAE,sBAAsB,EAAE,CAAA;IAC1C,cAAc,CAAC,EAAE,aAAa,EAAE,CAAA;CACjC;AAED,wBAAgB,kBAAkB,CAAC,EACjC,MAAM,EACN,MAAM,EACN,wBAAwB,EACxB,eAAe,EACf,cAAc,GACf,EAAE,uBAAuB,+BAuCzB"}
1
+ {"version":3,"file":"checkout-review-step.d.ts","sourceRoot":"","sources":["../../../../src/blocks/e-commerce/checkout-forms/checkout-review-step.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,qBAAqB,EACrB,yBAAyB,EACzB,qBAAqB,EACrB,qBAAqB,EACrB,KAAK,EACL,aAAa,EACd,MAAM,qBAAqB,CAAA;AAC5B,OAAO,KAAK,EACV,cAAc,EAEd,oBAAoB,EACrB,MAAM,YAAY,CAAA;AAEnB,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,qBAAqB,CAAA;IAC9B,eAAe,EAAE,qBAAqB,CAAA;IACtC,cAAc,CAAC,EAAE,qBAAqB,CAAA;IACtC,cAAc,EAAE,OAAO,CAAA;IACvB,cAAc,CAAC,EAAE,qBAAqB,EAAE,CAAA;IACxC,aAAa,EAAE,MAAM,CAAA;IACrB,cAAc,CAAC,EAAE,aAAa,EAAE,CAAA;IAChC,kBAAkB,CAAC,EAAE,yBAAyB,EAAE,CAAA;IAChD,YAAY,CAAC,EAAE,oBAAoB,CAAA;IACnC,MAAM,EAAE,cAAc,CAAA;IACtB,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,MAAM,CAAA;CACvC;AA4FD,wBAAgB,kBAAkB,CAAC,EACjC,OAAO,EACP,eAAe,EACf,cAAc,EACd,cAAc,EACd,cAAc,EACd,aAAa,EACb,cAAc,EACd,kBAAkB,EAClB,YAAY,EACZ,MAAM,EACN,WAAW,EAAE,eAAe,GAC7B,EAAE,uBAAuB,+BAqMzB"}
@@ -23,38 +23,189 @@ __export(checkout_review_step_exports, {
23
23
  });
24
24
  module.exports = __toCommonJS(checkout_review_step_exports);
25
25
  var import_jsx_runtime = require("react/jsx-runtime");
26
+ var import_money = require("../../../lib/money.js");
27
+ function resolveGroupMembership(groups, lines) {
28
+ if (!lines?.length || groups.some((group) => !group.items?.length)) return null;
29
+ const linesById = new Map(lines.map((line) => [String(line.id), line]));
30
+ const assigned = /* @__PURE__ */ new Map();
31
+ const itemsByGroup = /* @__PURE__ */ new Map();
32
+ for (const group of groups) {
33
+ const groupItems = [];
34
+ for (const item of group.items ?? []) {
35
+ const line = linesById.get(item.lineId);
36
+ if (!line) return null;
37
+ const quantity = item.quantity ?? line.quantity;
38
+ if (!Number.isInteger(quantity) || quantity <= 0 || quantity > line.quantity) {
39
+ return null;
40
+ }
41
+ assigned.set(item.lineId, (assigned.get(item.lineId) ?? 0) + quantity);
42
+ groupItems.push({
43
+ line,
44
+ quantity,
45
+ showLineTotal: quantity === line.quantity
46
+ });
47
+ }
48
+ itemsByGroup.set(group.id, groupItems);
49
+ }
50
+ for (const line of lines) {
51
+ if ((assigned.get(String(line.id)) ?? 0) !== line.quantity) return null;
52
+ }
53
+ return itemsByGroup;
54
+ }
55
+ function formatAddress(address) {
56
+ return [
57
+ [address.firstName, address.lastName].filter(Boolean).join(" "),
58
+ address.company,
59
+ address.address1,
60
+ address.address2,
61
+ [address.city, address.province, address.postalCode].filter(Boolean).join(" "),
62
+ address.countryCode,
63
+ address.phone
64
+ ].filter(Boolean).join(", ");
65
+ }
66
+ function groupHeading(labels, group, index, total) {
67
+ const sequence = labels.reviewGroupLabel.replace("{n}", String(index + 1)).replace("{total}", String(total));
68
+ return group.label ? `${sequence} \xB7 ${group.label}` : sequence;
69
+ }
70
+ function deliveryText(group, labels, formatMoneyProp) {
71
+ const selected = group.options.find((option) => option.id === group.selectedOptionId);
72
+ if (!selected) return "";
73
+ const details = [selected.name];
74
+ if (selected.estimatedDays) details.push(selected.estimatedDays);
75
+ if ((0, import_money.isAvailableMoney)(selected.price)) {
76
+ const price = (0, import_money.formatMoney)(selected.price, formatMoneyProp);
77
+ if (price) details.push(price);
78
+ }
79
+ return group.label ? `${group.label}: ${details.join(" \xB7 ")}` : details.join(" \xB7 ");
80
+ }
26
81
  function CheckoutReviewStep({
27
- values,
82
+ contact,
83
+ shippingAddress,
84
+ billingAddress,
85
+ sameAsShipping,
86
+ shippingGroups,
87
+ paymentMethod,
88
+ paymentMethods,
89
+ adjustmentPayments,
90
+ orderSummary,
28
91
  labels,
29
- selectedShippingOptionId,
30
- shippingOptions,
31
- paymentMethods
92
+ formatMoney: formatMoneyProp
32
93
  }) {
33
- const shippingName = shippingOptions?.find(
34
- (method) => method.id === selectedShippingOptionId
35
- )?.name;
36
- const paymentName = paymentMethods?.find((method) => method.id === values.paymentMethod)?.name;
37
- const shipTo = [
38
- [values.firstName, values.lastName].filter(Boolean).join(" "),
39
- values.address,
40
- [values.city, values.state, values.zipCode].filter(Boolean).join(" "),
41
- values.country
42
- ].filter(Boolean).join(", ");
43
- const rows = [
44
- { label: labels.reviewContactLabel, value: values.email },
45
- { label: labels.reviewShipToLabel, value: shipTo },
46
- { label: labels.reviewPaymentLabel, value: paymentName ?? "" },
47
- { label: labels.reviewShippingLabel, value: shippingName ?? "" }
94
+ const groups = shippingGroups ?? [];
95
+ const multiGroup = groups.length > 1;
96
+ const membership = multiGroup ? resolveGroupMembership(groups, orderSummary?.items) : null;
97
+ const showFlatLines = !multiGroup || !membership;
98
+ const paymentName = paymentMethods?.find((method) => method.id === paymentMethod)?.name;
99
+ const contactName = [contact.firstName, contact.lastName].filter(Boolean).join(" ");
100
+ const singleDelivery = !multiGroup && groups[0] ? deliveryText(groups[0], labels, formatMoneyProp) : "";
101
+ const identityRows = [
102
+ {
103
+ label: labels.reviewContactLabel,
104
+ value: [contactName, contact.email, contact.phone].filter(Boolean).join(", ")
105
+ },
106
+ { label: labels.reviewShipToLabel, value: formatAddress(shippingAddress) },
107
+ {
108
+ label: labels.reviewBillingLabel,
109
+ value: sameAsShipping ? labels.reviewSameAsShippingLabel : billingAddress ? formatAddress(billingAddress) : ""
110
+ }
48
111
  ].filter((row) => row.value.trim() !== "");
49
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "bg-muted/50 rounded-lg p-6", children: [
50
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("h3", { className: "mb-4 font-medium", children: labels.reviewHeading }),
51
- rows.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-muted-foreground text-sm", children: labels.reviewEmptyLabel }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)("dl", { className: "flex flex-col gap-4 text-sm", children: rows.map((row) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { children: [
52
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("dt", { className: "inline font-medium", children: [
53
- row.label,
54
- ": "
55
- ] }),
56
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("dd", { className: "inline", children: row.value })
57
- ] }, row.label)) })
112
+ const paymentRows = [{ label: labels.reviewPaymentLabel, value: paymentName ?? "" }].filter(
113
+ (row) => row.value.trim() !== ""
114
+ );
115
+ const adjustments = (adjustmentPayments ?? []).filter(
116
+ (adjustment) => (0, import_money.isAvailableMoney)(adjustment.amount)
117
+ );
118
+ const hasSummary = identityRows.length > 0 || paymentRows.length > 0 || Boolean(singleDelivery) || multiGroup;
119
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "bg-muted/50 flex flex-col gap-6 rounded-lg p-6", children: [
120
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { children: !hasSummary ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-muted-foreground mt-2 text-sm", children: labels.reviewEmptyLabel }) : /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
121
+ identityRows.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("dl", { className: "mt-4 flex flex-col gap-4 text-sm", children: identityRows.map((row) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { children: [
122
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("dt", { className: "inline font-medium", children: [
123
+ row.label,
124
+ ": "
125
+ ] }),
126
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("dd", { className: "inline", children: row.value })
127
+ ] }, row.label)) }) : null,
128
+ multiGroup ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "mt-4", children: [
129
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("h3", { className: "font-medium", children: labels.reviewDeliveryGroupsLabel }),
130
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("ol", { className: "mt-3 flex flex-col gap-3", children: groups.map((group, index) => {
131
+ const selected = group.options.find(
132
+ (option) => option.id === group.selectedOptionId
133
+ );
134
+ const groupItems = membership?.get(group.id) ?? [];
135
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
136
+ "li",
137
+ {
138
+ className: "bg-background/60 rounded-md border p-4 text-sm",
139
+ "data-checkout-review-group": group.id,
140
+ children: [
141
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("h4", { className: "font-medium", children: groupHeading(labels, group, index, groups.length) }),
142
+ selected ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "mt-2 flex flex-wrap items-baseline justify-between gap-2", children: [
143
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { children: selected.name }),
144
+ selected.estimatedDays ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "text-muted-foreground text-xs", children: selected.estimatedDays }) : null,
145
+ (0, import_money.isAvailableMoney)(selected.price) ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "tabular-nums", children: (0, import_money.formatMoney)(selected.price, formatMoneyProp) }) : null
146
+ ] }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-muted-foreground mt-2 text-sm", children: group.unavailableReason ?? labels.groupUnavailableLabel }),
147
+ membership && groupItems.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "mt-3", children: [
148
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("h5", { className: "text-muted-foreground text-xs font-medium", children: labels.reviewGroupItemsLabel }),
149
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("ul", { className: "mt-1 flex flex-col gap-1", children: groupItems.map(({ line, quantity, showLineTotal }, itemIndex) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
150
+ "li",
151
+ {
152
+ className: "flex items-center justify-between gap-3",
153
+ children: [
154
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { children: [
155
+ line.name,
156
+ " \xD7 ",
157
+ quantity
158
+ ] }),
159
+ showLineTotal && (0, import_money.isAvailableMoney)(line.lineTotal) ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "tabular-nums", children: (0, import_money.formatMoney)(line.lineTotal, formatMoneyProp) }) : null
160
+ ]
161
+ },
162
+ `${group.id}-${String(line.id)}-${itemIndex}`
163
+ )) })
164
+ ] }) : null
165
+ ]
166
+ },
167
+ group.id
168
+ );
169
+ }) })
170
+ ] }) : singleDelivery ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("dl", { className: "mt-4 flex flex-col gap-4 text-sm", children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { children: [
171
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("dt", { className: "inline font-medium", children: [
172
+ labels.reviewShippingLabel,
173
+ ": "
174
+ ] }),
175
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("dd", { className: "inline", children: singleDelivery })
176
+ ] }) }) : null,
177
+ paymentRows.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("dl", { className: "mt-4 flex flex-col gap-4 text-sm", children: paymentRows.map((row) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { children: [
178
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("dt", { className: "inline font-medium", children: [
179
+ row.label,
180
+ ": "
181
+ ] }),
182
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("dd", { className: "inline", children: row.value })
183
+ ] }, row.label)) }) : null
184
+ ] }) }),
185
+ adjustments.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { children: [
186
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("h3", { className: "font-medium", children: labels.reviewAdjustmentsLabel }),
187
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("dl", { className: "mt-2 flex flex-col gap-2 text-sm", children: adjustments.map((adjustment) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex items-center justify-between gap-3", children: [
188
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("dt", { children: adjustment.label }),
189
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("dd", { className: "tabular-nums", children: (0, import_money.formatMoney)(adjustment.amount, formatMoneyProp) })
190
+ ] }, adjustment.id)) })
191
+ ] }) : null,
192
+ orderSummary?.items.length ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { children: [
193
+ showFlatLines ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
194
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("h3", { className: "font-medium", children: labels.reviewLinesLabel }),
195
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("dl", { className: "mt-2 flex flex-col gap-2 text-sm", children: orderSummary.items.map((item) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex items-center justify-between gap-3", children: [
196
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("dt", { children: [
197
+ item.name,
198
+ " \xD7 ",
199
+ item.quantity
200
+ ] }),
201
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("dd", { className: "tabular-nums", children: (0, import_money.isAvailableMoney)(item.lineTotal) ? (0, import_money.formatMoney)(item.lineTotal, formatMoneyProp) : labels.amountUnavailableLabel })
202
+ ] }, String(item.id))) })
203
+ ] }) : null,
204
+ (0, import_money.isAvailableMoney)(orderSummary.totals?.total) ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("dl", { className: "mt-2 flex items-center justify-between gap-3 border-t pt-2 text-sm font-medium", children: [
205
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("dt", { children: labels.totalLabel }),
206
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("dd", { className: "tabular-nums", children: (0, import_money.formatMoney)(orderSummary.totals.total, formatMoneyProp) })
207
+ ] }) : null
208
+ ] }) : null
58
209
  ] });
59
210
  }
60
211
  // Annotate the CommonJS export names for ESM import in node:
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/blocks/e-commerce/checkout-forms/checkout-review-step.tsx"],"sourcesContent":["'use client'\n\nimport type { PaymentMethod } from '@thorprovider/types'\nimport type { CheckoutLabels, CheckoutShippingOption, CheckoutValues } from './checkout'\n\nexport interface CheckoutReviewStepProps {\n values: CheckoutValues\n labels: CheckoutLabels\n selectedShippingOptionId?: string\n shippingOptions?: CheckoutShippingOption[]\n paymentMethods?: PaymentMethod[]\n}\n\nexport function CheckoutReviewStep({\n values,\n labels,\n selectedShippingOptionId,\n shippingOptions,\n paymentMethods,\n}: CheckoutReviewStepProps) {\n const shippingName = shippingOptions?.find(\n (method) => method.id === selectedShippingOptionId,\n )?.name\n const paymentName = paymentMethods?.find((method) => method.id === values.paymentMethod)?.name\n\n const shipTo = [\n [values.firstName, values.lastName].filter(Boolean).join(' '),\n values.address,\n [values.city, values.state, values.zipCode].filter(Boolean).join(' '),\n values.country,\n ]\n .filter(Boolean)\n .join(', ')\n\n const rows = [\n { label: labels.reviewContactLabel, value: values.email },\n { label: labels.reviewShipToLabel, value: shipTo },\n { label: labels.reviewPaymentLabel, value: paymentName ?? '' },\n { label: labels.reviewShippingLabel, value: shippingName ?? '' },\n ].filter((row) => row.value.trim() !== '')\n\n return (\n <div className=\"bg-muted/50 rounded-lg p-6\">\n <h3 className=\"mb-4 font-medium\">{labels.reviewHeading}</h3>\n {rows.length === 0 ? (\n <p className=\"text-muted-foreground text-sm\">{labels.reviewEmptyLabel}</p>\n ) : (\n <dl className=\"flex flex-col gap-4 text-sm\">\n {rows.map((row) => (\n <div key={row.label}>\n <dt className=\"inline font-medium\">{row.label}: </dt>\n <dd className=\"inline\">{row.value}</dd>\n </div>\n ))}\n </dl>\n )}\n </div>\n )\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AA2CM;AA9BC,SAAS,mBAAmB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA4B;AAC1B,QAAM,eAAe,iBAAiB;AAAA,IACpC,CAAC,WAAW,OAAO,OAAO;AAAA,EAC5B,GAAG;AACH,QAAM,cAAc,gBAAgB,KAAK,CAAC,WAAW,OAAO,OAAO,OAAO,aAAa,GAAG;AAE1F,QAAM,SAAS;AAAA,IACb,CAAC,OAAO,WAAW,OAAO,QAAQ,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,IAC5D,OAAO;AAAA,IACP,CAAC,OAAO,MAAM,OAAO,OAAO,OAAO,OAAO,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,IACpE,OAAO;AAAA,EACT,EACG,OAAO,OAAO,EACd,KAAK,IAAI;AAEZ,QAAM,OAAO;AAAA,IACX,EAAE,OAAO,OAAO,oBAAoB,OAAO,OAAO,MAAM;AAAA,IACxD,EAAE,OAAO,OAAO,mBAAmB,OAAO,OAAO;AAAA,IACjD,EAAE,OAAO,OAAO,oBAAoB,OAAO,eAAe,GAAG;AAAA,IAC7D,EAAE,OAAO,OAAO,qBAAqB,OAAO,gBAAgB,GAAG;AAAA,EACjE,EAAE,OAAO,CAAC,QAAQ,IAAI,MAAM,KAAK,MAAM,EAAE;AAEzC,SACE,6CAAC,SAAI,WAAU,8BACb;AAAA,gDAAC,QAAG,WAAU,oBAAoB,iBAAO,eAAc;AAAA,IACtD,KAAK,WAAW,IACf,4CAAC,OAAE,WAAU,iCAAiC,iBAAO,kBAAiB,IAEtE,4CAAC,QAAG,WAAU,+BACX,eAAK,IAAI,CAAC,QACT,6CAAC,SACC;AAAA,mDAAC,QAAG,WAAU,sBAAsB;AAAA,YAAI;AAAA,QAAM;AAAA,SAAE;AAAA,MAChD,4CAAC,QAAG,WAAU,UAAU,cAAI,OAAM;AAAA,SAF1B,IAAI,KAGd,CACD,GACH;AAAA,KAEJ;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../../src/blocks/e-commerce/checkout-forms/checkout-review-step.tsx"],"sourcesContent":["'use client'\n\nimport { formatMoney, isAvailableMoney } from '../../../lib/money'\nimport type {\n CheckoutAddressValues,\n CheckoutAdjustmentPayment,\n CheckoutContactValues,\n CheckoutShippingGroup,\n Money,\n PaymentMethod,\n} from '@thorprovider/types'\nimport type {\n CheckoutLabels,\n CheckoutOrderLine,\n CheckoutOrderSummary,\n} from './checkout'\n\nexport interface CheckoutReviewStepProps {\n contact: CheckoutContactValues\n shippingAddress: CheckoutAddressValues\n billingAddress?: CheckoutAddressValues\n sameAsShipping: boolean\n shippingGroups?: CheckoutShippingGroup[]\n paymentMethod: string\n paymentMethods?: PaymentMethod[]\n adjustmentPayments?: CheckoutAdjustmentPayment[]\n orderSummary?: CheckoutOrderSummary\n labels: CheckoutLabels\n formatMoney?: (money: Money) => string\n}\n\ninterface ResolvedGroupItem {\n line: CheckoutOrderLine\n quantity: number\n showLineTotal: boolean\n}\n\nfunction resolveGroupMembership(\n groups: CheckoutShippingGroup[],\n lines: CheckoutOrderLine[] | undefined,\n): Map<string, ResolvedGroupItem[]> | null {\n if (!lines?.length || groups.some((group) => !group.items?.length)) return null\n\n\n const linesById = new Map(lines.map((line) => [String(line.id), line]))\n const assigned = new Map<string, number>()\n const itemsByGroup = new Map<string, ResolvedGroupItem[]>()\n\n for (const group of groups) {\n const groupItems: ResolvedGroupItem[] = []\n for (const item of group.items ?? []) {\n const line = linesById.get(item.lineId)\n if (!line) return null\n\n const quantity = item.quantity ?? line.quantity\n if (!Number.isInteger(quantity) || quantity <= 0 || quantity > line.quantity) {\n return null\n }\n\n assigned.set(item.lineId, (assigned.get(item.lineId) ?? 0) + quantity)\n groupItems.push({\n line,\n quantity,\n showLineTotal: quantity === line.quantity,\n })\n }\n itemsByGroup.set(group.id, groupItems)\n }\n\n for (const line of lines) {\n if ((assigned.get(String(line.id)) ?? 0) !== line.quantity) return null\n }\n\n return itemsByGroup\n}\n\nfunction formatAddress(address: CheckoutAddressValues): string {\n return [\n [address.firstName, address.lastName].filter(Boolean).join(' '),\n address.company,\n address.address1,\n address.address2,\n [address.city, address.province, address.postalCode].filter(Boolean).join(' '),\n address.countryCode,\n address.phone,\n ]\n .filter(Boolean)\n .join(', ')\n}\n\nfunction groupHeading(\n labels: CheckoutLabels,\n group: CheckoutShippingGroup,\n index: number,\n total: number,\n): string {\n const sequence = labels.reviewGroupLabel\n .replace('{n}', String(index + 1))\n .replace('{total}', String(total))\n\n return group.label ? `${sequence} · ${group.label}` : sequence\n}\n\nfunction deliveryText(\n group: CheckoutShippingGroup,\n labels: CheckoutLabels,\n formatMoneyProp?: (money: Money) => string,\n): string {\n const selected = group.options.find((option) => option.id === group.selectedOptionId)\n if (!selected) return ''\n\n const details = [selected.name]\n if (selected.estimatedDays) details.push(selected.estimatedDays)\n if (isAvailableMoney(selected.price)) {\n const price = formatMoney(selected.price, formatMoneyProp)\n if (price) details.push(price)\n }\n\n return group.label ? `${group.label}: ${details.join(' · ')}` : details.join(' · ')\n}\n\nexport function CheckoutReviewStep({\n contact,\n shippingAddress,\n billingAddress,\n sameAsShipping,\n shippingGroups,\n paymentMethod,\n paymentMethods,\n adjustmentPayments,\n orderSummary,\n labels,\n formatMoney: formatMoneyProp,\n}: CheckoutReviewStepProps) {\n const groups = shippingGroups ?? []\n const multiGroup = groups.length > 1\n const membership = multiGroup ? resolveGroupMembership(groups, orderSummary?.items) : null\n const showFlatLines = !multiGroup || !membership\n const paymentName = paymentMethods?.find((method) => method.id === paymentMethod)?.name\n const contactName = [contact.firstName, contact.lastName].filter(Boolean).join(' ')\n const singleDelivery = !multiGroup && groups[0]\n ? deliveryText(groups[0], labels, formatMoneyProp)\n : ''\n\n const identityRows = [\n {\n label: labels.reviewContactLabel,\n value: [contactName, contact.email, contact.phone].filter(Boolean).join(', '),\n },\n { label: labels.reviewShipToLabel, value: formatAddress(shippingAddress) },\n {\n label: labels.reviewBillingLabel,\n value: sameAsShipping\n ? labels.reviewSameAsShippingLabel\n : billingAddress\n ? formatAddress(billingAddress)\n : '',\n },\n ].filter((row) => row.value.trim() !== '')\n\n const paymentRows = [{ label: labels.reviewPaymentLabel, value: paymentName ?? '' }].filter(\n (row) => row.value.trim() !== '',\n )\n\n const adjustments = (adjustmentPayments ?? []).filter((adjustment) =>\n isAvailableMoney(adjustment.amount),\n )\n\n const hasSummary =\n identityRows.length > 0 || paymentRows.length > 0 || Boolean(singleDelivery) || multiGroup\n\n return (\n <div className=\"bg-muted/50 flex flex-col gap-6 rounded-lg p-6\">\n <div>\n {!hasSummary ? (\n <p className=\"text-muted-foreground mt-2 text-sm\">{labels.reviewEmptyLabel}</p>\n ) : (\n <>\n {identityRows.length > 0 ? (\n <dl className=\"mt-4 flex flex-col gap-4 text-sm\">\n {identityRows.map((row) => (\n <div key={row.label}>\n <dt className=\"inline font-medium\">{row.label}: </dt>\n <dd className=\"inline\">{row.value}</dd>\n </div>\n ))}\n </dl>\n ) : null}\n\n {multiGroup ? (\n <div className=\"mt-4\">\n <h3 className=\"font-medium\">{labels.reviewDeliveryGroupsLabel}</h3>\n <ol className=\"mt-3 flex flex-col gap-3\">\n {groups.map((group, index) => {\n const selected = group.options.find(\n (option) => option.id === group.selectedOptionId,\n )\n const groupItems = membership?.get(group.id) ?? []\n\n return (\n <li\n key={group.id}\n className=\"bg-background/60 rounded-md border p-4 text-sm\"\n data-checkout-review-group={group.id}\n >\n <h4 className=\"font-medium\">\n {groupHeading(labels, group, index, groups.length)}\n </h4>\n\n {selected ? (\n <div className=\"mt-2 flex flex-wrap items-baseline justify-between gap-2\">\n <span>{selected.name}</span>\n {selected.estimatedDays ? (\n <span className=\"text-muted-foreground text-xs\">\n {selected.estimatedDays}\n </span>\n ) : null}\n {isAvailableMoney(selected.price) ? (\n <span className=\"tabular-nums\">\n {formatMoney(selected.price, formatMoneyProp)}\n </span>\n ) : null}\n </div>\n ) : (\n <p className=\"text-muted-foreground mt-2 text-sm\">\n {group.unavailableReason ?? labels.groupUnavailableLabel}\n </p>\n )}\n\n {membership && groupItems.length > 0 ? (\n <div className=\"mt-3\">\n <h5 className=\"text-muted-foreground text-xs font-medium\">\n {labels.reviewGroupItemsLabel}\n </h5>\n <ul className=\"mt-1 flex flex-col gap-1\">\n {groupItems.map(({ line, quantity, showLineTotal }, itemIndex) => (\n <li\n key={`${group.id}-${String(line.id)}-${itemIndex}`}\n className=\"flex items-center justify-between gap-3\"\n >\n <span>\n {line.name} × {quantity}\n </span>\n {showLineTotal && isAvailableMoney(line.lineTotal) ? (\n <span className=\"tabular-nums\">\n {formatMoney(line.lineTotal, formatMoneyProp)}\n </span>\n ) : null}\n </li>\n ))}\n </ul>\n </div>\n ) : null}\n </li>\n )\n })}\n </ol>\n </div>\n ) : singleDelivery ? (\n <dl className=\"mt-4 flex flex-col gap-4 text-sm\">\n <div>\n <dt className=\"inline font-medium\">{labels.reviewShippingLabel}: </dt>\n <dd className=\"inline\">{singleDelivery}</dd>\n </div>\n </dl>\n ) : null}\n\n {paymentRows.length > 0 ? (\n <dl className=\"mt-4 flex flex-col gap-4 text-sm\">\n {paymentRows.map((row) => (\n <div key={row.label}>\n <dt className=\"inline font-medium\">{row.label}: </dt>\n <dd className=\"inline\">{row.value}</dd>\n </div>\n ))}\n </dl>\n ) : null}\n </>\n )}\n </div>\n\n {adjustments.length > 0 ? (\n <div>\n <h3 className=\"font-medium\">{labels.reviewAdjustmentsLabel}</h3>\n <dl className=\"mt-2 flex flex-col gap-2 text-sm\">\n {adjustments.map((adjustment) => (\n <div key={adjustment.id} className=\"flex items-center justify-between gap-3\">\n <dt>{adjustment.label}</dt>\n <dd className=\"tabular-nums\">\n {formatMoney(adjustment.amount, formatMoneyProp)}\n </dd>\n </div>\n ))}\n </dl>\n </div>\n ) : null}\n\n {orderSummary?.items.length ? (\n <div>\n {showFlatLines ? (\n <>\n <h3 className=\"font-medium\">{labels.reviewLinesLabel}</h3>\n <dl className=\"mt-2 flex flex-col gap-2 text-sm\">\n {orderSummary.items.map((item) => (\n <div key={String(item.id)} className=\"flex items-center justify-between gap-3\">\n <dt>\n {item.name} × {item.quantity}\n </dt>\n <dd className=\"tabular-nums\">\n {isAvailableMoney(item.lineTotal)\n ? formatMoney(item.lineTotal, formatMoneyProp)\n : labels.amountUnavailableLabel}\n </dd>\n </div>\n ))}\n </dl>\n </>\n ) : null}\n {isAvailableMoney(orderSummary.totals?.total) ? (\n <dl className=\"mt-2 flex items-center justify-between gap-3 border-t pt-2 text-sm font-medium\">\n <dt>{labels.totalLabel}</dt>\n <dd className=\"tabular-nums\">\n {formatMoney(orderSummary.totals.total, formatMoneyProp)}\n </dd>\n </dl>\n ) : null}\n </div>\n ) : null}\n </div>\n )\n}\n"],"mappings":"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","names":[]}