@akinon/projectzero 2.0.0-beta.20 → 2.0.0-beta.22

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 (140) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/app-template/CHANGELOG.md +170 -0
  3. package/app-template/next.config.mjs +0 -1
  4. package/app-template/package.json +31 -30
  5. package/app-template/src/app/[pz]/[...prettyurl]/page.tsx +2 -2
  6. package/app-template/src/app/[pz]/account/layout.tsx +2 -1
  7. package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/blog/[slug]/page.tsx +4 -2
  8. package/app-template/src/app/[pz]/category/[pk]/page.tsx +11 -1
  9. package/app-template/src/app/[pz]/group-product/[pk]/page.tsx +2 -2
  10. package/app-template/src/app/[pz]/layout.tsx +3 -1
  11. package/app-template/src/app/[pz]/list/page.tsx +11 -1
  12. package/app-template/src/app/[pz]/page.tsx +13 -35
  13. package/app-template/src/app/[pz]/pages/[slug]/page.tsx +19 -0
  14. package/app-template/src/app/[pz]/product/[pk]/page.tsx +2 -2
  15. package/app-template/src/app/api/barcode-search/route.ts +1 -1
  16. package/app-template/src/app/api/cache/route.ts +1 -1
  17. package/app-template/src/app/api/image-proxy/route.ts +1 -1
  18. package/app-template/src/app/api/logout/route.ts +1 -1
  19. package/app-template/src/app/api/product-categories/route.ts +1 -1
  20. package/app-template/src/app/api/similar-product-list/route.ts +1 -1
  21. package/app-template/src/app/api/similar-products/route.ts +1 -1
  22. package/app-template/src/app/api/virtual-try-on/route.ts +1 -1
  23. package/app-template/src/app/api/web-vitals/route.ts +1 -1
  24. package/app-template/src/components/quantity-selector.tsx +16 -4
  25. package/app-template/src/components/widget-content.tsx +3 -3
  26. package/app-template/src/routes/index.ts +6 -6
  27. package/app-template/src/utils/__tests__/theme-page-context.test.ts +145 -0
  28. package/app-template/src/utils/theme-page-context.ts +309 -0
  29. package/app-template/src/views/basket/basket-item.tsx +107 -691
  30. package/app-template/src/views/basket/index.ts +0 -2
  31. package/app-template/src/views/basket/summary.tsx +75 -496
  32. package/app-template/src/views/breadcrumb.tsx +38 -13
  33. package/app-template/src/views/category/category-header.tsx +66 -289
  34. package/app-template/src/views/category/category-info.tsx +24 -173
  35. package/app-template/src/views/category/filters/index.tsx +48 -208
  36. package/app-template/src/views/category/layout.tsx +5 -7
  37. package/app-template/src/views/checkout/index.tsx +0 -5
  38. package/app-template/src/views/checkout/steps/payment/index.tsx +2 -5
  39. package/app-template/src/views/checkout/steps/payment/options/credit-card/index.tsx +1 -72
  40. package/app-template/src/views/checkout/steps/payment/payment-option-buttons.tsx +40 -171
  41. package/app-template/src/views/checkout/steps/shipping/address-box.tsx +12 -74
  42. package/app-template/src/views/checkout/steps/shipping/addresses.tsx +45 -128
  43. package/app-template/src/views/checkout/steps/shipping/shipping-options.tsx +27 -232
  44. package/app-template/src/views/checkout/summary.tsx +29 -303
  45. package/app-template/src/views/footer.tsx +13 -415
  46. package/app-template/src/views/guest-login/index.tsx +1 -1
  47. package/app-template/src/views/header/action-menu.tsx +45 -277
  48. package/app-template/src/views/header/band.tsx +21 -6
  49. package/app-template/src/views/header/index.tsx +47 -109
  50. package/app-template/src/views/header/mini-basket.tsx +45 -820
  51. package/app-template/src/views/header/navbar.tsx +111 -178
  52. package/app-template/src/views/header/search/index.tsx +32 -71
  53. package/app-template/src/views/header/search/results.tsx +65 -127
  54. package/app-template/src/views/product/accordion-wrapper.tsx +43 -135
  55. package/app-template/src/views/product/index.ts +1 -1
  56. package/app-template/src/views/product/layout.tsx +7 -2
  57. package/app-template/src/views/product/misc-buttons.tsx +25 -339
  58. package/app-template/src/views/product/product-actions.tsx +8 -137
  59. package/app-template/src/views/product/product-info.tsx +31 -69
  60. package/app-template/src/views/product/product-share.tsx +8 -11
  61. package/app-template/src/views/product/slider.tsx +79 -117
  62. package/app-template/src/views/product-item/index.tsx +46 -119
  63. package/app-template/src/widgets/footer-social.tsx +16 -47
  64. package/app-template/src/widgets/footer-subscription/index.tsx +17 -183
  65. package/codemods/migrate-auth-v5/index.js +339 -0
  66. package/codemods/migrate-auth-v5/transform.js +86 -0
  67. package/dist/commands/plugins.js +23 -2
  68. package/package.json +1 -1
  69. package/app-template/src/app/[commerce]/[locale]/[currency]/pages/[slug]/page.tsx +0 -15
  70. package/app-template/src/views/basket/basket-summary-context.tsx +0 -560
  71. package/app-template/src/views/basket/designer-context.tsx +0 -617
  72. package/app-template/src/views/breadcrumb/breadcrumb-client.tsx +0 -190
  73. package/app-template/src/views/breadcrumb/breadcrumb-registrar.tsx +0 -286
  74. package/app-template/src/views/breadcrumb/constants.ts +0 -15
  75. package/app-template/src/views/breadcrumb/index.tsx +0 -127
  76. package/app-template/src/views/category/native-widget-context.tsx +0 -257
  77. package/app-template/src/views/category/product-list-registrar.tsx +0 -665
  78. package/app-template/src/views/checkout/checkout-address-registrar.tsx +0 -254
  79. package/app-template/src/views/checkout/checkout-buttons-registrar.tsx +0 -183
  80. package/app-template/src/views/checkout/checkout-delivery-method-registrar.tsx +0 -259
  81. package/app-template/src/views/checkout/checkout-payment-options-registrar.tsx +0 -253
  82. package/app-template/src/views/checkout/checkout-summary-registrar.tsx +0 -183
  83. package/app-template/src/views/checkout/constants.ts +0 -5
  84. package/app-template/src/views/checkout/steps/payment/options/masterpass-rest.tsx +0 -15
  85. package/app-template/src/views/checkout/steps/payment/options/saved-card.tsx +0 -18
  86. package/app-template/src/views/footer/footer-app-banner-context.tsx +0 -326
  87. package/app-template/src/views/footer/footer-bottom-context.tsx +0 -215
  88. package/app-template/src/views/footer/footer-bottom-wrapper.tsx +0 -74
  89. package/app-template/src/views/footer/footer-layout-constants.ts +0 -35
  90. package/app-template/src/views/footer/footer-layout-registrar.tsx +0 -342
  91. package/app-template/src/views/footer/footer-layout-switcher.tsx +0 -110
  92. package/app-template/src/views/footer/footer-menu-context.tsx +0 -211
  93. package/app-template/src/views/footer/footer-native-widgets.tsx +0 -60
  94. package/app-template/src/views/footer/footer-social-context.tsx +0 -254
  95. package/app-template/src/views/footer/footer-subscription-context.tsx +0 -210
  96. package/app-template/src/views/footer/footer-utils.ts +0 -43
  97. package/app-template/src/views/footer/footer-value-props-context.tsx +0 -326
  98. package/app-template/src/views/footer/logo-settings.ts +0 -183
  99. package/app-template/src/views/footer/native-widget-config.ts +0 -262
  100. package/app-template/src/views/footer/subscription-settings.ts +0 -122
  101. package/app-template/src/views/footer/use-footer-logo.ts +0 -162
  102. package/app-template/src/views/header/designer-context.tsx +0 -261
  103. package/app-template/src/views/header/header-announcement-registrar.tsx +0 -267
  104. package/app-template/src/views/header/header-client-wrapper.tsx +0 -496
  105. package/app-template/src/views/header/header-content.tsx +0 -1026
  106. package/app-template/src/views/header/header-currency-registrar.tsx +0 -348
  107. package/app-template/src/views/header/header-icons-context.tsx +0 -262
  108. package/app-template/src/views/header/header-language-registrar.tsx +0 -348
  109. package/app-template/src/views/header/header-layout-context.tsx +0 -143
  110. package/app-template/src/views/header/header-layout-registrar.tsx +0 -658
  111. package/app-template/src/views/header/header-logo-context.tsx +0 -228
  112. package/app-template/src/views/header/header-logo.tsx +0 -118
  113. package/app-template/src/views/header/header-mini-basket-context.tsx +0 -524
  114. package/app-template/src/views/header/header-search-registrar.tsx +0 -511
  115. package/app-template/src/views/header/header-text-slider-registrar.tsx +0 -382
  116. package/app-template/src/views/header/inline-search.tsx +0 -262
  117. package/app-template/src/views/header/navbar-menu-context.tsx +0 -219
  118. package/app-template/src/views/header/search/search-input.tsx +0 -61
  119. package/app-template/src/views/header/server-settings-parser.ts +0 -1105
  120. package/app-template/src/views/header/use-header-icons.ts +0 -241
  121. package/app-template/src/views/header/use-header-logo.ts +0 -213
  122. package/app-template/src/views/header/use-navbar-menu.ts +0 -179
  123. package/app-template/src/views/product/accordion-section.tsx +0 -61
  124. package/app-template/src/views/product/custom-button-group.tsx +0 -69
  125. package/app-template/src/views/product/favorites-button-section.tsx +0 -69
  126. package/app-template/src/views/product/find-in-store-section.tsx +0 -60
  127. package/app-template/src/views/product/product-info-section.tsx +0 -140
  128. package/app-template/src/views/product/quantity-section.tsx +0 -73
  129. package/app-template/src/views/product/sale-tag.tsx +0 -10
  130. package/app-template/src/views/product/share-section.tsx +0 -357
  131. package/app-template/src/views/product/variants-section.tsx +0 -126
  132. package/app-template/src/views/product-detail/constants.ts +0 -272
  133. package/app-template/src/views/product-detail/index.ts +0 -10
  134. package/app-template/src/views/product-detail/product-detail-registrar.tsx +0 -616
  135. package/app-template/src/widgets/footer-app-banner.tsx +0 -444
  136. package/app-template/src/widgets/footer-bottom.tsx +0 -127
  137. package/app-template/src/widgets/footer-menu-compact.tsx +0 -238
  138. package/app-template/src/widgets/footer-menu-two.tsx +0 -298
  139. package/app-template/src/widgets/footer-social-client.tsx +0 -251
  140. package/app-template/src/widgets/footer-value-props.tsx +0 -201
@@ -1,4 +1,2 @@
1
1
  export * from './basket-item';
2
2
  export * from './summary';
3
- export * from './designer-context';
4
- export * from './basket-summary-context';
@@ -9,19 +9,12 @@ import {
9
9
  useRemoveVoucherCodeMutation
10
10
  } from '@akinon/next/data/client/basket';
11
11
  import { Basket, Error } from '@akinon/next/types';
12
- import { Button, Input, Price, Icon } from '@theme/components';
12
+ import { Button, Input, Price } from '@theme/components';
13
13
  import { pushBeginCheckout } from '@theme/utils/gtm';
14
14
  import { ROUTES } from '@theme/routes';
15
15
  import { useLocalization, useRouter } from '@akinon/next/hooks';
16
16
  import PluginModule, { Component } from '@akinon/next/components/plugin-module';
17
17
  import clsx from 'clsx';
18
- import { useGetWidgetQuery } from '@akinon/next/data/client/misc';
19
- import {
20
- useBasketSummary,
21
- BASKET_SUMMARY_PLACEHOLDER_ID,
22
- BASKET_SUMMARY_SECTION_ID,
23
- BASKET_SUMMARY_BLOCKS
24
- } from './basket-summary-context';
25
18
 
26
19
  interface Props {
27
20
  basket: Basket;
@@ -32,32 +25,6 @@ const voucherCodeFormSchema = (t) =>
32
25
  voucherCode: yup.string().required(t('basket.summary.form.error.required'))
33
26
  });
34
27
 
35
- const convertStylesToCSS = (
36
- styles: Record<string, unknown> | undefined
37
- ): React.CSSProperties => {
38
- if (!styles) return {};
39
- const cssStyles: React.CSSProperties = {};
40
- Object.entries(styles).forEach(([key, value]) => {
41
- const rawValue =
42
- typeof value === 'object' && value !== null && 'desktop' in value
43
- ? (value as Record<string, unknown>).desktop
44
- : value;
45
-
46
- const cssValue =
47
- typeof rawValue === 'number'
48
- ? rawValue
49
- : typeof rawValue === 'string'
50
- ? rawValue
51
- : '';
52
-
53
- if (cssValue !== '' && cssValue !== null && cssValue !== undefined) {
54
- const camelKey = key.replace(/-([a-z])/g, (g) => g[1].toUpperCase());
55
- (cssStyles as Record<string, unknown>)[camelKey] = cssValue;
56
- }
57
- });
58
- return cssStyles;
59
- };
60
-
61
28
  export const Summary = (props: Props) => {
62
29
  const { t } = useLocalization();
63
30
  const { basket } = props;
@@ -76,152 +43,6 @@ export const Summary = (props: Props) => {
76
43
  const dispatch = useAppDispatch();
77
44
  const [applyVoucherCodeMutation] = useApplyVoucherCodeMutation();
78
45
  const [removeVoucherCodeMutation] = useRemoveVoucherCodeMutation();
79
- const {
80
- data: basketSummaryBenefits,
81
- isLoading: isLoadingBasketSummaryBenefits
82
- } = useGetWidgetQuery('basket-summary-benefits');
83
-
84
- const {
85
- isDesigner,
86
- isSectionSelected,
87
- selectedBlockId,
88
- getSectionStyles,
89
- getBlockData
90
- } = useBasketSummary();
91
-
92
- const handleBlockClick = (blockId: string, e?: React.MouseEvent) => {
93
- if (!isDesigner) return;
94
- e?.stopPropagation();
95
- if (typeof window !== 'undefined' && window.parent) {
96
- window.parent.postMessage(
97
- {
98
- type: 'SELECT_BLOCK_FROM_PREVIEW',
99
- data: {
100
- placeholderId: BASKET_SUMMARY_PLACEHOLDER_ID,
101
- sectionId: BASKET_SUMMARY_SECTION_ID,
102
- blockId
103
- }
104
- },
105
- '*'
106
- );
107
- }
108
- };
109
-
110
- const handleSectionClick = (e: React.MouseEvent) => {
111
- if (!isDesigner) return;
112
- e.stopPropagation();
113
- if (typeof window !== 'undefined' && window.parent) {
114
- window.parent.postMessage(
115
- {
116
- type: 'SELECT_SECTION',
117
- data: {
118
- placeholderId: BASKET_SUMMARY_PLACEHOLDER_ID,
119
- sectionId: BASKET_SUMMARY_SECTION_ID
120
- }
121
- },
122
- '*'
123
- );
124
- }
125
- };
126
-
127
- const titleBlock = getBlockData(BASKET_SUMMARY_BLOCKS.TITLE.id);
128
- const voucherSectionBlock = getBlockData(
129
- BASKET_SUMMARY_BLOCKS.VOUCHER_SECTION.id
130
- );
131
- const voucherTitleBlock = getBlockData(
132
- BASKET_SUMMARY_BLOCKS.VOUCHER_TITLE.id
133
- );
134
- const voucherFormBlock = getBlockData(BASKET_SUMMARY_BLOCKS.VOUCHER_FORM.id);
135
- const voucherInputBlock = getBlockData(
136
- BASKET_SUMMARY_BLOCKS.VOUCHER_INPUT.id
137
- );
138
- const voucherButtonBlock = getBlockData(
139
- BASKET_SUMMARY_BLOCKS.VOUCHER_BUTTON.id
140
- );
141
- const priceSectionBlock = getBlockData(
142
- BASKET_SUMMARY_BLOCKS.PRICE_SECTION.id
143
- );
144
- const subtotalRowBlock = getBlockData(BASKET_SUMMARY_BLOCKS.SUBTOTAL_ROW.id);
145
- const subtotalLabelBlock = getBlockData(
146
- BASKET_SUMMARY_BLOCKS.SUBTOTAL_LABEL.id
147
- );
148
- const subtotalPriceBlock = getBlockData(
149
- BASKET_SUMMARY_BLOCKS.SUBTOTAL_PRICE.id
150
- );
151
- const discountItemRowBlock = getBlockData(
152
- BASKET_SUMMARY_BLOCKS.DISCOUNT_ITEM_ROW.id
153
- );
154
- const discountItemLabelBlock = getBlockData(
155
- BASKET_SUMMARY_BLOCKS.DISCOUNT_ITEM_LABEL.id
156
- );
157
- const discountItemPriceBlock = getBlockData(
158
- BASKET_SUMMARY_BLOCKS.DISCOUNT_ITEM_PRICE.id
159
- );
160
- const discountsTotalLabelBlock = getBlockData(
161
- BASKET_SUMMARY_BLOCKS.DISCOUNTS_TOTAL_LABEL.id
162
- );
163
- const discountsTotalPriceBlock = getBlockData(
164
- BASKET_SUMMARY_BLOCKS.DISCOUNTS_TOTAL_PRICE.id
165
- );
166
- const discountsTotalRowBlock = getBlockData(
167
- BASKET_SUMMARY_BLOCKS.DISCOUNTS_TOTAL_ROW.id
168
- );
169
- const totalRowBlock = getBlockData(BASKET_SUMMARY_BLOCKS.TOTAL_ROW.id);
170
- const totalLabelBlock = getBlockData(BASKET_SUMMARY_BLOCKS.TOTAL_LABEL.id);
171
- const totalPriceBlock = getBlockData(BASKET_SUMMARY_BLOCKS.TOTAL_PRICE.id);
172
- const checkoutSectionBlock = getBlockData(
173
- BASKET_SUMMARY_BLOCKS.CHECKOUT_SECTION.id
174
- );
175
- const checkoutButtonBlock = getBlockData(
176
- BASKET_SUMMARY_BLOCKS.CHECKOUT_BUTTON.id
177
- );
178
-
179
- const sectionStyles = convertStylesToCSS(getSectionStyles());
180
- const titleStyles = convertStylesToCSS(titleBlock?.styles);
181
- const voucherSectionStyles = convertStylesToCSS(voucherSectionBlock?.styles);
182
- const voucherTitleStyles = convertStylesToCSS(voucherTitleBlock?.styles);
183
- const voucherFormStyles = convertStylesToCSS(voucherFormBlock?.styles);
184
- const voucherInputStyles = convertStylesToCSS(voucherInputBlock?.styles);
185
- const voucherButtonStyles = convertStylesToCSS(voucherButtonBlock?.styles);
186
- const priceSectionStyles = convertStylesToCSS(priceSectionBlock?.styles);
187
- const subtotalRowStyles = convertStylesToCSS(subtotalRowBlock?.styles);
188
- const subtotalLabelStyles = convertStylesToCSS(subtotalLabelBlock?.styles);
189
- const subtotalPriceStyles = convertStylesToCSS(subtotalPriceBlock?.styles);
190
- const discountItemRowStyles = convertStylesToCSS(
191
- discountItemRowBlock?.styles
192
- );
193
- const discountItemLabelStyles = convertStylesToCSS(
194
- discountItemLabelBlock?.styles
195
- );
196
- const discountItemPriceStyles = convertStylesToCSS(
197
- discountItemPriceBlock?.styles
198
- );
199
- const discountsTotalLabelStyles = convertStylesToCSS(
200
- discountsTotalLabelBlock?.styles
201
- );
202
- const discountsTotalPriceStyles = convertStylesToCSS(
203
- discountsTotalPriceBlock?.styles
204
- );
205
- const discountsTotalRowStyles = convertStylesToCSS(
206
- discountsTotalRowBlock?.styles
207
- );
208
- const totalRowStyles = convertStylesToCSS(totalRowBlock?.styles);
209
- const totalLabelStyles = convertStylesToCSS(totalLabelBlock?.styles);
210
- const totalPriceStyles = convertStylesToCSS(totalPriceBlock?.styles);
211
- const checkoutSectionStyles = convertStylesToCSS(
212
- checkoutSectionBlock?.styles
213
- );
214
- const checkoutButtonStyles = convertStylesToCSS(checkoutButtonBlock?.styles);
215
-
216
- const ringClass = (blockId: string) =>
217
- isDesigner
218
- ? clsx(
219
- 'relative cursor-pointer',
220
- selectedBlockId === blockId
221
- ? 'ring-2 ring-blue-500 ring-inset'
222
- : 'hover:ring-2 hover:ring-blue-300 hover:ring-inset'
223
- )
224
- : '';
225
46
 
226
47
  useEffect(() => {
227
48
  if (basket.voucher_code) {
@@ -272,7 +93,6 @@ export const Summary = (props: Props) => {
272
93
  const checkoutProviderProps = {
273
94
  className: clsx([
274
95
  'py-2.5',
275
- 'h-[50px]',
276
96
  'bg-black',
277
97
  'relative',
278
98
  'hover:bg-black',
@@ -301,72 +121,57 @@ export const Summary = (props: Props) => {
301
121
  }, [basket]);
302
122
 
303
123
  return (
304
- <div
305
- className={clsx(
306
- 'w-full xl:w-[400px] bg-gray-30 p-6',
307
- isDesigner &&
308
- 'relative cursor-pointer hover:ring-2 hover:ring-blue-300 hover:ring-inset',
309
- isDesigner && isSectionSelected && 'ring-2 ring-blue-500 ring-inset'
310
- )}
311
- style={sectionStyles}
312
- onClick={handleSectionClick}
313
- >
314
- <h2
315
- className={clsx(
316
- 'tracking-[-0.31px] text-black-850 mb-6',
317
- ringClass(BASKET_SUMMARY_BLOCKS.TITLE.id)
318
- )}
319
- style={titleStyles}
320
- onClick={(e) => handleBlockClick(BASKET_SUMMARY_BLOCKS.TITLE.id, e)}
321
- >
322
- {t('basket.summary.title')}
323
- </h2>
324
- <div
325
- className={clsx(
326
- 'flex flex-col gap-3 mb-5',
327
- ringClass(BASKET_SUMMARY_BLOCKS.VOUCHER_SECTION.id)
124
+ <div className="w-full xl:w-[300px]">
125
+ <div className="py-3 border-b border-gray-200 flex justify-between items-end">
126
+ <h2 className="text-xl font-light">{t('basket.summary.title')}</h2>
127
+ <span className="text-xs" data-testid="basket-count">
128
+ {basket.basketitem_set.map((x) => x.quantity).reduce((a, b) => a + b)}{' '}
129
+ {t('basket.summary.items').toUpperCase()}
130
+ </span>
131
+ </div>
132
+ <div className="py-3 border-b border-gray-200 text-xs leading-6">
133
+ <div className="flex justify-between">
134
+ <p>
135
+ {t('basket.summary.subtotal')} (
136
+ {basket.basketitem_set
137
+ .map((x) => x.quantity)
138
+ .reduce((a, b) => a + b)}{' '}
139
+ {t('basket.summary.items')})
140
+ </p>
141
+ <p>
142
+ <Price value={basket.total_product_amount} />
143
+ </p>
144
+ </div>
145
+ {basket.discounts.length > 0 && (
146
+ <>
147
+ {basket.discounts.map((discount, index) => (
148
+ <div key={index} className="flex justify-between text-secondary">
149
+ <p data-testid="basket-voucher-code">{discount.description}</p>
150
+ <Price value={discount.discount} useNegative />
151
+ </div>
152
+ ))}
153
+ <div className="flex justify-between">
154
+ <p>{t('basket.summary.discounts_total')}</p>
155
+ <Price
156
+ value={basket.discounts.reduce(
157
+ (acc, curr) => acc + Number(curr.discount),
158
+ 0
159
+ )}
160
+ useNegative
161
+ />
162
+ </div>
163
+ </>
328
164
  )}
329
- style={voucherSectionStyles}
330
- onClick={(e) =>
331
- handleBlockClick(BASKET_SUMMARY_BLOCKS.VOUCHER_SECTION.id, e)
332
- }
333
- >
334
- <h3
335
- className={clsx(
336
- 'text-sm text-black-850 tracking-[-0.15px]',
337
- ringClass(BASKET_SUMMARY_BLOCKS.VOUCHER_TITLE.id)
338
- )}
339
- style={voucherTitleStyles}
340
- onClick={(e) =>
341
- handleBlockClick(BASKET_SUMMARY_BLOCKS.VOUCHER_TITLE.id, e)
342
- }
343
- >
165
+ </div>
166
+ <div className="bg-gray-50 py-3 px-5 border-b border-gray-200 text-xs">
167
+ <p className="mb-3 text-lg font-light">
344
168
  {t('basket.summary.form.title')}
345
- </h3>
346
- <form
347
- onSubmit={handleSubmit(onSubmit)}
348
- className={clsx(
349
- 'flex w-full gap-2',
350
- ringClass(BASKET_SUMMARY_BLOCKS.VOUCHER_FORM.id)
351
- )}
352
- style={voucherFormStyles}
353
- onClick={(e) =>
354
- handleBlockClick(BASKET_SUMMARY_BLOCKS.VOUCHER_FORM.id, e)
355
- }
356
- >
357
- <div
358
- className={clsx(
359
- 'w-full',
360
- ringClass(BASKET_SUMMARY_BLOCKS.VOUCHER_INPUT.id)
361
- )}
362
- onClick={(e) =>
363
- handleBlockClick(BASKET_SUMMARY_BLOCKS.VOUCHER_INPUT.id, e)
364
- }
365
- >
169
+ </p>
170
+ <form onSubmit={handleSubmit(onSubmit)} className="flex w-full">
171
+ <div className="w-full md:w-1/2 lg:w-auto">
366
172
  <Input
367
173
  placeholder={t('basket.summary.form.placeholder')}
368
- className="h-[38px] w-full"
369
- style={voucherInputStyles}
174
+ className="h-9 w-full lg:w-40"
370
175
  data-testid="basket-voucher-input"
371
176
  {...register('voucherCode')}
372
177
  error={errors.voucherCode}
@@ -375,238 +180,34 @@ export const Summary = (props: Props) => {
375
180
  </div>
376
181
  {basket.voucher_code ? (
377
182
  <Button
378
- className={clsx(
379
- 'h-[38px] w-16 px-0 shrink-0 text-sm placeholder:text-sm',
380
- ringClass(BASKET_SUMMARY_BLOCKS.VOUCHER_BUTTON.id)
381
- )}
382
- appearance="filled"
383
- style={voucherButtonStyles}
183
+ className="h-9 w-20 px-0 border-gray-500 border-l-0"
184
+ appearance="outlined"
384
185
  data-testid="basket-voucher-remove"
385
186
  type="button"
386
- onClick={(e) => {
387
- if (isDesigner) {
388
- handleBlockClick(BASKET_SUMMARY_BLOCKS.VOUCHER_BUTTON.id, e);
389
- } else {
390
- removeVoucherCode();
391
- }
392
- }}
187
+ onClick={removeVoucherCode}
393
188
  >
394
189
  {t('basket.summary.remove')}
395
190
  </Button>
396
191
  ) : (
397
192
  <Button
398
- className={clsx(
399
- 'h-[38px] w-16 px-0 shrink-0 text-sm placeholder:text-sm',
400
- ringClass(BASKET_SUMMARY_BLOCKS.VOUCHER_BUTTON.id)
401
- )}
402
- appearance="filled"
403
- style={voucherButtonStyles}
193
+ className="h-9 w-20 px-0 border-gray-500 border-l-0"
194
+ appearance="outlined"
404
195
  data-testid="basket-voucher-submit"
405
- onClick={(e) => {
406
- if (isDesigner) {
407
- handleBlockClick(BASKET_SUMMARY_BLOCKS.VOUCHER_BUTTON.id, e);
408
- }
409
- }}
410
196
  >
411
197
  {t('basket.summary.submit')}
412
198
  </Button>
413
199
  )}
414
200
  </form>
415
201
  </div>
416
-
417
- <div
418
- className={clsx(
419
- 'text-black-850 text-sm tracking-[-0.15px] flex flex-col gap-3 border-y border-black/10 mb-6 py-6',
420
- ringClass(BASKET_SUMMARY_BLOCKS.PRICE_SECTION.id)
421
- )}
422
- style={priceSectionStyles}
423
- onClick={(e) =>
424
- handleBlockClick(BASKET_SUMMARY_BLOCKS.PRICE_SECTION.id, e)
425
- }
426
- >
427
- <div
428
- className={clsx(
429
- 'flex justify-between',
430
- ringClass(BASKET_SUMMARY_BLOCKS.SUBTOTAL_ROW.id)
431
- )}
432
- style={subtotalRowStyles}
433
- onClick={(e) =>
434
- handleBlockClick(BASKET_SUMMARY_BLOCKS.SUBTOTAL_ROW.id, e)
435
- }
436
- >
437
- <p
438
- className={ringClass(BASKET_SUMMARY_BLOCKS.SUBTOTAL_LABEL.id)}
439
- style={subtotalLabelStyles}
440
- onClick={(e) =>
441
- handleBlockClick(BASKET_SUMMARY_BLOCKS.SUBTOTAL_LABEL.id, e)
442
- }
443
- >
444
- {t('basket.summary.subtotal')}
445
- </p>
446
- <p
447
- className={ringClass(BASKET_SUMMARY_BLOCKS.SUBTOTAL_PRICE.id)}
448
- style={subtotalPriceStyles}
449
- onClick={(e) =>
450
- handleBlockClick(BASKET_SUMMARY_BLOCKS.SUBTOTAL_PRICE.id, e)
451
- }
452
- >
453
- <Price value={basket.total_product_amount} />
454
- </p>
455
- </div>
456
-
457
- {basket.discounts.length > 0 && (
458
- <>
459
- {basket.discounts.map((discount, index) => (
460
- <div
461
- key={index}
462
- className={clsx(
463
- 'flex justify-between',
464
- ringClass(BASKET_SUMMARY_BLOCKS.DISCOUNT_ITEM_ROW.id)
465
- )}
466
- style={discountItemRowStyles}
467
- onClick={(e) =>
468
- handleBlockClick(
469
- BASKET_SUMMARY_BLOCKS.DISCOUNT_ITEM_ROW.id,
470
- e
471
- )
472
- }
473
- >
474
- <p
475
- data-testid="basket-voucher-code"
476
- className={ringClass(
477
- BASKET_SUMMARY_BLOCKS.DISCOUNT_ITEM_LABEL.id
478
- )}
479
- style={discountItemLabelStyles}
480
- onClick={(e) =>
481
- handleBlockClick(
482
- BASKET_SUMMARY_BLOCKS.DISCOUNT_ITEM_LABEL.id,
483
- e
484
- )
485
- }
486
- >
487
- {discount.description}
488
- </p>
489
- <Price
490
- value={discount.discount}
491
- className={ringClass(
492
- BASKET_SUMMARY_BLOCKS.DISCOUNT_ITEM_PRICE.id
493
- )}
494
- style={discountItemPriceStyles}
495
- onClick={(e) =>
496
- handleBlockClick(
497
- BASKET_SUMMARY_BLOCKS.DISCOUNT_ITEM_PRICE.id,
498
- e
499
- )
500
- }
501
- useNegative
502
- />
503
- </div>
504
- ))}
505
- <div
506
- className={clsx(
507
- 'flex justify-between',
508
- ringClass(BASKET_SUMMARY_BLOCKS.DISCOUNTS_TOTAL_ROW.id)
509
- )}
510
- style={discountsTotalRowStyles}
511
- onClick={(e) =>
512
- handleBlockClick(
513
- BASKET_SUMMARY_BLOCKS.DISCOUNTS_TOTAL_ROW.id,
514
- e
515
- )
516
- }
517
- >
518
- <p
519
- className={ringClass(
520
- BASKET_SUMMARY_BLOCKS.DISCOUNTS_TOTAL_LABEL.id
521
- )}
522
- style={discountsTotalLabelStyles}
523
- onClick={(e) =>
524
- handleBlockClick(
525
- BASKET_SUMMARY_BLOCKS.DISCOUNTS_TOTAL_LABEL.id,
526
- e
527
- )
528
- }
529
- >
530
- {t('basket.summary.discounts_total')}
531
- </p>
532
- <Price
533
- value={basket.discounts.reduce(
534
- (acc, curr) => acc + Number(curr.discount),
535
- 0
536
- )}
537
- className={ringClass(
538
- BASKET_SUMMARY_BLOCKS.DISCOUNTS_TOTAL_PRICE.id
539
- )}
540
- style={discountsTotalPriceStyles}
541
- onClick={(e) =>
542
- handleBlockClick(
543
- BASKET_SUMMARY_BLOCKS.DISCOUNTS_TOTAL_PRICE.id,
544
- e
545
- )
546
- }
547
- useNegative
548
- />
549
- </div>
550
- </>
551
- )}
552
- <div
553
- className={clsx(
554
- 'flex justify-between mt-2.5',
555
- ringClass(BASKET_SUMMARY_BLOCKS.TOTAL_ROW.id)
556
- )}
557
- style={totalRowStyles}
558
- onClick={(e) =>
559
- handleBlockClick(BASKET_SUMMARY_BLOCKS.TOTAL_ROW.id, e)
560
- }
561
- >
562
- <h2
563
- className={clsx(
564
- 'text-base tracking-[-0.31px]',
565
- ringClass(BASKET_SUMMARY_BLOCKS.TOTAL_LABEL.id)
566
- )}
567
- style={totalLabelStyles}
568
- onClick={(e) =>
569
- handleBlockClick(BASKET_SUMMARY_BLOCKS.TOTAL_LABEL.id, e)
570
- }
571
- >
572
- {t('basket.summary.total')}
573
- </h2>
574
- <Price
575
- value={basket.total_amount}
576
- className={clsx(
577
- 'text-xl tracking-[-0.45px]',
578
- ringClass(BASKET_SUMMARY_BLOCKS.TOTAL_PRICE.id)
579
- )}
580
- style={totalPriceStyles}
581
- data-testid="basket-total"
582
- onClick={(e) =>
583
- handleBlockClick(BASKET_SUMMARY_BLOCKS.TOTAL_PRICE.id, e)
584
- }
585
- />
202
+ <div>
203
+ <div className="flex justify-between py-3 text-xl">
204
+ <h2 className="font-light">{t('basket.summary.total')}</h2>
205
+ <Price value={basket.total_amount} data-testid="basket-total" />
586
206
  </div>
587
- </div>
588
- <div
589
- className={clsx(
590
- 'flex flex-col border-b border-black/10 pb-3 mb-6',
591
- ringClass(BASKET_SUMMARY_BLOCKS.CHECKOUT_SECTION.id)
592
- )}
593
- style={checkoutSectionStyles}
594
- onClick={(e) =>
595
- handleBlockClick(BASKET_SUMMARY_BLOCKS.CHECKOUT_SECTION.id, e)
596
- }
597
- >
598
207
  <Button
599
- className={clsx(
600
- 'w-full h-[50px] font-base tracking-[-0.64px]',
601
- ringClass(BASKET_SUMMARY_BLOCKS.CHECKOUT_BUTTON.id)
602
- )}
603
- style={checkoutButtonStyles}
604
- onClick={(e) => {
605
- if (isDesigner) {
606
- handleBlockClick(BASKET_SUMMARY_BLOCKS.CHECKOUT_BUTTON.id, e);
607
- } else {
608
- router.push(ROUTES.CHECKOUT);
609
- }
208
+ className="w-full"
209
+ onClick={() => {
210
+ router.push(ROUTES.CHECKOUT);
610
211
  }}
611
212
  data-testid="basket-checkout"
612
213
  >
@@ -623,43 +224,21 @@ export const Summary = (props: Props) => {
623
224
  props={checkoutProviderProps}
624
225
  />
625
226
 
626
- <PluginModule
627
- component={Component.BasketVirtualTryOn}
628
- props={{
629
- basketItems: basket.basketitem_set.map((item) => ({
630
- pk: item.product.pk,
631
- sku: item.product.sku,
632
- name: item.product.name,
633
- productimage_set: item.product.productimage_set,
634
- attributes: item.product.attributes,
635
- category: (item.product as any).category
636
- }))
637
- }}
638
- />
639
- </div>
640
- <div className="flex flex-col gap-2">
641
- {isLoadingBasketSummaryBenefits ? (
642
- <>
643
- {[1, 2, 3].map((i) => (
644
- <div key={i} className="flex items-center gap-1.5 animate-pulse">
645
- <div className="w-3 h-3 bg-gray-200 rounded" />
646
- <div className="h-3 bg-gray-200 rounded w-3/4" />
647
- </div>
648
- ))}
649
- </>
650
- ) : (
651
- basketSummaryBenefits?.attributes?.basket_summary_benefits?.map(
652
- (benefit, index) => (
653
- <div
654
- key={index}
655
- className="flex items-center text-black-850 gap-1.5"
656
- >
657
- <Icon name="check" size={12} />
658
- <span className="text-xs">{benefit?.value?.title}</span>
659
- </div>
660
- )
661
- )
662
- )}
227
+ <div className="mt-4">
228
+ <PluginModule
229
+ component={Component.BasketVirtualTryOn}
230
+ props={{
231
+ basketItems: basket.basketitem_set.map((item) => ({
232
+ pk: item.product.pk,
233
+ sku: item.product.sku,
234
+ name: item.product.name,
235
+ productimage_set: item.product.productimage_set,
236
+ attributes: item.product.attributes,
237
+ category: (item.product as any).category
238
+ }))
239
+ }}
240
+ />
241
+ </div>
663
242
  </div>
664
243
  </div>
665
244
  );