@faststore/core 3.67.0 → 3.68.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.
- package/.next/BUILD_ID +1 -1
- package/.next/build-manifest.json +74 -74
- package/.next/cache/.tsbuildinfo +1 -1
- package/.next/cache/config.json +3 -3
- package/.next/cache/webpack/client-production/0.pack +0 -0
- package/.next/cache/webpack/client-production/index.pack +0 -0
- package/.next/cache/webpack/server-production/0.pack +0 -0
- package/.next/cache/webpack/server-production/index.pack +0 -0
- package/.next/prerender-manifest.js +1 -1
- package/.next/prerender-manifest.json +1 -1
- package/.next/react-loadable-manifest.json +86 -71
- package/.next/routes-manifest.json +1 -1
- package/.next/server/chunks/1333.js +1 -0
- package/.next/server/chunks/2778.js +2 -2
- package/.next/server/chunks/2792.js +1 -1
- package/.next/server/chunks/3006.js +1 -1
- package/.next/server/chunks/3836.js +1 -1
- package/.next/server/chunks/3918.js +1 -1
- package/.next/server/chunks/3963.js +1 -1
- package/.next/server/chunks/6789.js +1 -1
- package/.next/server/chunks/7178.js +1 -1
- package/.next/server/chunks/7228.js +1 -1
- package/.next/server/chunks/7794.js +1 -1
- package/.next/server/chunks/83.js +1 -1
- package/.next/server/chunks/831.js +1 -1
- package/.next/server/chunks/839.js +1 -0
- package/.next/server/chunks/8569.js +1 -1
- package/.next/server/chunks/8687.js +1 -1
- package/.next/server/chunks/948.js +2 -2
- package/.next/server/chunks/9563.js +2 -2
- package/.next/server/chunks/9630.js +4 -4
- package/.next/server/chunks/UIBannerText.js +1 -1
- package/.next/server/functions-config-manifest.json +1 -1
- package/.next/server/middleware-build-manifest.js +1 -1
- package/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/.next/server/pages/404.js +1 -1
- package/.next/server/pages/404.js.nft.json +1 -1
- package/.next/server/pages/500.js +1 -1
- package/.next/server/pages/500.js.nft.json +1 -1
- package/.next/server/pages/[...slug].js +1 -1
- package/.next/server/pages/[...slug].js.nft.json +1 -1
- package/.next/server/pages/[slug]/p.js +1 -1
- package/.next/server/pages/[slug]/p.js.nft.json +1 -1
- package/.next/server/pages/_app.js.nft.json +1 -1
- package/.next/server/pages/_document.js.nft.json +1 -1
- package/.next/server/pages/_error.js.nft.json +1 -1
- package/.next/server/pages/account/403.js +1 -1
- package/.next/server/pages/account/403.js.nft.json +1 -1
- package/.next/server/pages/account/404.js +1 -1
- package/.next/server/pages/account/404.js.nft.json +1 -1
- package/.next/server/pages/account/[...unknown].js.nft.json +1 -1
- package/.next/server/pages/account/orders/[id].js +1 -1
- package/.next/server/pages/account/orders/[id].js.nft.json +1 -1
- package/.next/server/pages/account/orders.js +1 -1
- package/.next/server/pages/account/orders.js.nft.json +1 -1
- package/.next/server/pages/account/profile.js +1 -1
- package/.next/server/pages/account/profile.js.nft.json +1 -1
- package/.next/server/pages/account/security.js +1 -1
- package/.next/server/pages/account/security.js.nft.json +1 -1
- package/.next/server/pages/account/user-details.js +1 -1
- package/.next/server/pages/account/user-details.js.nft.json +1 -1
- package/.next/server/pages/account.js.nft.json +1 -1
- package/.next/server/pages/api/graphql.js +2 -2
- package/.next/server/pages/api/graphql.js.nft.json +1 -1
- package/.next/server/pages/api/health/live.js.nft.json +1 -1
- package/.next/server/pages/api/health/ready.js.nft.json +1 -1
- package/.next/server/pages/api/preview.js.nft.json +1 -1
- package/.next/server/pages/checkout.js +1 -1
- package/.next/server/pages/checkout.js.nft.json +1 -1
- package/.next/server/pages/en-US/404.html +1 -1
- package/.next/server/pages/en-US/500.html +1 -1
- package/.next/server/pages/en-US/checkout.html +1 -1
- package/.next/server/pages/en-US/login.html +1 -1
- package/.next/server/pages/en-US/s.html +1 -1
- package/.next/server/pages/en-US.html +1 -1
- package/.next/server/pages/index.js +1 -1
- package/.next/server/pages/index.js.nft.json +1 -1
- package/.next/server/pages/login.js +1 -1
- package/.next/server/pages/login.js.nft.json +1 -1
- package/.next/server/pages/s.js +1 -1
- package/.next/server/pages/s.js.nft.json +1 -1
- package/.next/server/pages-manifest.json +1 -1
- package/.next/static/chunks/2284.6dd050e60172189a.js +1 -0
- package/.next/static/chunks/3155.243c7558a71f0695.js +1 -0
- package/.next/static/chunks/3166-6af5e854c2f2913a.js +1 -0
- package/.next/static/chunks/3399.93804fb74f79436c.js +1 -0
- package/.next/static/chunks/353.7f2181843462717d.js +1 -0
- package/.next/static/chunks/4803.412bf2a7e15626a6.js +1 -0
- package/.next/static/chunks/5781.28d03feacead66ad.js +1 -0
- package/.next/static/chunks/6355.57d1a07f50ee6cc9.js +1 -0
- package/.next/static/chunks/{6393.361c44eb0818eb7e.js → 6393.53e9ea4f29d1bf23.js} +1 -1
- package/.next/static/chunks/6700.f046aa86e2c83b53.js +1 -0
- package/.next/static/chunks/6857.b2c06171638955ea.js +1 -0
- package/.next/static/chunks/7191-9bdd5f0c18fbd942.js +1 -0
- package/.next/static/chunks/{6410.bd3fa399df59cc80.js → 7351.e90a4cc21797c136.js} +1 -1
- package/.next/static/chunks/7481.3c4ad3642e346232.js +1 -0
- package/.next/static/chunks/7498-0dc4f9a9ed199d3a.js +1 -0
- package/.next/static/chunks/83.ee1fdbe283ac65b6.js +1 -0
- package/.next/static/chunks/9173-88b7ddf38554a5cf.js +1 -0
- package/.next/static/chunks/BannerNewsletter.a9ea51c53885c80f.js +1 -0
- package/.next/static/chunks/{BannerText.695d4d4b6a3f7309.js → BannerText.21f106b180339df1.js} +1 -1
- package/.next/static/chunks/CartSidebar.55cc31a37ffa6ee6.js +1 -0
- package/.next/static/chunks/{Footer.5ed205d931401110.js → Footer.09dddd47ce6c816f.js} +1 -1
- package/.next/static/chunks/Newsletter.2c79d1813e9f9c95.js +1 -0
- package/.next/static/chunks/ProductShelf.299d0989eea49a79.js +1 -0
- package/.next/static/chunks/ProductTiles.ab99b919f3c0215f.js +1 -0
- package/.next/static/chunks/RegionModal.503f063f2e19b936.js +1 -0
- package/.next/static/chunks/RegionSlider.00de4571775d04cc.js +1 -0
- package/.next/static/chunks/Toast.75a18f47eb23b703.js +1 -0
- package/.next/static/chunks/UIBannerText.f4167ceafb96cf67.js +1 -0
- package/.next/static/chunks/UISKUMatrixSidebar.8b6fac58c48f999c.js +1 -0
- package/.next/static/chunks/UIToast.a49584c87d3adc17.js +1 -0
- package/.next/static/chunks/pages/{404-3582ed9196afdf1e.js → 404-dca50618ea3e6fb6.js} +1 -1
- package/.next/static/chunks/pages/{500-1b4eca062588da7f.js → 500-ae6697c7631fb07a.js} +1 -1
- package/.next/static/chunks/pages/[...slug]-debd8b208a0e3d02.js +1 -0
- package/.next/static/chunks/pages/[slug]/p-d782ecb21200f200.js +1 -0
- package/.next/static/chunks/pages/_app-728289774860e9d9.js +1 -0
- package/.next/static/chunks/pages/account/{403-c791997011f970b6.js → 403-a3d8b31b4e9ee8a6.js} +1 -1
- package/.next/static/chunks/pages/account/{404-74e64bb12e8f5a68.js → 404-22b789f04fcdce39.js} +1 -1
- package/.next/static/chunks/pages/account/orders/[id]-a2f44ba3963b81cd.js +1 -0
- package/.next/static/chunks/pages/account/orders-ec040e06c4b516d0.js +1 -0
- package/.next/static/chunks/pages/account/profile-29f93f4c5a55bd87.js +1 -0
- package/.next/static/chunks/pages/account/security-94874fc477520f74.js +1 -0
- package/.next/static/chunks/pages/account/{user-details-6f9fe72e02f5c5df.js → user-details-143cb45d5080d1d9.js} +1 -1
- package/.next/static/chunks/pages/checkout-b0637ee59b1cdca8.js +1 -0
- package/.next/static/chunks/pages/index-b45c9535696b5ab1.js +1 -0
- package/.next/static/chunks/pages/login-bae3a4cdaaed110c.js +1 -0
- package/.next/static/chunks/pages/s-011eedb19dcdccc6.js +1 -0
- package/.next/static/chunks/webpack-8b6c086380cf1398.js +1 -0
- package/.next/static/css/{e4b714970415f2eb.css → 2a4b7072e47636f1.css} +1 -1
- package/.next/static/css/{8a3f440e0ff9cd8e.css → 3d41485722b4e3f5.css} +1 -1
- package/.next/static/css/{2841bab51b99dd53.css → 92960607d6088082.css} +1 -1
- package/.next/static/css/d26cb0a54378b3d9.css +1 -0
- package/.next/static/css/f93cf36b16950027.css +1 -0
- package/.next/static/pRYrZEXsDEpvxbtvEobPH/_buildManifest.js +1 -0
- package/.next/trace +135 -132
- package/.turbo/turbo-build.log +36 -33
- package/.turbo/turbo-test.log +5 -5
- package/@generated/gql.ts +8 -0
- package/@generated/graphql.ts +83 -0
- package/@generated/persisted-documents.json +1 -0
- package/@generated/schema.graphql +51 -0
- package/CHANGELOG.md +6 -0
- package/cms/faststore/content-types.json +238 -1
- package/cms/faststore/sections.json +34 -33
- package/cypress/integration/plp.test.js +2 -2
- package/index.ts +9 -0
- package/package.json +5 -5
- package/src/components/cms/GlobalSections.tsx +1 -0
- package/src/components/cms/RenderSections.tsx +8 -4
- package/src/components/cms/global/Components.ts +8 -0
- package/src/components/navigation/Navbar/Navbar.tsx +5 -6
- package/src/components/navigation/NavbarLinks/NavbarLinks.tsx +23 -4
- package/src/components/region/RegionBar/RegionBar.tsx +48 -12
- package/src/components/region/RegionFilterButton/RegionFilterButton.tsx +57 -0
- package/src/components/region/RegionFilterButton/index.ts +1 -0
- package/src/components/region/RegionModal/RegionModal.tsx +26 -16
- package/src/components/region/RegionModal/useRegion.ts +12 -11
- package/src/components/region/RegionPopover/RegionPopover.tsx +37 -22
- package/src/components/region/RegionSlider/RegionSlider.tsx +407 -0
- package/src/components/region/RegionSlider/index.ts +1 -0
- package/src/components/region/RegionSlider/section.module.scss +72 -0
- package/src/components/search/Filter/FilterDeliveryMethodFacet.tsx +68 -0
- package/src/components/search/Filter/FilterDesktop.tsx +148 -90
- package/src/components/search/Filter/FilterSlider.tsx +193 -104
- package/src/components/search/Filter/section.module.scss +2 -0
- package/src/components/sections/ProductGallery/section.module.scss +2 -0
- package/src/components/sections/RegionBar/DefaultComponents.ts +1 -0
- package/src/components/sections/RegionBar/RegionBar.tsx +2 -1
- package/src/components/templates/LandingPage/LandingPage.tsx +6 -3
- package/src/components/templates/ProductListingPage/ProductListing.tsx +4 -1
- package/src/components/templates/ProductListingPage/ProductListingPage.tsx +3 -0
- package/src/components/templates/SearchPage/SearchPage.tsx +3 -0
- package/src/components/templates/SearchPage/SearchWrapper.tsx +15 -7
- package/src/components/ui/PickupPoints/PickupPointCard.tsx +39 -0
- package/src/components/ui/PickupPoints/PickupPointCards.tsx +102 -0
- package/src/components/ui/PickupPoints/index.ts +5 -0
- package/src/components/ui/ProductGallery/ProductGallery.tsx +6 -9
- package/src/experimental/index.ts +6 -0
- package/src/pages/404.tsx +15 -6
- package/src/pages/500.tsx +15 -6
- package/src/pages/[...slug].tsx +14 -5
- package/src/pages/[slug]/p.tsx +6 -3
- package/src/pages/_app.tsx +15 -10
- package/src/pages/account/403.tsx +30 -27
- package/src/pages/account/404.tsx +27 -20
- package/src/pages/account/orders/[id].tsx +22 -19
- package/src/pages/account/orders/index.tsx +25 -22
- package/src/pages/account/profile.tsx +27 -23
- package/src/pages/account/security.tsx +28 -23
- package/src/pages/account/user-details.tsx +20 -17
- package/src/pages/checkout.tsx +11 -8
- package/src/pages/index.tsx +7 -4
- package/src/pages/login.tsx +16 -7
- package/src/pages/s.tsx +5 -2
- package/src/sdk/deliveryPromise/index.ts +22 -0
- package/src/sdk/deliveryPromise/provider.tsx +119 -0
- package/src/sdk/deliveryPromise/queries.ts +80 -0
- package/src/sdk/deliveryPromise/reducer.ts +137 -0
- package/src/sdk/deliveryPromise/useDeliveryPromise.ts +419 -0
- package/src/sdk/overrides/PageProvider.tsx +9 -4
- package/src/sdk/product/useLocalizedVariables.ts +20 -6
- package/src/sdk/search/useFilter.ts +12 -1
- package/src/typings/overrides.ts +2 -1
- package/src/utils/globalSettings.ts +74 -0
- package/test/server/index.test.ts +1 -0
- package/.next/server/chunks/6272.js +0 -1
- package/.next/static/auvpWeN2p6A4M2zTGhXzk/_buildManifest.js +0 -1
- package/.next/static/chunks/2284.1b43aea18c23c79e.js +0 -1
- package/.next/static/chunks/3155.ea52e06317dab557.js +0 -1
- package/.next/static/chunks/3166-50d81179a0f5a894.js +0 -1
- package/.next/static/chunks/3399.13a97fefb512c902.js +0 -1
- package/.next/static/chunks/3465.af28497e8069330f.js +0 -1
- package/.next/static/chunks/353.52612dbf516cbaee.js +0 -1
- package/.next/static/chunks/4803.de5b14237d616808.js +0 -1
- package/.next/static/chunks/6355.c0b326c539dbaa90.js +0 -1
- package/.next/static/chunks/6700.4e9426fe8b826dab.js +0 -1
- package/.next/static/chunks/7191-2a7b8ddbd07128b6.js +0 -1
- package/.next/static/chunks/7498-5246b607527180dd.js +0 -1
- package/.next/static/chunks/83.b87d797323ff2034.js +0 -1
- package/.next/static/chunks/9173-ae6b6ebdc42876f1.js +0 -1
- package/.next/static/chunks/9540.69781e999f27cc05.js +0 -1
- package/.next/static/chunks/BannerNewsletter.7c592f132e7048e5.js +0 -1
- package/.next/static/chunks/CartSidebar.a00083c44c87c268.js +0 -1
- package/.next/static/chunks/Newsletter.1004055f09f76d3c.js +0 -1
- package/.next/static/chunks/ProductShelf.d51ba3e6a1b4a57d.js +0 -1
- package/.next/static/chunks/ProductTiles.77284431e2b8c898.js +0 -1
- package/.next/static/chunks/RegionModal.f61aa62e0a09182a.js +0 -1
- package/.next/static/chunks/Toast.6116bc845cd67f49.js +0 -1
- package/.next/static/chunks/UIBannerText.6cc5c00d4ba9b64e.js +0 -1
- package/.next/static/chunks/UISKUMatrixSidebar.782c55a97889e84a.js +0 -1
- package/.next/static/chunks/UIToast.494d0b0ce2c6106a.js +0 -1
- package/.next/static/chunks/pages/[...slug]-d0f23d907ec6fbe3.js +0 -1
- package/.next/static/chunks/pages/[slug]/p-a255e4a7352455df.js +0 -1
- package/.next/static/chunks/pages/_app-1885a948b243078c.js +0 -1
- package/.next/static/chunks/pages/account/orders/[id]-b9feb0c860ff1cec.js +0 -1
- package/.next/static/chunks/pages/account/orders-1d8409a8b4b0e581.js +0 -1
- package/.next/static/chunks/pages/account/profile-5a919fa02b76a422.js +0 -1
- package/.next/static/chunks/pages/account/security-b5ab3d1ecbbea9d9.js +0 -1
- package/.next/static/chunks/pages/checkout-3a4983b22625c4e3.js +0 -1
- package/.next/static/chunks/pages/index-6e68be53d1fef20e.js +0 -1
- package/.next/static/chunks/pages/login-de3dd10c6b35159a.js +0 -1
- package/.next/static/chunks/pages/s-9b0f606f120d66b0.js +0 -1
- package/.next/static/chunks/webpack-f661e0efeacf6028.js +0 -1
- package/.next/static/css/202a74b80e6ce63f.css +0 -1
- /package/.next/static/{auvpWeN2p6A4M2zTGhXzk → pRYrZEXsDEpvxbtvEobPH}/_ssgManifest.js +0 -0
|
@@ -1,33 +1,34 @@
|
|
|
1
|
-
import { setFacet,
|
|
1
|
+
import { setFacet, useSearch } from '@faststore/sdk'
|
|
2
2
|
|
|
3
3
|
import {
|
|
4
|
+
regionSliderTypes,
|
|
5
|
+
Button as UIButton,
|
|
4
6
|
Filter as UIFilter,
|
|
5
7
|
FilterFacetBoolean as UIFilterFacetBoolean,
|
|
6
8
|
FilterFacetBooleanItem as UIFilterFacetBooleanItem,
|
|
7
9
|
FilterFacetRange as UIFilterFacetRange,
|
|
8
10
|
FilterFacets as UIFilterFacets,
|
|
11
|
+
Icon as UIIcon,
|
|
12
|
+
useUI,
|
|
9
13
|
} from '@faststore/ui'
|
|
14
|
+
|
|
10
15
|
import { gql } from '@generated/gql'
|
|
11
|
-
import type { Filter_FacetsFragment } from '@generated/graphql'
|
|
12
16
|
import { useFormattedPrice } from 'src/sdk/product/useFormattedPrice'
|
|
13
17
|
import type { useFilter } from 'src/sdk/search/useFilter'
|
|
14
|
-
import {
|
|
18
|
+
import type { FilterSliderProps } from './FilterSlider'
|
|
15
19
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
*/
|
|
29
|
-
title?: string
|
|
30
|
-
}
|
|
20
|
+
import {
|
|
21
|
+
useDeliveryPromise,
|
|
22
|
+
PICKUP_ALL_FACET_VALUE,
|
|
23
|
+
} from 'src/sdk/deliveryPromise'
|
|
24
|
+
import { getGlobalSettings } from 'src/utils/globalSettings'
|
|
25
|
+
import FilterDeliveryMethodFacet from './FilterDeliveryMethodFacet'
|
|
26
|
+
|
|
27
|
+
interface FilterDesktopProps
|
|
28
|
+
extends Omit<
|
|
29
|
+
FilterSliderProps,
|
|
30
|
+
'onClose' | 'size' | 'direction' | 'applyBtnProps' | 'clearBtnProps'
|
|
31
|
+
> {}
|
|
31
32
|
|
|
32
33
|
function FilterDesktop({
|
|
33
34
|
facets,
|
|
@@ -35,84 +36,141 @@ function FilterDesktop({
|
|
|
35
36
|
dispatch,
|
|
36
37
|
expanded,
|
|
37
38
|
title,
|
|
38
|
-
}:
|
|
39
|
-
const
|
|
40
|
-
|
|
41
|
-
const
|
|
42
|
-
|
|
43
|
-
:
|
|
39
|
+
}: FilterDesktopProps & ReturnType<typeof useFilter>) {
|
|
40
|
+
const cmsData = getGlobalSettings()
|
|
41
|
+
const { deliveryPromise: deliveryPromiseSettings } = cmsData ?? {}
|
|
42
|
+
const {
|
|
43
|
+
resetInfiniteScroll,
|
|
44
|
+
state: searchState,
|
|
45
|
+
setState: setSearchState,
|
|
46
|
+
} = useSearch()
|
|
47
|
+
const { openRegionSlider } = useUI()
|
|
48
|
+
const {
|
|
49
|
+
facets: filteredFacets,
|
|
50
|
+
deliveryLabel,
|
|
51
|
+
isPickupAllEnabled,
|
|
52
|
+
shouldDisplayDeliveryButton,
|
|
53
|
+
onDeliveryFacetChange,
|
|
54
|
+
} = useDeliveryPromise({
|
|
55
|
+
allFacets: facets,
|
|
56
|
+
selectedFilterFacets: searchState.selectedFacets,
|
|
57
|
+
deliveryPromiseSettings,
|
|
58
|
+
})
|
|
44
59
|
|
|
45
60
|
return (
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
const isExpanded = expanded.has(index)
|
|
57
|
-
return (
|
|
61
|
+
<>
|
|
62
|
+
<UIFilter
|
|
63
|
+
testId={`desktop-${testId}`}
|
|
64
|
+
title={title}
|
|
65
|
+
indicesExpanded={expanded}
|
|
66
|
+
onAccordionChange={(idx) =>
|
|
67
|
+
dispatch({ type: 'toggleExpanded', payload: idx })
|
|
68
|
+
}
|
|
69
|
+
>
|
|
70
|
+
{shouldDisplayDeliveryButton && (
|
|
58
71
|
<UIFilterFacets
|
|
59
|
-
key={`${testId}
|
|
72
|
+
key={`${testId}-delivery-unset`}
|
|
60
73
|
testId={testId}
|
|
61
|
-
index={
|
|
62
|
-
type=
|
|
63
|
-
label={
|
|
74
|
+
index={0}
|
|
75
|
+
type=""
|
|
76
|
+
label={deliveryLabel}
|
|
77
|
+
description={deliveryPromiseSettings?.deliveryMethods?.description}
|
|
64
78
|
>
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
...state,
|
|
75
|
-
selectedFacets: toggleFacet(
|
|
76
|
-
state.selectedFacets,
|
|
77
|
-
facet
|
|
78
|
-
),
|
|
79
|
-
page: 0,
|
|
80
|
-
})
|
|
81
|
-
resetInfiniteScroll(0)
|
|
82
|
-
}}
|
|
83
|
-
selected={item.selected}
|
|
84
|
-
value={item.value}
|
|
85
|
-
quantity={item.quantity}
|
|
86
|
-
facetKey={facet.key}
|
|
87
|
-
label={item.label}
|
|
88
|
-
/>
|
|
89
|
-
))}
|
|
90
|
-
</UIFilterFacetBoolean>
|
|
91
|
-
)}
|
|
92
|
-
{type === 'StoreFacetRange' && isExpanded && (
|
|
93
|
-
<UIFilterFacetRange
|
|
94
|
-
facetKey={facet.key}
|
|
95
|
-
min={facet.min}
|
|
96
|
-
max={facet.max}
|
|
97
|
-
formatter={
|
|
98
|
-
facet.key.toLowerCase() === 'price'
|
|
99
|
-
? useFormattedPrice
|
|
100
|
-
: undefined
|
|
101
|
-
}
|
|
102
|
-
onFacetChange={(facet) => {
|
|
103
|
-
setState({
|
|
104
|
-
...state,
|
|
105
|
-
selectedFacets: setFacet(state.selectedFacets, facet, true),
|
|
106
|
-
page: 0,
|
|
107
|
-
})
|
|
108
|
-
resetInfiniteScroll(0)
|
|
109
|
-
}}
|
|
110
|
-
/>
|
|
111
|
-
)}
|
|
79
|
+
<UIButton
|
|
80
|
+
data-fs-filter-list-delivery-button
|
|
81
|
+
variant="secondary"
|
|
82
|
+
onClick={() => openRegionSlider(regionSliderTypes.setLocation)}
|
|
83
|
+
icon={<UIIcon name="MapPin" />}
|
|
84
|
+
>
|
|
85
|
+
{deliveryPromiseSettings?.deliveryMethods
|
|
86
|
+
?.setLocationButtonLabel ?? 'Set Location'}
|
|
87
|
+
</UIButton>
|
|
112
88
|
</UIFilterFacets>
|
|
113
|
-
)
|
|
114
|
-
|
|
115
|
-
|
|
89
|
+
)}
|
|
90
|
+
|
|
91
|
+
{filteredFacets.map((facet, idx) => {
|
|
92
|
+
const index = shouldDisplayDeliveryButton ? idx + 1 : idx
|
|
93
|
+
const { __typename: type, label } = facet
|
|
94
|
+
const isExpanded = expanded.has(index)
|
|
95
|
+
const isDeliveryFacet = facet.key === 'shipping'
|
|
96
|
+
|
|
97
|
+
return (
|
|
98
|
+
<UIFilterFacets
|
|
99
|
+
key={`${testId}-${label}-${index}`}
|
|
100
|
+
testId={testId}
|
|
101
|
+
index={index}
|
|
102
|
+
type={type}
|
|
103
|
+
label={isDeliveryFacet ? deliveryLabel : label}
|
|
104
|
+
description={
|
|
105
|
+
isDeliveryFacet
|
|
106
|
+
? deliveryPromiseSettings?.deliveryMethods?.description
|
|
107
|
+
: undefined
|
|
108
|
+
}
|
|
109
|
+
>
|
|
110
|
+
{type === 'StoreFacetBoolean' && isExpanded && (
|
|
111
|
+
<UIFilterFacetBoolean>
|
|
112
|
+
{facet.values.map(
|
|
113
|
+
(item) =>
|
|
114
|
+
(item.value !== PICKUP_ALL_FACET_VALUE ||
|
|
115
|
+
isPickupAllEnabled) && (
|
|
116
|
+
<UIFilterFacetBooleanItem
|
|
117
|
+
key={`${testId}-${facet.label}-${item.value}`}
|
|
118
|
+
id={`${testId}-${facet.label}-${item.value}`}
|
|
119
|
+
testId={testId}
|
|
120
|
+
onFacetChange={(facet) => {
|
|
121
|
+
onDeliveryFacetChange({ facet })
|
|
122
|
+
resetInfiniteScroll(0)
|
|
123
|
+
}}
|
|
124
|
+
selected={item.selected}
|
|
125
|
+
value={item.value}
|
|
126
|
+
quantity={item.quantity}
|
|
127
|
+
facetKey={facet.key}
|
|
128
|
+
label={
|
|
129
|
+
isDeliveryFacet ? (
|
|
130
|
+
<FilterDeliveryMethodFacet
|
|
131
|
+
item={item}
|
|
132
|
+
deliveryMethods={
|
|
133
|
+
deliveryPromiseSettings?.deliveryMethods
|
|
134
|
+
}
|
|
135
|
+
/>
|
|
136
|
+
) : (
|
|
137
|
+
item.label
|
|
138
|
+
)
|
|
139
|
+
}
|
|
140
|
+
type={isDeliveryFacet ? 'radio' : 'checkbox'}
|
|
141
|
+
/>
|
|
142
|
+
)
|
|
143
|
+
)}
|
|
144
|
+
</UIFilterFacetBoolean>
|
|
145
|
+
)}
|
|
146
|
+
{type === 'StoreFacetRange' && isExpanded && (
|
|
147
|
+
<UIFilterFacetRange
|
|
148
|
+
facetKey={facet.key}
|
|
149
|
+
min={facet.min}
|
|
150
|
+
max={facet.max}
|
|
151
|
+
formatter={
|
|
152
|
+
facet.key.toLowerCase() === 'price'
|
|
153
|
+
? useFormattedPrice
|
|
154
|
+
: undefined
|
|
155
|
+
}
|
|
156
|
+
onFacetChange={(facet) => {
|
|
157
|
+
setSearchState({
|
|
158
|
+
selectedFacets: setFacet(
|
|
159
|
+
searchState.selectedFacets,
|
|
160
|
+
facet,
|
|
161
|
+
true
|
|
162
|
+
),
|
|
163
|
+
page: 0,
|
|
164
|
+
})
|
|
165
|
+
resetInfiniteScroll(0)
|
|
166
|
+
}}
|
|
167
|
+
/>
|
|
168
|
+
)}
|
|
169
|
+
</UIFilterFacets>
|
|
170
|
+
)
|
|
171
|
+
})}
|
|
172
|
+
</UIFilter>
|
|
173
|
+
</>
|
|
116
174
|
)
|
|
117
175
|
}
|
|
118
176
|
|
|
@@ -1,16 +1,31 @@
|
|
|
1
1
|
import dynamic from 'next/dynamic'
|
|
2
2
|
|
|
3
3
|
import { useSearch } from '@faststore/sdk'
|
|
4
|
+
import {
|
|
5
|
+
regionSliderTypes,
|
|
6
|
+
useUI,
|
|
7
|
+
type ButtonProps as UIButtonProps,
|
|
8
|
+
type FilterFacetBooleanItemProps as UIFilterFacetBooleanItemProps,
|
|
9
|
+
type FilterFacetRangeProps as UIFilterFacetRangeProps,
|
|
10
|
+
type FilterFacetsProps as UIFilterFacetsProps,
|
|
11
|
+
type FilterProps as UIFilterProps,
|
|
12
|
+
type FilterSliderProps as UIFilterSliderProps,
|
|
13
|
+
type IconProps as UIIconProps,
|
|
14
|
+
} from '@faststore/ui'
|
|
15
|
+
|
|
4
16
|
import { useFormattedPrice } from 'src/sdk/product/useFormattedPrice'
|
|
5
|
-
import { deliveryPromise } from 'discovery.config'
|
|
6
17
|
|
|
7
|
-
import type {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
18
|
+
import type { Filter_FacetsFragment } from '@generated/graphql'
|
|
19
|
+
import FilterDeliveryMethodFacet from './FilterDeliveryMethodFacet'
|
|
20
|
+
|
|
21
|
+
import type { useFilter } from 'src/sdk/search/useFilter'
|
|
22
|
+
import {
|
|
23
|
+
useDeliveryPromise,
|
|
24
|
+
PICKUP_ALL_FACET_VALUE,
|
|
25
|
+
} from 'src/sdk/deliveryPromise'
|
|
26
|
+
import { getGlobalSettings } from 'src/utils/globalSettings'
|
|
27
|
+
|
|
28
|
+
import styles from './section.module.scss'
|
|
14
29
|
|
|
15
30
|
const UIFilter = dynamic<{ children: React.ReactNode } & UIFilterProps>(() =>
|
|
16
31
|
/* webpackChunkName: "UIFilter" */
|
|
@@ -38,13 +53,14 @@ const UIFilterSlider = dynamic<UIFilterSliderProps>(() =>
|
|
|
38
53
|
/* webpackChunkName: "UIFilterSlider" */
|
|
39
54
|
import('@faststore/ui').then((mod) => mod.FilterSlider)
|
|
40
55
|
)
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
56
|
+
const UIButton = dynamic<UIButtonProps>(() =>
|
|
57
|
+
/* webpackChunkName: "UIButton" */
|
|
58
|
+
import('@faststore/ui').then((mod) => mod.Button)
|
|
59
|
+
)
|
|
60
|
+
const UIIcon = dynamic<UIIconProps>(() =>
|
|
61
|
+
/* webpackChunkName: "UIIcon" */
|
|
62
|
+
import('@faststore/ui').then((mod) => mod.Icon)
|
|
63
|
+
)
|
|
48
64
|
export interface FilterSliderProps {
|
|
49
65
|
/**
|
|
50
66
|
* ID to find this component in testing tools (e.g.: cypress,
|
|
@@ -80,104 +96,177 @@ function FilterSlider({
|
|
|
80
96
|
applyButtonLabel,
|
|
81
97
|
}: FilterSliderProps & ReturnType<typeof useFilter>) {
|
|
82
98
|
const { resetInfiniteScroll, setState, state } = useSearch()
|
|
99
|
+
const { openRegionSlider } = useUI()
|
|
100
|
+
|
|
101
|
+
const cmsData = getGlobalSettings()
|
|
102
|
+
const { deliveryPromise: deliveryPromiseSettings } = cmsData ?? {}
|
|
83
103
|
|
|
84
|
-
const
|
|
85
|
-
|
|
86
|
-
|
|
104
|
+
const {
|
|
105
|
+
facets: filteredFacets,
|
|
106
|
+
deliveryLabel,
|
|
107
|
+
isPickupAllEnabled,
|
|
108
|
+
shouldDisplayDeliveryButton,
|
|
109
|
+
onDeliveryFacetChange,
|
|
110
|
+
} = useDeliveryPromise({
|
|
111
|
+
selectedFilterFacets: selected,
|
|
112
|
+
allFacets: facets,
|
|
113
|
+
deliveryPromiseSettings,
|
|
114
|
+
})
|
|
87
115
|
|
|
88
116
|
return (
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
117
|
+
<>
|
|
118
|
+
<UIFilterSlider
|
|
119
|
+
overlayProps={{
|
|
120
|
+
className: `section ${styles.section} section-filter-slider`,
|
|
121
|
+
}}
|
|
122
|
+
title={title}
|
|
123
|
+
size="partial"
|
|
124
|
+
direction="rightSide"
|
|
125
|
+
clearBtnProps={{
|
|
126
|
+
variant: 'secondary',
|
|
127
|
+
onClick: () => dispatch({ type: 'selectFacets', payload: [] }),
|
|
128
|
+
children: clearButtonLabel ?? 'Clear All',
|
|
129
|
+
}}
|
|
130
|
+
applyBtnProps={{
|
|
131
|
+
variant: 'primary',
|
|
132
|
+
onClick: () => {
|
|
133
|
+
resetInfiniteScroll(0)
|
|
134
|
+
|
|
135
|
+
const isOtherShippingFacetSelected = selected.some(
|
|
136
|
+
({ key, value }) =>
|
|
137
|
+
key === 'shipping' && value !== 'pickup-in-point'
|
|
138
|
+
)
|
|
139
|
+
const removePickupPointFacet = selected.filter(
|
|
140
|
+
({ key }) => key !== 'pickupPoint'
|
|
141
|
+
)
|
|
105
142
|
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
143
|
+
setState({
|
|
144
|
+
selectedFacets: isOtherShippingFacetSelected
|
|
145
|
+
? removePickupPointFacet
|
|
146
|
+
: selected,
|
|
147
|
+
page: 0,
|
|
148
|
+
})
|
|
149
|
+
},
|
|
150
|
+
children: applyButtonLabel ?? 'Apply',
|
|
151
|
+
}}
|
|
152
|
+
onClose={() => {
|
|
153
|
+
dispatch({
|
|
154
|
+
type: 'selectFacets',
|
|
155
|
+
payload: state.selectedFacets,
|
|
110
156
|
})
|
|
111
|
-
}
|
|
112
|
-
children: applyButtonLabel ?? 'Apply',
|
|
113
|
-
}}
|
|
114
|
-
onClose={() => {
|
|
115
|
-
dispatch({
|
|
116
|
-
type: 'selectFacets',
|
|
117
|
-
payload: state.selectedFacets,
|
|
118
|
-
})
|
|
119
|
-
}}
|
|
120
|
-
>
|
|
121
|
-
<UIFilter
|
|
122
|
-
testId={`mobile-${testId}`}
|
|
123
|
-
indicesExpanded={expanded}
|
|
124
|
-
onAccordionChange={(index: number) =>
|
|
125
|
-
dispatch({ type: 'toggleExpanded', payload: index })
|
|
126
|
-
}
|
|
157
|
+
}}
|
|
127
158
|
>
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
159
|
+
<UIFilter
|
|
160
|
+
testId={`mobile-${testId}`}
|
|
161
|
+
indicesExpanded={expanded}
|
|
162
|
+
onAccordionChange={(index: number) =>
|
|
163
|
+
dispatch({ type: 'toggleExpanded', payload: index })
|
|
164
|
+
}
|
|
165
|
+
>
|
|
166
|
+
{shouldDisplayDeliveryButton && (
|
|
132
167
|
<UIFilterFacets
|
|
133
|
-
key={`${testId}
|
|
134
|
-
testId={
|
|
135
|
-
index={
|
|
136
|
-
type=
|
|
137
|
-
label={
|
|
168
|
+
key={`${testId}-delivery-0`}
|
|
169
|
+
testId={testId}
|
|
170
|
+
index={0}
|
|
171
|
+
type=""
|
|
172
|
+
label={deliveryLabel}
|
|
173
|
+
description={
|
|
174
|
+
deliveryPromiseSettings?.deliveryMethods?.description
|
|
175
|
+
}
|
|
138
176
|
>
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
}
|
|
149
|
-
selected={item.selected}
|
|
150
|
-
value={item.value}
|
|
151
|
-
quantity={item.quantity}
|
|
152
|
-
facetKey={facet.key}
|
|
153
|
-
label={item.label}
|
|
154
|
-
/>
|
|
155
|
-
))}
|
|
156
|
-
</UIFilterFacetBoolean>
|
|
157
|
-
)}
|
|
158
|
-
{type === 'StoreFacetRange' && isExpanded && (
|
|
159
|
-
<UIFilterFacetRange
|
|
160
|
-
facetKey={facet.key}
|
|
161
|
-
min={facet.min}
|
|
162
|
-
max={facet.max}
|
|
163
|
-
formatter={
|
|
164
|
-
facet.key.toLowerCase() === 'price'
|
|
165
|
-
? useFormattedPrice
|
|
166
|
-
: undefined
|
|
167
|
-
}
|
|
168
|
-
onFacetChange={(facet) =>
|
|
169
|
-
dispatch({
|
|
170
|
-
type: 'setFacet',
|
|
171
|
-
payload: { facet, unique: true },
|
|
172
|
-
})
|
|
173
|
-
}
|
|
174
|
-
/>
|
|
175
|
-
)}
|
|
177
|
+
<UIButton
|
|
178
|
+
data-fs-filter-list-delivery-button
|
|
179
|
+
variant="secondary"
|
|
180
|
+
onClick={() => openRegionSlider(regionSliderTypes.setLocation)}
|
|
181
|
+
icon={<UIIcon name="MapPin" />}
|
|
182
|
+
>
|
|
183
|
+
{deliveryPromiseSettings?.deliveryMethods
|
|
184
|
+
?.setLocationButtonLabel ?? 'Set Location'}
|
|
185
|
+
</UIButton>
|
|
176
186
|
</UIFilterFacets>
|
|
177
|
-
)
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
187
|
+
)}
|
|
188
|
+
|
|
189
|
+
{filteredFacets.map((facet, idx) => {
|
|
190
|
+
const index = shouldDisplayDeliveryButton ? idx + 1 : idx
|
|
191
|
+
const { __typename: type, label } = facet
|
|
192
|
+
const isExpanded = expanded.has(index)
|
|
193
|
+
const isDeliveryFacet = facet.key === 'shipping'
|
|
194
|
+
|
|
195
|
+
return (
|
|
196
|
+
<UIFilterFacets
|
|
197
|
+
key={`${testId}-${label}-${index}`}
|
|
198
|
+
testId={`mobile-${testId}`}
|
|
199
|
+
index={index}
|
|
200
|
+
type={type}
|
|
201
|
+
label={isDeliveryFacet ? deliveryLabel : label}
|
|
202
|
+
description={
|
|
203
|
+
isDeliveryFacet
|
|
204
|
+
? deliveryPromiseSettings?.deliveryMethods?.description
|
|
205
|
+
: undefined
|
|
206
|
+
}
|
|
207
|
+
>
|
|
208
|
+
{type === 'StoreFacetBoolean' && isExpanded && (
|
|
209
|
+
<UIFilterFacetBoolean>
|
|
210
|
+
{facet.values.map(
|
|
211
|
+
(item) =>
|
|
212
|
+
(item.value !== PICKUP_ALL_FACET_VALUE ||
|
|
213
|
+
isPickupAllEnabled) && (
|
|
214
|
+
<UIFilterFacetBooleanItem
|
|
215
|
+
key={`${testId}-${facet.label}-${item.value}`}
|
|
216
|
+
id={`${testId}-${facet.label}-${item.value}`}
|
|
217
|
+
testId={`mobile-${testId}`}
|
|
218
|
+
onFacetChange={(facet) => {
|
|
219
|
+
onDeliveryFacetChange({
|
|
220
|
+
facet,
|
|
221
|
+
filterDispatch: dispatch,
|
|
222
|
+
})
|
|
223
|
+
}}
|
|
224
|
+
selected={item.selected}
|
|
225
|
+
value={item.value}
|
|
226
|
+
quantity={item.quantity}
|
|
227
|
+
facetKey={facet.key}
|
|
228
|
+
label={
|
|
229
|
+
isDeliveryFacet ? (
|
|
230
|
+
<FilterDeliveryMethodFacet
|
|
231
|
+
item={item}
|
|
232
|
+
deliveryMethods={
|
|
233
|
+
deliveryPromiseSettings?.deliveryMethods
|
|
234
|
+
}
|
|
235
|
+
/>
|
|
236
|
+
) : (
|
|
237
|
+
item.label
|
|
238
|
+
)
|
|
239
|
+
}
|
|
240
|
+
type={isDeliveryFacet ? 'radio' : 'checkbox'}
|
|
241
|
+
/>
|
|
242
|
+
)
|
|
243
|
+
)}
|
|
244
|
+
</UIFilterFacetBoolean>
|
|
245
|
+
)}
|
|
246
|
+
{type === 'StoreFacetRange' && isExpanded && (
|
|
247
|
+
<UIFilterFacetRange
|
|
248
|
+
facetKey={facet.key}
|
|
249
|
+
min={facet.min}
|
|
250
|
+
max={facet.max}
|
|
251
|
+
formatter={
|
|
252
|
+
facet.key.toLowerCase() === 'price'
|
|
253
|
+
? useFormattedPrice
|
|
254
|
+
: undefined
|
|
255
|
+
}
|
|
256
|
+
onFacetChange={(facet) =>
|
|
257
|
+
dispatch({
|
|
258
|
+
type: 'setFacet',
|
|
259
|
+
payload: { facet, unique: true },
|
|
260
|
+
})
|
|
261
|
+
}
|
|
262
|
+
/>
|
|
263
|
+
)}
|
|
264
|
+
</UIFilterFacets>
|
|
265
|
+
)
|
|
266
|
+
})}
|
|
267
|
+
</UIFilter>
|
|
268
|
+
</UIFilterSlider>
|
|
269
|
+
</>
|
|
181
270
|
)
|
|
182
271
|
}
|
|
183
272
|
|
|
@@ -6,11 +6,13 @@
|
|
|
6
6
|
@import "@faststore/ui/src/components/atoms/Input/styles.scss";
|
|
7
7
|
@import "@faststore/ui/src/components/atoms/Link/styles.scss";
|
|
8
8
|
@import "@faststore/ui/src/components/atoms/List/styles.scss";
|
|
9
|
+
@import "@faststore/ui/src/components/atoms/Radio/styles.scss";
|
|
9
10
|
@import "@faststore/ui/src/components/atoms/Slider/styles.scss";
|
|
10
11
|
@import "@faststore/ui/src/components/molecules/DiscountBadge/styles.scss";
|
|
11
12
|
@import "@faststore/ui/src/components/molecules/Accordion/styles.scss";
|
|
12
13
|
@import "@faststore/ui/src/components/molecules/InputField/styles.scss";
|
|
13
14
|
@import "@faststore/ui/src/components/molecules/Modal/styles.scss";
|
|
15
|
+
@import "@faststore/ui/src/components/molecules/RadioField/styles.scss";
|
|
14
16
|
@import "@faststore/ui/src/components/molecules/SelectField/styles.scss";
|
|
15
17
|
@import "@faststore/ui/src/components/organisms/Filter/styles.scss";
|
|
16
18
|
@import "@faststore/ui/src/components/organisms/FilterSlider/styles.scss";
|
|
@@ -38,6 +38,7 @@
|
|
|
38
38
|
@import "@faststore/ui/src/components/atoms/Link/styles.scss";
|
|
39
39
|
@import "@faststore/ui/src/components/atoms/List/styles.scss";
|
|
40
40
|
@import "@faststore/ui/src/components/atoms/Price/styles.scss";
|
|
41
|
+
@import "@faststore/ui/src/components/atoms/Radio/styles.scss";
|
|
41
42
|
@import "@faststore/ui/src/components/atoms/Select/styles.scss";
|
|
42
43
|
@import "@faststore/ui/src/components/atoms/Skeleton/styles";
|
|
43
44
|
@import "@faststore/ui/src/components/atoms/Slider/styles.scss";
|
|
@@ -48,6 +49,7 @@
|
|
|
48
49
|
@import "@faststore/ui/src/components/molecules/ProductCard/styles.scss";
|
|
49
50
|
@import "@faststore/ui/src/components/molecules/ProductCardSkeleton/styles";
|
|
50
51
|
@import "@faststore/ui/src/components/molecules/ProductPrice/styles.scss";
|
|
52
|
+
@import "@faststore/ui/src/components/molecules/RadioField/styles.scss";
|
|
51
53
|
@import "@faststore/ui/src/components/molecules/SelectField/styles.scss";
|
|
52
54
|
@import "@faststore/ui/src/components/organisms/EmptyState/styles.scss";
|
|
53
55
|
@import "@faststore/ui/src/components/organisms/Filter/styles.scss";
|
|
@@ -13,7 +13,7 @@ type RegionBarSectionProps = {
|
|
|
13
13
|
*/
|
|
14
14
|
className?: string
|
|
15
15
|
/**
|
|
16
|
-
* A React component that will be rendered as
|
|
16
|
+
* A React component that will be rendered as the location icon.
|
|
17
17
|
*/
|
|
18
18
|
icon: RegionBarProps['icon']
|
|
19
19
|
/**
|
|
@@ -22,6 +22,7 @@ type RegionBarSectionProps = {
|
|
|
22
22
|
label: RegionBarProps['label']
|
|
23
23
|
/**
|
|
24
24
|
* Specifies a label for the edit text.
|
|
25
|
+
* @deprecated
|
|
25
26
|
*/
|
|
26
27
|
editLabel?: RegionBarProps['editLabel']
|
|
27
28
|
/**
|