@faststore/core 3.67.0 → 3.68.1

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