@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.
- package/CHANGELOG.md +14 -0
- package/app-template/CHANGELOG.md +170 -0
- package/app-template/next.config.mjs +0 -1
- package/app-template/package.json +31 -30
- package/app-template/src/app/[pz]/[...prettyurl]/page.tsx +2 -2
- package/app-template/src/app/[pz]/account/layout.tsx +2 -1
- package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/blog/[slug]/page.tsx +4 -2
- package/app-template/src/app/[pz]/category/[pk]/page.tsx +11 -1
- package/app-template/src/app/[pz]/group-product/[pk]/page.tsx +2 -2
- package/app-template/src/app/[pz]/layout.tsx +3 -1
- package/app-template/src/app/[pz]/list/page.tsx +11 -1
- package/app-template/src/app/[pz]/page.tsx +13 -35
- package/app-template/src/app/[pz]/pages/[slug]/page.tsx +19 -0
- package/app-template/src/app/[pz]/product/[pk]/page.tsx +2 -2
- package/app-template/src/app/api/barcode-search/route.ts +1 -1
- package/app-template/src/app/api/cache/route.ts +1 -1
- package/app-template/src/app/api/image-proxy/route.ts +1 -1
- package/app-template/src/app/api/logout/route.ts +1 -1
- package/app-template/src/app/api/product-categories/route.ts +1 -1
- package/app-template/src/app/api/similar-product-list/route.ts +1 -1
- package/app-template/src/app/api/similar-products/route.ts +1 -1
- package/app-template/src/app/api/virtual-try-on/route.ts +1 -1
- package/app-template/src/app/api/web-vitals/route.ts +1 -1
- package/app-template/src/components/quantity-selector.tsx +16 -4
- package/app-template/src/components/widget-content.tsx +3 -3
- package/app-template/src/routes/index.ts +6 -6
- package/app-template/src/utils/__tests__/theme-page-context.test.ts +145 -0
- package/app-template/src/utils/theme-page-context.ts +309 -0
- package/app-template/src/views/basket/basket-item.tsx +107 -691
- package/app-template/src/views/basket/index.ts +0 -2
- package/app-template/src/views/basket/summary.tsx +75 -496
- package/app-template/src/views/breadcrumb.tsx +38 -13
- package/app-template/src/views/category/category-header.tsx +66 -289
- package/app-template/src/views/category/category-info.tsx +24 -173
- package/app-template/src/views/category/filters/index.tsx +48 -208
- package/app-template/src/views/category/layout.tsx +5 -7
- package/app-template/src/views/checkout/index.tsx +0 -5
- package/app-template/src/views/checkout/steps/payment/index.tsx +2 -5
- package/app-template/src/views/checkout/steps/payment/options/credit-card/index.tsx +1 -72
- package/app-template/src/views/checkout/steps/payment/payment-option-buttons.tsx +40 -171
- package/app-template/src/views/checkout/steps/shipping/address-box.tsx +12 -74
- package/app-template/src/views/checkout/steps/shipping/addresses.tsx +45 -128
- package/app-template/src/views/checkout/steps/shipping/shipping-options.tsx +27 -232
- package/app-template/src/views/checkout/summary.tsx +29 -303
- package/app-template/src/views/footer.tsx +13 -415
- package/app-template/src/views/guest-login/index.tsx +1 -1
- package/app-template/src/views/header/action-menu.tsx +45 -277
- package/app-template/src/views/header/band.tsx +21 -6
- package/app-template/src/views/header/index.tsx +47 -109
- package/app-template/src/views/header/mini-basket.tsx +45 -820
- package/app-template/src/views/header/navbar.tsx +111 -178
- package/app-template/src/views/header/search/index.tsx +32 -71
- package/app-template/src/views/header/search/results.tsx +65 -127
- package/app-template/src/views/product/accordion-wrapper.tsx +43 -135
- package/app-template/src/views/product/index.ts +1 -1
- package/app-template/src/views/product/layout.tsx +7 -2
- package/app-template/src/views/product/misc-buttons.tsx +25 -339
- package/app-template/src/views/product/product-actions.tsx +8 -137
- package/app-template/src/views/product/product-info.tsx +31 -69
- package/app-template/src/views/product/product-share.tsx +8 -11
- package/app-template/src/views/product/slider.tsx +79 -117
- package/app-template/src/views/product-item/index.tsx +46 -119
- package/app-template/src/widgets/footer-social.tsx +16 -47
- package/app-template/src/widgets/footer-subscription/index.tsx +17 -183
- package/codemods/migrate-auth-v5/index.js +339 -0
- package/codemods/migrate-auth-v5/transform.js +86 -0
- package/dist/commands/plugins.js +23 -2
- package/package.json +1 -1
- package/app-template/src/app/[commerce]/[locale]/[currency]/pages/[slug]/page.tsx +0 -15
- package/app-template/src/views/basket/basket-summary-context.tsx +0 -560
- package/app-template/src/views/basket/designer-context.tsx +0 -617
- package/app-template/src/views/breadcrumb/breadcrumb-client.tsx +0 -190
- package/app-template/src/views/breadcrumb/breadcrumb-registrar.tsx +0 -286
- package/app-template/src/views/breadcrumb/constants.ts +0 -15
- package/app-template/src/views/breadcrumb/index.tsx +0 -127
- package/app-template/src/views/category/native-widget-context.tsx +0 -257
- package/app-template/src/views/category/product-list-registrar.tsx +0 -665
- package/app-template/src/views/checkout/checkout-address-registrar.tsx +0 -254
- package/app-template/src/views/checkout/checkout-buttons-registrar.tsx +0 -183
- package/app-template/src/views/checkout/checkout-delivery-method-registrar.tsx +0 -259
- package/app-template/src/views/checkout/checkout-payment-options-registrar.tsx +0 -253
- package/app-template/src/views/checkout/checkout-summary-registrar.tsx +0 -183
- package/app-template/src/views/checkout/constants.ts +0 -5
- package/app-template/src/views/checkout/steps/payment/options/masterpass-rest.tsx +0 -15
- package/app-template/src/views/checkout/steps/payment/options/saved-card.tsx +0 -18
- package/app-template/src/views/footer/footer-app-banner-context.tsx +0 -326
- package/app-template/src/views/footer/footer-bottom-context.tsx +0 -215
- package/app-template/src/views/footer/footer-bottom-wrapper.tsx +0 -74
- package/app-template/src/views/footer/footer-layout-constants.ts +0 -35
- package/app-template/src/views/footer/footer-layout-registrar.tsx +0 -342
- package/app-template/src/views/footer/footer-layout-switcher.tsx +0 -110
- package/app-template/src/views/footer/footer-menu-context.tsx +0 -211
- package/app-template/src/views/footer/footer-native-widgets.tsx +0 -60
- package/app-template/src/views/footer/footer-social-context.tsx +0 -254
- package/app-template/src/views/footer/footer-subscription-context.tsx +0 -210
- package/app-template/src/views/footer/footer-utils.ts +0 -43
- package/app-template/src/views/footer/footer-value-props-context.tsx +0 -326
- package/app-template/src/views/footer/logo-settings.ts +0 -183
- package/app-template/src/views/footer/native-widget-config.ts +0 -262
- package/app-template/src/views/footer/subscription-settings.ts +0 -122
- package/app-template/src/views/footer/use-footer-logo.ts +0 -162
- package/app-template/src/views/header/designer-context.tsx +0 -261
- package/app-template/src/views/header/header-announcement-registrar.tsx +0 -267
- package/app-template/src/views/header/header-client-wrapper.tsx +0 -496
- package/app-template/src/views/header/header-content.tsx +0 -1026
- package/app-template/src/views/header/header-currency-registrar.tsx +0 -348
- package/app-template/src/views/header/header-icons-context.tsx +0 -262
- package/app-template/src/views/header/header-language-registrar.tsx +0 -348
- package/app-template/src/views/header/header-layout-context.tsx +0 -143
- package/app-template/src/views/header/header-layout-registrar.tsx +0 -658
- package/app-template/src/views/header/header-logo-context.tsx +0 -228
- package/app-template/src/views/header/header-logo.tsx +0 -118
- package/app-template/src/views/header/header-mini-basket-context.tsx +0 -524
- package/app-template/src/views/header/header-search-registrar.tsx +0 -511
- package/app-template/src/views/header/header-text-slider-registrar.tsx +0 -382
- package/app-template/src/views/header/inline-search.tsx +0 -262
- package/app-template/src/views/header/navbar-menu-context.tsx +0 -219
- package/app-template/src/views/header/search/search-input.tsx +0 -61
- package/app-template/src/views/header/server-settings-parser.ts +0 -1105
- package/app-template/src/views/header/use-header-icons.ts +0 -241
- package/app-template/src/views/header/use-header-logo.ts +0 -213
- package/app-template/src/views/header/use-navbar-menu.ts +0 -179
- package/app-template/src/views/product/accordion-section.tsx +0 -61
- package/app-template/src/views/product/custom-button-group.tsx +0 -69
- package/app-template/src/views/product/favorites-button-section.tsx +0 -69
- package/app-template/src/views/product/find-in-store-section.tsx +0 -60
- package/app-template/src/views/product/product-info-section.tsx +0 -140
- package/app-template/src/views/product/quantity-section.tsx +0 -73
- package/app-template/src/views/product/sale-tag.tsx +0 -10
- package/app-template/src/views/product/share-section.tsx +0 -357
- package/app-template/src/views/product/variants-section.tsx +0 -126
- package/app-template/src/views/product-detail/constants.ts +0 -272
- package/app-template/src/views/product-detail/index.ts +0 -10
- package/app-template/src/views/product-detail/product-detail-registrar.tsx +0 -616
- package/app-template/src/widgets/footer-app-banner.tsx +0 -444
- package/app-template/src/widgets/footer-bottom.tsx +0 -127
- package/app-template/src/widgets/footer-menu-compact.tsx +0 -238
- package/app-template/src/widgets/footer-menu-two.tsx +0 -298
- package/app-template/src/widgets/footer-social-client.tsx +0 -251
- package/app-template/src/widgets/footer-value-props.tsx +0 -201
|
@@ -19,44 +19,15 @@ import {
|
|
|
19
19
|
} from '@akinon/next/hooks';
|
|
20
20
|
import { Image } from '@akinon/next/components/image';
|
|
21
21
|
import { pushRemoveFromCart } from '@theme/utils/gtm';
|
|
22
|
-
import {
|
|
23
|
-
useHeaderMiniBasket,
|
|
24
|
-
HEADER_MINI_BASKET_PLACEHOLDER_ID,
|
|
25
|
-
HEADER_MINI_BASKET_SECTION_ID
|
|
26
|
-
} from './header-mini-basket-context';
|
|
27
22
|
|
|
28
23
|
interface MiniBasketItemProps {
|
|
29
24
|
basketItem: BasketItem;
|
|
30
25
|
highlightedItem: number;
|
|
31
26
|
miniBasketListRef: MutableRefObject<HTMLUListElement>;
|
|
32
|
-
isDesigner?: boolean;
|
|
33
|
-
selectedBlockId?: string;
|
|
34
|
-
onBlockClick?: (blockId: string, e?: React.MouseEvent) => void;
|
|
35
|
-
itemStyles?: React.CSSProperties;
|
|
36
|
-
imageStyles?: React.CSSProperties;
|
|
37
|
-
nameStyles?: React.CSSProperties;
|
|
38
|
-
priceStyles?: React.CSSProperties;
|
|
39
|
-
removeButtonStyles?: React.CSSProperties;
|
|
40
|
-
removeButtonContent?: string;
|
|
41
|
-
attributeStyles?: React.CSSProperties;
|
|
42
27
|
}
|
|
43
28
|
|
|
44
29
|
function MiniBasketItem(props: MiniBasketItemProps) {
|
|
45
|
-
const {
|
|
46
|
-
basketItem,
|
|
47
|
-
highlightedItem,
|
|
48
|
-
miniBasketListRef,
|
|
49
|
-
isDesigner = false,
|
|
50
|
-
selectedBlockId = '',
|
|
51
|
-
onBlockClick,
|
|
52
|
-
itemStyles,
|
|
53
|
-
imageStyles,
|
|
54
|
-
nameStyles,
|
|
55
|
-
priceStyles,
|
|
56
|
-
removeButtonStyles,
|
|
57
|
-
removeButtonContent,
|
|
58
|
-
attributeStyles
|
|
59
|
-
} = props;
|
|
30
|
+
const { basketItem, highlightedItem, miniBasketListRef } = props;
|
|
60
31
|
const dispatch = useAppDispatch();
|
|
61
32
|
const [updateQuantityMutation] = useUpdateQuantityMutation();
|
|
62
33
|
const commonProductAttributes = useCommonProductAttributes({
|
|
@@ -100,63 +71,24 @@ function MiniBasketItem(props: MiniBasketItemProps) {
|
|
|
100
71
|
});
|
|
101
72
|
};
|
|
102
73
|
|
|
103
|
-
const imageWidth = imageStyles?.width
|
|
104
|
-
? parseInt(String(imageStyles.width))
|
|
105
|
-
: isHighlighted
|
|
106
|
-
? 96
|
|
107
|
-
: 48;
|
|
108
|
-
const imageHeight = imageStyles?.height
|
|
109
|
-
? parseInt(String(imageStyles.height))
|
|
110
|
-
: isHighlighted
|
|
111
|
-
? 160
|
|
112
|
-
: 80;
|
|
113
|
-
|
|
114
74
|
return (
|
|
115
75
|
<li
|
|
116
|
-
style={{
|
|
117
|
-
|
|
118
|
-
...itemStyles
|
|
119
|
-
}}
|
|
120
|
-
className={clsx(
|
|
121
|
-
'flex gap-3 py-4 border-b border-gray-500 relative',
|
|
122
|
-
isDesigner &&
|
|
123
|
-
selectedBlockId === 'mini-basket-item' &&
|
|
124
|
-
'ring-2 ring-blue-500 ring-inset',
|
|
125
|
-
isDesigner &&
|
|
126
|
-
'cursor-pointer hover:ring-2 hover:ring-blue-300 hover:ring-inset'
|
|
127
|
-
)}
|
|
128
|
-
onClick={(e) => isDesigner && onBlockClick?.('mini-basket-item', e)}
|
|
76
|
+
style={{ order: isHighlighted ? '-1' : '0' }}
|
|
77
|
+
className={clsx('flex gap-3 py-4 border-b border-gray-500')}
|
|
129
78
|
>
|
|
130
79
|
<Link
|
|
131
80
|
href={basketItem.product.absolute_url}
|
|
132
81
|
className={clsx(
|
|
133
|
-
'block shrink-0 transition-all duration-300
|
|
134
|
-
|
|
135
|
-
imageHeight
|
|
136
|
-
? `h-[${imageHeight}px]`
|
|
137
|
-
: isHighlighted
|
|
138
|
-
? 'h-40'
|
|
139
|
-
: 'h-20',
|
|
140
|
-
isDesigner &&
|
|
141
|
-
selectedBlockId === 'mini-basket-item-image' &&
|
|
142
|
-
'ring-2 ring-blue-500 ring-inset',
|
|
143
|
-
isDesigner &&
|
|
144
|
-
'cursor-pointer hover:ring-2 hover:ring-blue-300 hover:ring-inset'
|
|
82
|
+
'block shrink-0 transition-all duration-300',
|
|
83
|
+
isHighlighted ? 'w-24 h-40' : 'w-12 h-20'
|
|
145
84
|
)}
|
|
146
|
-
onClick={(e) => {
|
|
147
|
-
if (isDesigner) {
|
|
148
|
-
e.preventDefault();
|
|
149
|
-
onBlockClick?.('mini-basket-item-image', e);
|
|
150
|
-
}
|
|
151
|
-
}}
|
|
152
85
|
>
|
|
153
86
|
<Image
|
|
154
87
|
src={basketItem.product.productimage_set?.[0]?.image ?? ''}
|
|
155
88
|
alt={basketItem.product.name}
|
|
156
|
-
width={
|
|
157
|
-
height={
|
|
89
|
+
width={isHighlighted ? 96 : 48}
|
|
90
|
+
height={isHighlighted ? 160 : 80}
|
|
158
91
|
className="transition-all duration-300"
|
|
159
|
-
style={imageStyles}
|
|
160
92
|
/>
|
|
161
93
|
</Link>
|
|
162
94
|
<div className="flex flex-col flex-1">
|
|
@@ -175,22 +107,8 @@ function MiniBasketItem(props: MiniBasketItemProps) {
|
|
|
175
107
|
</div>
|
|
176
108
|
<Link
|
|
177
109
|
href={basketItem.product.absolute_url}
|
|
178
|
-
className=
|
|
179
|
-
'block relative',
|
|
180
|
-
isDesigner &&
|
|
181
|
-
selectedBlockId === 'mini-basket-item-name' &&
|
|
182
|
-
'ring-2 ring-blue-500 ring-inset',
|
|
183
|
-
isDesigner &&
|
|
184
|
-
'cursor-pointer hover:ring-2 hover:ring-blue-300 hover:ring-inset'
|
|
185
|
-
)}
|
|
110
|
+
className="block"
|
|
186
111
|
data-testid="mini-basket-item-name"
|
|
187
|
-
style={nameStyles}
|
|
188
|
-
onClick={(e) => {
|
|
189
|
-
if (isDesigner) {
|
|
190
|
-
e.preventDefault();
|
|
191
|
-
onBlockClick?.('mini-basket-item-name', e);
|
|
192
|
-
}
|
|
193
|
-
}}
|
|
194
112
|
>
|
|
195
113
|
{basketItem.product.name}
|
|
196
114
|
{/* TODO: Get correct variants */}
|
|
@@ -198,19 +116,7 @@ function MiniBasketItem(props: MiniBasketItemProps) {
|
|
|
198
116
|
{commonProductAttributes.map((attribute, index) => (
|
|
199
117
|
<span
|
|
200
118
|
key={index}
|
|
201
|
-
className={clsx(
|
|
202
|
-
'relative',
|
|
203
|
-
isDesigner &&
|
|
204
|
-
selectedBlockId === 'mini-basket-item-attribute' &&
|
|
205
|
-
'ring-2 ring-blue-500 ring-inset',
|
|
206
|
-
isDesigner &&
|
|
207
|
-
'cursor-pointer hover:ring-2 hover:ring-blue-300 hover:ring-inset'
|
|
208
|
-
)}
|
|
209
119
|
data-testid={`mini-basket-item-${attribute.name.toLowerCase()}`}
|
|
210
|
-
style={attributeStyles}
|
|
211
|
-
onClick={(e) =>
|
|
212
|
-
isDesigner && onBlockClick?.('mini-basket-item-attribute', e)
|
|
213
|
-
}
|
|
214
120
|
>
|
|
215
121
|
{attribute.name}: {attribute.value}
|
|
216
122
|
</span>
|
|
@@ -223,43 +129,16 @@ function MiniBasketItem(props: MiniBasketItemProps) {
|
|
|
223
129
|
className="line-through"
|
|
224
130
|
/>
|
|
225
131
|
)}
|
|
226
|
-
<
|
|
227
|
-
className={clsx(
|
|
228
|
-
'relative',
|
|
229
|
-
isDesigner &&
|
|
230
|
-
selectedBlockId === 'mini-basket-item-price' &&
|
|
231
|
-
'ring-2 ring-blue-500 ring-inset',
|
|
232
|
-
isDesigner &&
|
|
233
|
-
'cursor-pointer hover:ring-2 hover:ring-blue-300 hover:ring-inset'
|
|
234
|
-
)}
|
|
235
|
-
onClick={(e) =>
|
|
236
|
-
isDesigner && onBlockClick?.('mini-basket-item-price', e)
|
|
237
|
-
}
|
|
238
|
-
>
|
|
239
|
-
<Price value={basketItem.total_amount} style={priceStyles} />
|
|
240
|
-
</div>
|
|
132
|
+
<Price value={basketItem.total_amount} />
|
|
241
133
|
<Button
|
|
242
134
|
appearance="ghost"
|
|
243
135
|
className={clsx(
|
|
244
|
-
'transition-all duration-300
|
|
245
|
-
isHighlighted ? 'invisible' : 'visible'
|
|
246
|
-
isDesigner &&
|
|
247
|
-
selectedBlockId === 'mini-basket-item-remove-button' &&
|
|
248
|
-
'ring-2 ring-blue-500 ring-inset',
|
|
249
|
-
isDesigner &&
|
|
250
|
-
'cursor-pointer hover:ring-2 hover:ring-blue-300 hover:ring-inset'
|
|
136
|
+
'p-0 h-auto text-xs font-semibold underline transition-all duration-300',
|
|
137
|
+
isHighlighted ? 'invisible' : 'visible'
|
|
251
138
|
)}
|
|
252
|
-
|
|
253
|
-
onClick={(e) => {
|
|
254
|
-
if (isDesigner) {
|
|
255
|
-
e.stopPropagation();
|
|
256
|
-
onBlockClick?.('mini-basket-item-remove-button', e);
|
|
257
|
-
} else {
|
|
258
|
-
removeItem();
|
|
259
|
-
}
|
|
260
|
-
}}
|
|
139
|
+
onClick={removeItem}
|
|
261
140
|
>
|
|
262
|
-
{
|
|
141
|
+
{t('basket.mini_basket.remove')}
|
|
263
142
|
</Button>
|
|
264
143
|
</footer>
|
|
265
144
|
</div>
|
|
@@ -268,38 +147,10 @@ function MiniBasketItem(props: MiniBasketItemProps) {
|
|
|
268
147
|
}
|
|
269
148
|
|
|
270
149
|
export default function MiniBasket() {
|
|
271
|
-
const {
|
|
272
|
-
isDesigner,
|
|
273
|
-
isSectionSelected,
|
|
274
|
-
selectedBlockId,
|
|
275
|
-
getSectionStyles,
|
|
276
|
-
getSectionProperties,
|
|
277
|
-
getBlockData
|
|
278
|
-
} = useHeaderMiniBasket();
|
|
279
150
|
const { open: miniBasketOpen } = useAppSelector(
|
|
280
151
|
(state) => state.root.miniBasket
|
|
281
152
|
);
|
|
282
153
|
const dispatch = useAppDispatch();
|
|
283
|
-
|
|
284
|
-
const handleBlockClick = (blockId: string, e?: React.MouseEvent) => {
|
|
285
|
-
if (!isDesigner) return;
|
|
286
|
-
e?.stopPropagation();
|
|
287
|
-
|
|
288
|
-
if (typeof window !== 'undefined' && window.parent) {
|
|
289
|
-
window.parent.postMessage(
|
|
290
|
-
{
|
|
291
|
-
type: 'SELECT_BLOCK_FROM_PREVIEW',
|
|
292
|
-
data: {
|
|
293
|
-
placeholderId: HEADER_MINI_BASKET_PLACEHOLDER_ID,
|
|
294
|
-
sectionId: HEADER_MINI_BASKET_SECTION_ID,
|
|
295
|
-
blockId
|
|
296
|
-
}
|
|
297
|
-
},
|
|
298
|
-
'*'
|
|
299
|
-
);
|
|
300
|
-
}
|
|
301
|
-
};
|
|
302
|
-
|
|
303
154
|
const {
|
|
304
155
|
data: basket,
|
|
305
156
|
isLoading,
|
|
@@ -308,463 +159,16 @@ export default function MiniBasket() {
|
|
|
308
159
|
skip: !miniBasketOpen
|
|
309
160
|
});
|
|
310
161
|
const { data: miniBasket } = useGetMiniBasketQuery();
|
|
311
|
-
const { t
|
|
162
|
+
const { t } = useLocalization();
|
|
312
163
|
const { highlightedItem } = useAppSelector((state) => state.root.miniBasket);
|
|
313
164
|
const [highlightedItemPk, setHighlightedItemPk] = useState(0);
|
|
314
165
|
const [sortedBasket, setSortedBasket] = useState([]);
|
|
315
|
-
const [isMobile, setIsMobile] = useState(false);
|
|
316
|
-
|
|
317
|
-
useEffect(() => {
|
|
318
|
-
const checkMobile = () => {
|
|
319
|
-
setIsMobile(window.innerWidth < 1024);
|
|
320
|
-
};
|
|
321
|
-
|
|
322
|
-
checkMobile();
|
|
323
|
-
|
|
324
|
-
window.addEventListener('resize', checkMobile);
|
|
325
|
-
return () => window.removeEventListener('resize', checkMobile);
|
|
326
|
-
}, []);
|
|
327
|
-
|
|
328
|
-
const sectionStyles = getSectionStyles();
|
|
329
|
-
const sectionProperties = getSectionProperties();
|
|
330
|
-
|
|
331
|
-
const positionProp = sectionProperties?.position;
|
|
332
|
-
const position =
|
|
333
|
-
typeof positionProp === 'object' && positionProp !== null
|
|
334
|
-
? (positionProp as { desktop?: string }).desktop || 'right'
|
|
335
|
-
: (positionProp as string) || 'right';
|
|
336
|
-
|
|
337
|
-
const headerBlock = getBlockData('mini-basket-header');
|
|
338
|
-
const footerBlock = getBlockData('mini-basket-footer');
|
|
339
|
-
const titleBlock = getBlockData('mini-basket-title');
|
|
340
|
-
const itemCountBlock = getBlockData('mini-basket-item-count');
|
|
341
|
-
const closeIconBlock = getBlockData('mini-basket-close-icon');
|
|
342
|
-
const listBlock = getBlockData('mini-basket-list');
|
|
343
|
-
const itemBlock = getBlockData('mini-basket-item');
|
|
344
|
-
const itemImageBlock = getBlockData('mini-basket-item-image');
|
|
345
|
-
const itemNameBlock = getBlockData('mini-basket-item-name');
|
|
346
|
-
const itemPriceBlock = getBlockData('mini-basket-item-price');
|
|
347
|
-
const itemRemoveButtonBlock = getBlockData('mini-basket-item-remove-button');
|
|
348
|
-
const itemAttributeBlock = getBlockData('mini-basket-item-attribute');
|
|
349
|
-
const subtotalBlock = getBlockData('mini-basket-subtotal');
|
|
350
|
-
const viewBagButtonBlock = getBlockData('mini-basket-view-bag-button');
|
|
351
|
-
const continueShoppingButtonBlock = getBlockData(
|
|
352
|
-
'mini-basket-continue-shopping-button'
|
|
353
|
-
);
|
|
354
|
-
|
|
355
|
-
const getBlockContent = (block: any, fallback: string): string => {
|
|
356
|
-
if (!block) return fallback;
|
|
357
|
-
|
|
358
|
-
if (block.value) {
|
|
359
|
-
if (typeof block.value === 'string') {
|
|
360
|
-
return block.value;
|
|
361
|
-
}
|
|
362
|
-
|
|
363
|
-
if (typeof block.value === 'object' && block.value[locale]) {
|
|
364
|
-
return block.value[locale];
|
|
365
|
-
}
|
|
366
|
-
|
|
367
|
-
if (typeof block.value === 'object') {
|
|
368
|
-
return block.value.en || Object.values(block.value)[0] || fallback;
|
|
369
|
-
}
|
|
370
|
-
}
|
|
371
|
-
|
|
372
|
-
if (block.properties?.content) {
|
|
373
|
-
return block.properties.content;
|
|
374
|
-
}
|
|
375
|
-
|
|
376
|
-
return fallback;
|
|
377
|
-
};
|
|
378
|
-
|
|
379
|
-
const getResponsiveValue = (
|
|
380
|
-
value: any,
|
|
381
|
-
device: 'mobile' | 'desktop' = 'desktop'
|
|
382
|
-
): string => {
|
|
383
|
-
if (typeof value === 'object' && value !== null) {
|
|
384
|
-
return String(value[device] || value.desktop || value.mobile || '');
|
|
385
|
-
}
|
|
386
|
-
return String(value || '');
|
|
387
|
-
};
|
|
388
|
-
|
|
389
|
-
const convertStylesToCSS = (
|
|
390
|
-
styles: Record<string, unknown> | undefined,
|
|
391
|
-
device: 'mobile' | 'desktop' = 'desktop'
|
|
392
|
-
): React.CSSProperties => {
|
|
393
|
-
if (!styles) return {};
|
|
394
|
-
|
|
395
|
-
const cssStyles: React.CSSProperties = {};
|
|
396
|
-
Object.entries(styles).forEach(([key, value]) => {
|
|
397
|
-
const cssValue = getResponsiveValue(value, device);
|
|
398
|
-
const camelKey = key.replace(/-([a-z])/g, (g) => g[1].toUpperCase());
|
|
399
|
-
if (cssValue) {
|
|
400
|
-
(cssStyles as any)[camelKey] = cssValue;
|
|
401
|
-
}
|
|
402
|
-
});
|
|
403
|
-
return cssStyles;
|
|
404
|
-
};
|
|
405
|
-
|
|
406
|
-
const sectionCSSStylesMobile = convertStylesToCSS(sectionStyles, 'mobile');
|
|
407
|
-
const sectionCSSStylesDesktop = convertStylesToCSS(sectionStyles, 'desktop');
|
|
408
|
-
const headerCSSStylesMobile = convertStylesToCSS(
|
|
409
|
-
headerBlock?.styles,
|
|
410
|
-
'mobile'
|
|
411
|
-
);
|
|
412
|
-
const headerCSSStylesDesktop = convertStylesToCSS(
|
|
413
|
-
headerBlock?.styles,
|
|
414
|
-
'desktop'
|
|
415
|
-
);
|
|
416
|
-
const footerCSSStylesMobile = convertStylesToCSS(
|
|
417
|
-
footerBlock?.styles,
|
|
418
|
-
'mobile'
|
|
419
|
-
);
|
|
420
|
-
const footerCSSStylesDesktop = convertStylesToCSS(
|
|
421
|
-
footerBlock?.styles,
|
|
422
|
-
'desktop'
|
|
423
|
-
);
|
|
424
|
-
const titleCSSStylesMobile = convertStylesToCSS(titleBlock?.styles, 'mobile');
|
|
425
|
-
const titleCSSStylesDesktop = convertStylesToCSS(
|
|
426
|
-
titleBlock?.styles,
|
|
427
|
-
'desktop'
|
|
428
|
-
);
|
|
429
|
-
const itemCountCSSStylesMobile = convertStylesToCSS(
|
|
430
|
-
itemCountBlock?.styles,
|
|
431
|
-
'mobile'
|
|
432
|
-
);
|
|
433
|
-
|
|
434
|
-
const itemCountCSSStylesDesktop = convertStylesToCSS(
|
|
435
|
-
itemCountBlock?.styles,
|
|
436
|
-
'desktop'
|
|
437
|
-
);
|
|
438
|
-
|
|
439
|
-
const closeIconCSSStylesMobile = convertStylesToCSS(
|
|
440
|
-
closeIconBlock?.styles,
|
|
441
|
-
'mobile'
|
|
442
|
-
);
|
|
443
|
-
const closeIconCSSStylesDesktop = convertStylesToCSS(
|
|
444
|
-
closeIconBlock?.styles,
|
|
445
|
-
'desktop'
|
|
446
|
-
);
|
|
447
|
-
|
|
448
|
-
const listCSSStylesMobile = convertStylesToCSS(listBlock?.styles, 'mobile');
|
|
449
|
-
const listCSSStylesDesktop = convertStylesToCSS(listBlock?.styles, 'desktop');
|
|
450
|
-
const itemCSSStylesMobile = convertStylesToCSS(itemBlock?.styles, 'mobile');
|
|
451
|
-
const itemCSSStylesDesktop = convertStylesToCSS(itemBlock?.styles, 'desktop');
|
|
452
|
-
const itemImageCSSStylesMobile = convertStylesToCSS(
|
|
453
|
-
itemImageBlock?.styles,
|
|
454
|
-
'mobile'
|
|
455
|
-
);
|
|
456
|
-
const itemImageCSSStylesDesktop = convertStylesToCSS(
|
|
457
|
-
itemImageBlock?.styles,
|
|
458
|
-
'desktop'
|
|
459
|
-
);
|
|
460
|
-
const itemNameCSSStylesMobile = convertStylesToCSS(
|
|
461
|
-
itemNameBlock?.styles,
|
|
462
|
-
'mobile'
|
|
463
|
-
);
|
|
464
|
-
const itemNameCSSStylesDesktop = convertStylesToCSS(
|
|
465
|
-
itemNameBlock?.styles,
|
|
466
|
-
'desktop'
|
|
467
|
-
);
|
|
468
|
-
const itemPriceCSSStylesMobile = convertStylesToCSS(
|
|
469
|
-
itemPriceBlock?.styles,
|
|
470
|
-
'mobile'
|
|
471
|
-
);
|
|
472
|
-
const itemPriceCSSStylesDesktop = convertStylesToCSS(
|
|
473
|
-
itemPriceBlock?.styles,
|
|
474
|
-
'desktop'
|
|
475
|
-
);
|
|
476
|
-
const itemRemoveButtonCSSStylesMobile = convertStylesToCSS(
|
|
477
|
-
itemRemoveButtonBlock?.styles,
|
|
478
|
-
'mobile'
|
|
479
|
-
);
|
|
480
|
-
const itemRemoveButtonCSSStylesDesktop = convertStylesToCSS(
|
|
481
|
-
itemRemoveButtonBlock?.styles,
|
|
482
|
-
'desktop'
|
|
483
|
-
);
|
|
484
|
-
const itemAttributeCSSStylesMobile = convertStylesToCSS(
|
|
485
|
-
itemAttributeBlock?.styles,
|
|
486
|
-
'mobile'
|
|
487
|
-
);
|
|
488
|
-
const itemAttributeCSSStylesDesktop = convertStylesToCSS(
|
|
489
|
-
itemAttributeBlock?.styles,
|
|
490
|
-
'desktop'
|
|
491
|
-
);
|
|
492
|
-
const subtotalCSSStylesMobile = convertStylesToCSS(
|
|
493
|
-
subtotalBlock?.styles,
|
|
494
|
-
'mobile'
|
|
495
|
-
);
|
|
496
|
-
const subtotalCSSStylesDesktop = convertStylesToCSS(
|
|
497
|
-
subtotalBlock?.styles,
|
|
498
|
-
'desktop'
|
|
499
|
-
);
|
|
500
|
-
const viewBagButtonCSSStylesMobile = convertStylesToCSS(
|
|
501
|
-
viewBagButtonBlock?.styles,
|
|
502
|
-
'mobile'
|
|
503
|
-
);
|
|
504
|
-
const viewBagButtonCSSStylesDesktop = convertStylesToCSS(
|
|
505
|
-
viewBagButtonBlock?.styles,
|
|
506
|
-
'desktop'
|
|
507
|
-
);
|
|
508
|
-
const continueShoppingButtonCSSStylesMobile = convertStylesToCSS(
|
|
509
|
-
continueShoppingButtonBlock?.styles,
|
|
510
|
-
'mobile'
|
|
511
|
-
);
|
|
512
|
-
const continueShoppingButtonCSSStylesDesktop = convertStylesToCSS(
|
|
513
|
-
continueShoppingButtonBlock?.styles,
|
|
514
|
-
'desktop'
|
|
515
|
-
);
|
|
516
|
-
|
|
517
|
-
// Default styles for mini basket section (mobile)
|
|
518
|
-
const defaultSectionStylesMobile: React.CSSProperties = {
|
|
519
|
-
width: '100vw',
|
|
520
|
-
height: '100vh',
|
|
521
|
-
backgroundColor: '#ffffff',
|
|
522
|
-
borderLeftWidth: '0',
|
|
523
|
-
borderTopWidth: '0',
|
|
524
|
-
borderRightWidth: '0',
|
|
525
|
-
borderBottomWidth: '0',
|
|
526
|
-
borderStyle: 'solid',
|
|
527
|
-
padding: '20px',
|
|
528
|
-
zIndex: 50
|
|
529
|
-
};
|
|
530
|
-
|
|
531
|
-
// Default styles for mini basket section (desktop) based on position
|
|
532
|
-
const getPositionStyles = (): React.CSSProperties => {
|
|
533
|
-
switch (position) {
|
|
534
|
-
case 'left':
|
|
535
|
-
return {
|
|
536
|
-
position: 'absolute',
|
|
537
|
-
top: '100%',
|
|
538
|
-
left: '0',
|
|
539
|
-
right: 'auto'
|
|
540
|
-
};
|
|
541
|
-
case 'bottom':
|
|
542
|
-
return {
|
|
543
|
-
position: 'fixed',
|
|
544
|
-
bottom: '0',
|
|
545
|
-
left: '50%',
|
|
546
|
-
transform: 'translateX(-50%)',
|
|
547
|
-
top: 'auto',
|
|
548
|
-
right: 'auto',
|
|
549
|
-
width: '100%',
|
|
550
|
-
maxWidth: '600px'
|
|
551
|
-
};
|
|
552
|
-
case 'right':
|
|
553
|
-
default:
|
|
554
|
-
return {
|
|
555
|
-
position: 'absolute',
|
|
556
|
-
top: '100%',
|
|
557
|
-
right: '0',
|
|
558
|
-
left: 'auto'
|
|
559
|
-
};
|
|
560
|
-
}
|
|
561
|
-
};
|
|
562
|
-
|
|
563
|
-
const defaultSectionStylesDesktop: React.CSSProperties = {
|
|
564
|
-
width: '320px',
|
|
565
|
-
height: 'max-content',
|
|
566
|
-
maxHeight: '600px',
|
|
567
|
-
backgroundColor: '#ffffff',
|
|
568
|
-
borderLeftWidth: '1px',
|
|
569
|
-
borderTopWidth: '1px',
|
|
570
|
-
borderRightWidth: '2px',
|
|
571
|
-
borderBottomWidth: '2px',
|
|
572
|
-
borderColor: '#6b7280',
|
|
573
|
-
borderStyle: 'solid',
|
|
574
|
-
padding: '20px',
|
|
575
|
-
zIndex: 50,
|
|
576
|
-
...getPositionStyles()
|
|
577
|
-
};
|
|
578
|
-
|
|
579
|
-
// For mobile: merge mobile defaults with mobile theme styles
|
|
580
|
-
// But don't allow theme editor to override height - we need 100vh for full screen
|
|
581
|
-
const { height: _mobileHeight, ...sectionCSSStylesMobileWithoutHeight } =
|
|
582
|
-
sectionCSSStylesMobile;
|
|
583
|
-
const finalSectionStylesMobile = {
|
|
584
|
-
...defaultSectionStylesMobile,
|
|
585
|
-
...sectionCSSStylesMobileWithoutHeight
|
|
586
|
-
};
|
|
587
|
-
const finalHeaderStylesMobile = { ...headerCSSStylesMobile };
|
|
588
|
-
const finalFooterStylesMobile = { ...footerCSSStylesMobile };
|
|
589
|
-
const finalTitleStylesMobile = { ...titleCSSStylesMobile };
|
|
590
|
-
const finalItemCountStylesMobile = { ...itemCountCSSStylesMobile };
|
|
591
|
-
const finalCloseIconStylesMobile = { ...closeIconCSSStylesMobile };
|
|
592
|
-
const finalListStylesMobile = { ...listCSSStylesMobile };
|
|
593
|
-
const finalItemStylesMobile = { ...itemCSSStylesMobile };
|
|
594
|
-
const finalItemImageStylesMobile = { ...itemImageCSSStylesMobile };
|
|
595
|
-
const finalItemNameStylesMobile = { ...itemNameCSSStylesMobile };
|
|
596
|
-
const finalItemPriceStylesMobile = { ...itemPriceCSSStylesMobile };
|
|
597
|
-
const finalItemRemoveButtonStylesMobile = {
|
|
598
|
-
...itemRemoveButtonCSSStylesMobile
|
|
599
|
-
};
|
|
600
|
-
const finalItemAttributeStylesMobile = { ...itemAttributeCSSStylesMobile };
|
|
601
|
-
const finalSubtotalStylesMobile = { ...subtotalCSSStylesMobile };
|
|
602
|
-
const finalViewBagButtonStylesMobile = {
|
|
603
|
-
width: '100%',
|
|
604
|
-
display: 'flex',
|
|
605
|
-
alignItems: 'center',
|
|
606
|
-
justifyContent: 'center',
|
|
607
|
-
backgroundColor: 'var(--primary)',
|
|
608
|
-
color: 'var(--primary-foreground)',
|
|
609
|
-
borderWidth: '1px',
|
|
610
|
-
borderStyle: 'solid',
|
|
611
|
-
borderColor: 'var(--primary)',
|
|
612
|
-
height: '32px',
|
|
613
|
-
fontWeight: '600',
|
|
614
|
-
transition: 'all',
|
|
615
|
-
...viewBagButtonCSSStylesMobile
|
|
616
|
-
};
|
|
617
|
-
const finalContinueShoppingButtonStylesMobile = {
|
|
618
|
-
height: 'auto',
|
|
619
|
-
padding: '0',
|
|
620
|
-
fontWeight: '600',
|
|
621
|
-
textDecoration: 'underline',
|
|
622
|
-
alignSelf: 'center',
|
|
623
|
-
...continueShoppingButtonCSSStylesMobile
|
|
624
|
-
};
|
|
625
|
-
|
|
626
|
-
// For desktop: merge desktop defaults with desktop theme styles
|
|
627
|
-
// But don't allow theme editor to override height - we need max-content for dropdown
|
|
628
|
-
const { height: _desktopHeight, ...sectionCSSStylesDesktopWithoutHeight } =
|
|
629
|
-
sectionCSSStylesDesktop;
|
|
630
|
-
const finalSectionStylesDesktop = {
|
|
631
|
-
...defaultSectionStylesDesktop,
|
|
632
|
-
...sectionCSSStylesDesktopWithoutHeight
|
|
633
|
-
};
|
|
634
|
-
const finalHeaderStylesDesktop = { ...headerCSSStylesDesktop };
|
|
635
|
-
const finalFooterStylesDesktop = { ...footerCSSStylesDesktop };
|
|
636
|
-
const finalTitleStylesDesktop = { ...titleCSSStylesDesktop };
|
|
637
|
-
const finalItemCountStylesDesktop = { ...itemCountCSSStylesDesktop };
|
|
638
|
-
const finalCloseIconStylesDesktop = { ...closeIconCSSStylesDesktop };
|
|
639
|
-
const finalListStylesDesktop = { ...listCSSStylesDesktop };
|
|
640
|
-
const finalItemStylesDesktop = { ...itemCSSStylesDesktop };
|
|
641
|
-
const finalItemImageStylesDesktop = { ...itemImageCSSStylesDesktop };
|
|
642
|
-
const finalItemNameStylesDesktop = { ...itemNameCSSStylesDesktop };
|
|
643
|
-
const finalItemPriceStylesDesktop = { ...itemPriceCSSStylesDesktop };
|
|
644
|
-
const finalItemRemoveButtonStylesDesktop = {
|
|
645
|
-
...itemRemoveButtonCSSStylesDesktop
|
|
646
|
-
};
|
|
647
|
-
const finalItemAttributeStylesDesktop = { ...itemAttributeCSSStylesDesktop };
|
|
648
|
-
const finalSubtotalStylesDesktop = { ...subtotalCSSStylesDesktop };
|
|
649
|
-
const finalViewBagButtonStylesDesktop = {
|
|
650
|
-
width: '100%',
|
|
651
|
-
display: 'flex',
|
|
652
|
-
alignItems: 'center',
|
|
653
|
-
justifyContent: 'center',
|
|
654
|
-
backgroundColor: 'var(--primary)',
|
|
655
|
-
color: 'var(--primary-foreground)',
|
|
656
|
-
borderWidth: '1px',
|
|
657
|
-
borderStyle: 'solid',
|
|
658
|
-
borderColor: 'var(--primary)',
|
|
659
|
-
height: '32px',
|
|
660
|
-
fontWeight: '600',
|
|
661
|
-
transition: 'all',
|
|
662
|
-
...viewBagButtonCSSStylesDesktop
|
|
663
|
-
};
|
|
664
|
-
const finalContinueShoppingButtonStylesDesktop = {
|
|
665
|
-
height: 'auto',
|
|
666
|
-
padding: '0',
|
|
667
|
-
fontWeight: '600',
|
|
668
|
-
textDecoration: 'underline',
|
|
669
|
-
alignSelf: 'center',
|
|
670
|
-
...continueShoppingButtonCSSStylesDesktop
|
|
671
|
-
};
|
|
672
|
-
|
|
673
|
-
// Use appropriate styles based on viewport
|
|
674
|
-
const finalSectionStyles = isMobile
|
|
675
|
-
? finalSectionStylesMobile
|
|
676
|
-
: finalSectionStylesDesktop;
|
|
677
|
-
const finalHeaderStyles = isMobile
|
|
678
|
-
? finalHeaderStylesMobile
|
|
679
|
-
: finalHeaderStylesDesktop;
|
|
680
|
-
const finalFooterStyles = isMobile
|
|
681
|
-
? finalFooterStylesMobile
|
|
682
|
-
: finalFooterStylesDesktop;
|
|
683
|
-
const finalTitleStyles = isMobile
|
|
684
|
-
? finalTitleStylesMobile
|
|
685
|
-
: finalTitleStylesDesktop;
|
|
686
|
-
const finalItemCountStyles = isMobile
|
|
687
|
-
? finalItemCountStylesMobile
|
|
688
|
-
: finalItemCountStylesDesktop;
|
|
689
|
-
const finalCloseIconStyles = isMobile
|
|
690
|
-
? finalCloseIconStylesMobile
|
|
691
|
-
: finalCloseIconStylesDesktop;
|
|
692
|
-
const finalListStyles = isMobile
|
|
693
|
-
? finalListStylesMobile
|
|
694
|
-
: finalListStylesDesktop;
|
|
695
|
-
const finalItemStyles = isMobile
|
|
696
|
-
? finalItemStylesMobile
|
|
697
|
-
: finalItemStylesDesktop;
|
|
698
|
-
const finalItemImageStyles = isMobile
|
|
699
|
-
? finalItemImageStylesMobile
|
|
700
|
-
: finalItemImageStylesDesktop;
|
|
701
|
-
const finalItemNameStyles = isMobile
|
|
702
|
-
? finalItemNameStylesMobile
|
|
703
|
-
: finalItemNameStylesDesktop;
|
|
704
|
-
const finalItemPriceStyles = isMobile
|
|
705
|
-
? finalItemPriceStylesMobile
|
|
706
|
-
: finalItemPriceStylesDesktop;
|
|
707
|
-
const finalItemRemoveButtonStyles = isMobile
|
|
708
|
-
? finalItemRemoveButtonStylesMobile
|
|
709
|
-
: finalItemRemoveButtonStylesDesktop;
|
|
710
|
-
const finalItemAttributeStyles = isMobile
|
|
711
|
-
? finalItemAttributeStylesMobile
|
|
712
|
-
: finalItemAttributeStylesDesktop;
|
|
713
|
-
const finalSubtotalStyles = isMobile
|
|
714
|
-
? finalSubtotalStylesMobile
|
|
715
|
-
: finalSubtotalStylesDesktop;
|
|
716
|
-
const finalViewBagButtonStyles = isMobile
|
|
717
|
-
? finalViewBagButtonStylesMobile
|
|
718
|
-
: finalViewBagButtonStylesDesktop;
|
|
719
|
-
const finalContinueShoppingButtonStyles = isMobile
|
|
720
|
-
? finalContinueShoppingButtonStylesMobile
|
|
721
|
-
: finalContinueShoppingButtonStylesDesktop;
|
|
722
166
|
|
|
723
167
|
const totalQuantity = useMemo(
|
|
724
168
|
() => miniBasket?.total_quantity ?? 0,
|
|
725
169
|
[miniBasket]
|
|
726
170
|
);
|
|
727
|
-
|
|
728
|
-
const titleContent = getBlockContent(
|
|
729
|
-
titleBlock,
|
|
730
|
-
t('basket.mini_basket.my_bag')
|
|
731
|
-
);
|
|
732
|
-
const itemCountContent = getBlockContent(
|
|
733
|
-
itemCountBlock,
|
|
734
|
-
`${totalQuantity} ${t('basket.mini_basket.items')}`
|
|
735
|
-
);
|
|
736
|
-
const subtotalContent = getBlockContent(
|
|
737
|
-
subtotalBlock,
|
|
738
|
-
t('basket.mini_basket.subtotal')
|
|
739
|
-
);
|
|
740
|
-
const viewBagButtonContent = getBlockContent(
|
|
741
|
-
viewBagButtonBlock,
|
|
742
|
-
t('basket.mini_basket.view_bag')
|
|
743
|
-
);
|
|
744
|
-
const continueShoppingButtonContent = getBlockContent(
|
|
745
|
-
continueShoppingButtonBlock,
|
|
746
|
-
t('basket.mini_basket.continue_shopping')
|
|
747
|
-
);
|
|
748
|
-
const itemRemoveButtonContent = getBlockContent(
|
|
749
|
-
itemRemoveButtonBlock,
|
|
750
|
-
t('basket.mini_basket.remove')
|
|
751
|
-
);
|
|
752
|
-
|
|
753
|
-
// Get custom close icon from block properties (supports SVG)
|
|
754
|
-
const closeIconProp = closeIconBlock?.properties?.icon;
|
|
755
|
-
const closeIconValue =
|
|
756
|
-
typeof closeIconProp === 'object' && closeIconProp !== null
|
|
757
|
-
? (closeIconProp as { desktop?: string }).desktop
|
|
758
|
-
: closeIconProp;
|
|
759
|
-
const hasCustomSvgIcon =
|
|
760
|
-
closeIconValue &&
|
|
761
|
-
typeof closeIconValue === 'string' &&
|
|
762
|
-
closeIconValue.includes('<svg');
|
|
763
|
-
// Use custom icon name or default to 'close'
|
|
764
|
-
const closeIconName: string =
|
|
765
|
-
hasCustomSvgIcon || !closeIconValue ? 'close' : String(closeIconValue);
|
|
766
|
-
|
|
767
|
-
const miniBasketList = useRef(null);
|
|
171
|
+
const miniBasketList = useRef<HTMLUListElement | null>(null);
|
|
768
172
|
|
|
769
173
|
useEffect(() => {
|
|
770
174
|
if (highlightedItem > 0) {
|
|
@@ -801,151 +205,38 @@ export default function MiniBasket() {
|
|
|
801
205
|
: 'opacity-0 invisible',
|
|
802
206
|
'fixed top-0 left-0 z-50 w-screen h-screen bg-black bg-opacity-80 transition-all duration-300'
|
|
803
207
|
)}
|
|
804
|
-
onClick={() =>
|
|
208
|
+
onClick={() => {
|
|
209
|
+
dispatch(closeMiniBasket());
|
|
210
|
+
}}
|
|
805
211
|
/>
|
|
806
212
|
<div
|
|
807
213
|
className={clsx(
|
|
808
|
-
'flex-col transition-all duration-300',
|
|
809
214
|
miniBasketOpen
|
|
810
|
-
? 'flex opacity-100 visible'
|
|
811
|
-
: '
|
|
812
|
-
'fixed lg:absolute'
|
|
813
|
-
'bottom-0 lg:top-full right-0',
|
|
814
|
-
'w-screen h-screen lg:w-auto',
|
|
815
|
-
isDesigner &&
|
|
816
|
-
isSectionSelected &&
|
|
817
|
-
'ring-4 ring-blue-500 ring-offset-2',
|
|
818
|
-
isDesigner &&
|
|
819
|
-
'cursor-pointer hover:ring-4 hover:ring-blue-300 hover:ring-offset-2'
|
|
215
|
+
? 'flex flex-col opacity-100 visible lg:translate-y-[calc(100%)]'
|
|
216
|
+
: 'opacity-0 invisible translate-x-full lg:translate-x-0 lg:translate-y-[calc(100%+16px)]',
|
|
217
|
+
'fixed lg:absolute bottom-0 lg:-bottom-1 right-0 w-80 h-screen lg:h-auto bg-white lg:border-l lg:border-t lg:border-r-2 lg:border-b-2 lg:border-gray-500 p-5 z-50 transition-all duration-300'
|
|
820
218
|
)}
|
|
821
|
-
style={finalSectionStyles}
|
|
822
|
-
onClick={(e) => {
|
|
823
|
-
if (e.target === e.currentTarget && isDesigner) {
|
|
824
|
-
if (typeof window !== 'undefined' && window.parent) {
|
|
825
|
-
window.parent.postMessage(
|
|
826
|
-
{
|
|
827
|
-
type: 'SELECT_BLOCK_FROM_PREVIEW',
|
|
828
|
-
data: {
|
|
829
|
-
placeholderId: HEADER_MINI_BASKET_PLACEHOLDER_ID,
|
|
830
|
-
sectionId: HEADER_MINI_BASKET_SECTION_ID,
|
|
831
|
-
blockId: ''
|
|
832
|
-
}
|
|
833
|
-
},
|
|
834
|
-
'*'
|
|
835
|
-
);
|
|
836
|
-
}
|
|
837
|
-
}
|
|
838
|
-
}}
|
|
839
219
|
>
|
|
840
|
-
<header
|
|
841
|
-
className=
|
|
842
|
-
'
|
|
843
|
-
isDesigner &&
|
|
844
|
-
selectedBlockId === 'mini-basket-header' &&
|
|
845
|
-
'ring-2 ring-blue-500 ring-inset',
|
|
846
|
-
isDesigner &&
|
|
847
|
-
'cursor-pointer hover:ring-2 hover:ring-blue-300 hover:ring-inset'
|
|
848
|
-
)}
|
|
849
|
-
style={finalHeaderStyles}
|
|
850
|
-
onClick={(e) =>
|
|
851
|
-
isDesigner && handleBlockClick('mini-basket-header', e)
|
|
852
|
-
}
|
|
853
|
-
>
|
|
854
|
-
<h3
|
|
855
|
-
className={clsx(
|
|
856
|
-
'relative',
|
|
857
|
-
isDesigner &&
|
|
858
|
-
selectedBlockId === 'mini-basket-title' &&
|
|
859
|
-
'ring-2 ring-blue-500 ring-inset',
|
|
860
|
-
isDesigner &&
|
|
861
|
-
'cursor-pointer hover:ring-2 hover:ring-blue-300 hover:ring-inset'
|
|
862
|
-
)}
|
|
863
|
-
style={finalTitleStyles}
|
|
864
|
-
onClick={(e) =>
|
|
865
|
-
isDesigner && handleBlockClick('mini-basket-title', e)
|
|
866
|
-
}
|
|
867
|
-
>
|
|
868
|
-
{titleContent}
|
|
220
|
+
<header className="flex items-center gap-2 pb-3 border-b">
|
|
221
|
+
<h3 className="text-xl font-bold">
|
|
222
|
+
{t('basket.mini_basket.my_bag')}
|
|
869
223
|
</h3>
|
|
870
|
-
<span
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
isDesigner &&
|
|
874
|
-
selectedBlockId === 'mini-basket-item-count' &&
|
|
875
|
-
'ring-2 ring-blue-500 ring-inset',
|
|
876
|
-
isDesigner &&
|
|
877
|
-
'cursor-pointer hover:ring-2 hover:ring-blue-300 hover:ring-inset'
|
|
878
|
-
)}
|
|
879
|
-
style={finalItemCountStyles}
|
|
880
|
-
onClick={(e) =>
|
|
881
|
-
isDesigner && handleBlockClick('mini-basket-item-count', e)
|
|
882
|
-
}
|
|
883
|
-
>
|
|
884
|
-
{totalQuantity} {t('basket.mini_basket.items')}
|
|
224
|
+
<span>
|
|
225
|
+
{totalQuantity}
|
|
226
|
+
{t('basket.mini_basket.items')}
|
|
885
227
|
</span>
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
'ring-2 ring-blue-500 ring-inset'
|
|
893
|
-
)}
|
|
894
|
-
style={{
|
|
895
|
-
width: 16,
|
|
896
|
-
height: 16,
|
|
897
|
-
...finalCloseIconStyles
|
|
898
|
-
}}
|
|
899
|
-
dangerouslySetInnerHTML={{ __html: closeIconValue }}
|
|
900
|
-
onClick={(e) => {
|
|
901
|
-
e.stopPropagation();
|
|
902
|
-
if (isDesigner) {
|
|
903
|
-
handleBlockClick('mini-basket-close-icon', e);
|
|
904
|
-
} else {
|
|
905
|
-
dispatch(closeMiniBasket());
|
|
906
|
-
}
|
|
907
|
-
}}
|
|
908
|
-
/>
|
|
909
|
-
) : (
|
|
910
|
-
<Icon
|
|
911
|
-
name={closeIconName}
|
|
912
|
-
size={16}
|
|
913
|
-
className={clsx(
|
|
914
|
-
'ml-auto hover:cursor-pointer relative',
|
|
915
|
-
isDesigner &&
|
|
916
|
-
selectedBlockId === 'mini-basket-close-icon' &&
|
|
917
|
-
'ring-2 ring-blue-500 ring-inset'
|
|
918
|
-
)}
|
|
919
|
-
style={finalCloseIconStyles}
|
|
920
|
-
onClick={(e) => {
|
|
921
|
-
e.stopPropagation();
|
|
922
|
-
if (isDesigner) {
|
|
923
|
-
handleBlockClick('mini-basket-close-icon', e);
|
|
924
|
-
} else {
|
|
925
|
-
dispatch(closeMiniBasket());
|
|
926
|
-
}
|
|
927
|
-
}}
|
|
928
|
-
/>
|
|
929
|
-
)}
|
|
228
|
+
<Icon
|
|
229
|
+
name="close"
|
|
230
|
+
size={16}
|
|
231
|
+
className="ml-auto fill-primary hover:cursor-pointer"
|
|
232
|
+
onClick={() => dispatch(closeMiniBasket())}
|
|
233
|
+
/>
|
|
930
234
|
</header>
|
|
931
|
-
{isLoading && <LoaderSpinner />}
|
|
235
|
+
{isLoading && <LoaderSpinner />} {/* TODO: Fix spinner position */}
|
|
932
236
|
{isSuccess && (
|
|
933
237
|
<ul
|
|
934
238
|
ref={miniBasketList}
|
|
935
|
-
className=
|
|
936
|
-
'overflow-y-auto lg:max-h-64 flex flex-col relative',
|
|
937
|
-
isDesigner &&
|
|
938
|
-
selectedBlockId === 'mini-basket-list' &&
|
|
939
|
-
'ring-2 ring-blue-500 ring-inset',
|
|
940
|
-
isDesigner &&
|
|
941
|
-
'cursor-pointer hover:ring-2 hover:ring-blue-300 hover:ring-inset'
|
|
942
|
-
)}
|
|
943
|
-
style={finalListStyles}
|
|
944
|
-
onClick={(e) => {
|
|
945
|
-
if (e.target === e.currentTarget && isDesigner) {
|
|
946
|
-
handleBlockClick('mini-basket-list', e);
|
|
947
|
-
}
|
|
948
|
-
}}
|
|
239
|
+
className="overflow-y-auto lg:max-h-64 flex flex-col"
|
|
949
240
|
>
|
|
950
241
|
{sortedBasket.map((basketItem) => (
|
|
951
242
|
<MiniBasketItem
|
|
@@ -953,98 +244,32 @@ export default function MiniBasket() {
|
|
|
953
244
|
basketItem={basketItem}
|
|
954
245
|
highlightedItem={highlightedItem}
|
|
955
246
|
miniBasketListRef={miniBasketList}
|
|
956
|
-
isDesigner={isDesigner}
|
|
957
|
-
selectedBlockId={selectedBlockId}
|
|
958
|
-
onBlockClick={handleBlockClick}
|
|
959
|
-
itemStyles={finalItemStyles}
|
|
960
|
-
imageStyles={finalItemImageStyles}
|
|
961
|
-
nameStyles={finalItemNameStyles}
|
|
962
|
-
priceStyles={finalItemPriceStyles}
|
|
963
|
-
removeButtonStyles={finalItemRemoveButtonStyles}
|
|
964
|
-
removeButtonContent={itemRemoveButtonContent}
|
|
965
|
-
attributeStyles={finalItemAttributeStyles}
|
|
966
247
|
/>
|
|
967
248
|
))}
|
|
968
249
|
</ul>
|
|
969
250
|
)}
|
|
970
|
-
<footer
|
|
971
|
-
className=
|
|
972
|
-
'
|
|
973
|
-
isDesigner &&
|
|
974
|
-
selectedBlockId === 'mini-basket-footer' &&
|
|
975
|
-
'ring-2 ring-blue-500 ring-inset',
|
|
976
|
-
isDesigner &&
|
|
977
|
-
'cursor-pointer hover:ring-2 hover:ring-blue-300 hover:ring-inset'
|
|
978
|
-
)}
|
|
979
|
-
style={finalFooterStyles}
|
|
980
|
-
onClick={(e) => {
|
|
981
|
-
if (e.target === e.currentTarget && isDesigner) {
|
|
982
|
-
handleBlockClick('mini-basket-footer', e);
|
|
983
|
-
}
|
|
984
|
-
}}
|
|
985
|
-
>
|
|
986
|
-
<div
|
|
987
|
-
className={clsx(
|
|
988
|
-
'flex self-center gap-1 text-xs font-semibold relative',
|
|
989
|
-
isDesigner &&
|
|
990
|
-
selectedBlockId === 'mini-basket-subtotal' &&
|
|
991
|
-
'ring-2 ring-blue-500 ring-inset',
|
|
992
|
-
isDesigner &&
|
|
993
|
-
'cursor-pointer hover:ring-2 hover:ring-blue-300 hover:ring-inset'
|
|
994
|
-
)}
|
|
995
|
-
style={finalSubtotalStyles}
|
|
996
|
-
onClick={(e) =>
|
|
997
|
-
isDesigner && handleBlockClick('mini-basket-subtotal', e)
|
|
998
|
-
}
|
|
999
|
-
>
|
|
1000
|
-
<span>{subtotalContent}</span>
|
|
251
|
+
<footer className="flex flex-col gap-3 mt-auto lg:mt-3 lg:flex-1">
|
|
252
|
+
<div className="flex self-center gap-1 text-xs font-semibold">
|
|
253
|
+
<span>{t('basket.mini_basket.subtotal')}</span>
|
|
1001
254
|
<Price value={basket?.total_amount} />
|
|
1002
255
|
</div>
|
|
256
|
+
{/* TODO: Fix link styles */}
|
|
1003
257
|
<Link
|
|
1004
|
-
onClick={(
|
|
1005
|
-
|
|
1006
|
-
e.preventDefault();
|
|
1007
|
-
e.stopPropagation();
|
|
1008
|
-
handleBlockClick('mini-basket-view-bag-button', e);
|
|
1009
|
-
} else {
|
|
1010
|
-
dispatch(closeMiniBasket());
|
|
1011
|
-
}
|
|
258
|
+
onClick={() => {
|
|
259
|
+
dispatch(closeMiniBasket());
|
|
1012
260
|
}}
|
|
1013
261
|
href={ROUTES.BASKET}
|
|
1014
262
|
data-testid="mini-basket-view-bag"
|
|
1015
|
-
className=
|
|
1016
|
-
'w-full flex items-center justify-center transition-all relative',
|
|
1017
|
-
isDesigner &&
|
|
1018
|
-
selectedBlockId === 'mini-basket-view-bag-button' &&
|
|
1019
|
-
'ring-2 ring-blue-500 ring-inset',
|
|
1020
|
-
isDesigner &&
|
|
1021
|
-
'cursor-pointer hover:ring-2 hover:ring-blue-300 hover:ring-inset'
|
|
1022
|
-
)}
|
|
1023
|
-
style={finalViewBagButtonStyles}
|
|
263
|
+
className="w-full flex items-center justify-center bg-primary text-primary-foreground border border-primary h-8 font-semibold transition-all hover:bg-primary-foreground hover:text-primary"
|
|
1024
264
|
>
|
|
1025
|
-
{
|
|
265
|
+
{t('basket.mini_basket.view_bag')}
|
|
1026
266
|
</Link>
|
|
1027
267
|
<Link
|
|
1028
268
|
href="/"
|
|
1029
|
-
className=
|
|
1030
|
-
'self-center relative',
|
|
1031
|
-
isDesigner &&
|
|
1032
|
-
selectedBlockId === 'mini-basket-continue-shopping-button' &&
|
|
1033
|
-
'ring-2 ring-blue-500 ring-inset',
|
|
1034
|
-
isDesigner &&
|
|
1035
|
-
'cursor-pointer hover:ring-2 hover:ring-blue-300 hover:ring-inset'
|
|
1036
|
-
)}
|
|
269
|
+
className="h-auto p-0 font-semibold underline self-center"
|
|
1037
270
|
data-testid="mini-basket-continue-shopping"
|
|
1038
|
-
style={finalContinueShoppingButtonStyles}
|
|
1039
|
-
onClick={(e) => {
|
|
1040
|
-
if (isDesigner) {
|
|
1041
|
-
e.preventDefault();
|
|
1042
|
-
e.stopPropagation();
|
|
1043
|
-
handleBlockClick('mini-basket-continue-shopping-button', e);
|
|
1044
|
-
}
|
|
1045
|
-
}}
|
|
1046
271
|
>
|
|
1047
|
-
{
|
|
272
|
+
{t('basket.mini_basket.continue_shopping')}
|
|
1048
273
|
</Link>
|
|
1049
274
|
</footer>
|
|
1050
275
|
</div>
|