@faststore/core 2.0.153-alpha.0 → 2.0.156-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (170) hide show
  1. package/.turbo/turbo-build.log +6 -8
  2. package/@generated/graphql/index.ts +5 -0
  3. package/@generated/graphql/persisted.json +1 -1
  4. package/CHANGELOG.md +10 -0
  5. package/cms/faststore/sections.json +3 -8
  6. package/faststore.config.js +1 -0
  7. package/package.json +5 -5
  8. package/src/components/cms/GlobalSections.tsx +3 -25
  9. package/src/components/cms/RenderSections.tsx +37 -2
  10. package/src/components/sections/CrossSellingShelf/CrossSellingShelf.tsx +17 -3
  11. package/src/components/sections/ProductShelf/ProductShelf.tsx +7 -76
  12. package/src/components/sections/Section/section.scss +0 -7
  13. package/src/components/{sections → ui}/ProductShelf/Overrides.tsx +2 -2
  14. package/src/components/ui/ProductShelf/ProductShelf.tsx +106 -0
  15. package/src/components/ui/ProductShelf/index.ts +2 -0
  16. package/src/pages/[...slug].tsx +1 -7
  17. package/src/sdk/session/index.ts +1 -0
  18. package/.next/BUILD_ID +0 -1
  19. package/.next/build-manifest.json +0 -132
  20. package/.next/cache/.tsbuildinfo +0 -1
  21. package/.next/cache/config.json +0 -7
  22. package/.next/cache/eslint/.cache_1gneedd +0 -1
  23. package/.next/cache/next-server.js.nft.json +0 -1
  24. package/.next/cache/webpack/client-production/0.pack +0 -0
  25. package/.next/cache/webpack/client-production/index.pack +0 -0
  26. package/.next/cache/webpack/server-production/0.pack +0 -0
  27. package/.next/cache/webpack/server-production/index.pack +0 -0
  28. package/.next/export-marker.json +0 -1
  29. package/.next/images-manifest.json +0 -1
  30. package/.next/next-server.js.nft.json +0 -1
  31. package/.next/package.json +0 -1
  32. package/.next/prerender-manifest.json +0 -1
  33. package/.next/react-loadable-manifest.json +0 -48
  34. package/.next/required-server-files.json +0 -1
  35. package/.next/routes-manifest.json +0 -1
  36. package/.next/server/chunks/104.js +0 -703
  37. package/.next/server/chunks/123.js +0 -58
  38. package/.next/server/chunks/143.js +0 -106
  39. package/.next/server/chunks/183.js +0 -80
  40. package/.next/server/chunks/247.js +0 -61
  41. package/.next/server/chunks/280.js +0 -324
  42. package/.next/server/chunks/287.js +0 -58
  43. package/.next/server/chunks/289.js +0 -229
  44. package/.next/server/chunks/312.js +0 -697
  45. package/.next/server/chunks/336.js +0 -821
  46. package/.next/server/chunks/350.js +0 -142
  47. package/.next/server/chunks/368.js +0 -253
  48. package/.next/server/chunks/401.js +0 -7241
  49. package/.next/server/chunks/431.js +0 -7241
  50. package/.next/server/chunks/502.js +0 -600
  51. package/.next/server/chunks/557.js +0 -132
  52. package/.next/server/chunks/576.js +0 -80
  53. package/.next/server/chunks/597.js +0 -169
  54. package/.next/server/chunks/608.js +0 -644
  55. package/.next/server/chunks/644.js +0 -235
  56. package/.next/server/chunks/664.js +0 -3401
  57. package/.next/server/chunks/676.js +0 -32
  58. package/.next/server/chunks/701.js +0 -87
  59. package/.next/server/chunks/74.js +0 -2690
  60. package/.next/server/chunks/82.js +0 -371
  61. package/.next/server/chunks/854.js +0 -72
  62. package/.next/server/chunks/859.js +0 -959
  63. package/.next/server/chunks/874.js +0 -487
  64. package/.next/server/chunks/886.js +0 -120
  65. package/.next/server/chunks/907.js +0 -1803
  66. package/.next/server/chunks/98.js +0 -124
  67. package/.next/server/chunks/font-manifest.json +0 -1
  68. package/.next/server/font-manifest.json +0 -1
  69. package/.next/server/middleware-build-manifest.js +0 -1
  70. package/.next/server/middleware-manifest.json +0 -6
  71. package/.next/server/middleware-react-loadable-manifest.js +0 -1
  72. package/.next/server/pages/404.js +0 -393
  73. package/.next/server/pages/404.js.nft.json +0 -1
  74. package/.next/server/pages/500.js +0 -395
  75. package/.next/server/pages/500.js.nft.json +0 -1
  76. package/.next/server/pages/[...slug].js +0 -733
  77. package/.next/server/pages/[...slug].js.nft.json +0 -1
  78. package/.next/server/pages/[slug]/p.js +0 -2458
  79. package/.next/server/pages/[slug]/p.js.nft.json +0 -1
  80. package/.next/server/pages/_app.js +0 -368
  81. package/.next/server/pages/_app.js.nft.json +0 -1
  82. package/.next/server/pages/_document.js +0 -304
  83. package/.next/server/pages/_document.js.nft.json +0 -1
  84. package/.next/server/pages/_error.js +0 -164
  85. package/.next/server/pages/_error.js.nft.json +0 -1
  86. package/.next/server/pages/account.js +0 -370
  87. package/.next/server/pages/account.js.nft.json +0 -1
  88. package/.next/server/pages/api/graphql.js +0 -315
  89. package/.next/server/pages/api/graphql.js.nft.json +0 -1
  90. package/.next/server/pages/api/preview.js +0 -118
  91. package/.next/server/pages/api/preview.js.nft.json +0 -1
  92. package/.next/server/pages/checkout.js +0 -370
  93. package/.next/server/pages/checkout.js.nft.json +0 -1
  94. package/.next/server/pages/en-US/404.html +0 -81
  95. package/.next/server/pages/en-US/404.json +0 -1
  96. package/.next/server/pages/en-US/500.html +0 -81
  97. package/.next/server/pages/en-US/500.json +0 -1
  98. package/.next/server/pages/en-US/account.html +0 -81
  99. package/.next/server/pages/en-US/account.json +0 -1
  100. package/.next/server/pages/en-US/checkout.html +0 -81
  101. package/.next/server/pages/en-US/checkout.json +0 -1
  102. package/.next/server/pages/en-US/login.html +0 -81
  103. package/.next/server/pages/en-US/login.json +0 -1
  104. package/.next/server/pages/en-US/s.html +0 -81
  105. package/.next/server/pages/en-US/s.json +0 -1
  106. package/.next/server/pages/en-US.html +0 -81
  107. package/.next/server/pages/en-US.json +0 -1
  108. package/.next/server/pages/index.js +0 -966
  109. package/.next/server/pages/index.js.nft.json +0 -1
  110. package/.next/server/pages/login.js +0 -375
  111. package/.next/server/pages/login.js.nft.json +0 -1
  112. package/.next/server/pages/s.js +0 -473
  113. package/.next/server/pages/s.js.nft.json +0 -1
  114. package/.next/server/pages-manifest.json +0 -16
  115. package/.next/server/webpack-api-runtime.js +0 -229
  116. package/.next/server/webpack-runtime.js +0 -229
  117. package/.next/static/Jdc52lXcDWIk2D0wQ-Z4p/_buildManifest.js +0 -1
  118. package/.next/static/Jdc52lXcDWIk2D0wQ-Z4p/_ssgManifest.js +0 -1
  119. package/.next/static/chunks/0-0e3914d9fc148f74.js +0 -1
  120. package/.next/static/chunks/143.dd8a556e6957baa1.js +0 -1
  121. package/.next/static/chunks/226.b57e10ad9932f88c.js +0 -1
  122. package/.next/static/chunks/336.0846f48eccce57e4.js +0 -1
  123. package/.next/static/chunks/366-c0bfd9890048babf.js +0 -1
  124. package/.next/static/chunks/377-b3616792e1f5f651.js +0 -1
  125. package/.next/static/chunks/391-47b923ef44945418.js +0 -1
  126. package/.next/static/chunks/495.0ecd099878b2a36d.js +0 -1
  127. package/.next/static/chunks/502.ae82de1669112b15.js +0 -1
  128. package/.next/static/chunks/545-1d3d08edfd2ee4c6.js +0 -1
  129. package/.next/static/chunks/597.c5cf3fbeae5ceb63.js +0 -1
  130. package/.next/static/chunks/64.ebbe1d2b40f980c7.js +0 -1
  131. package/.next/static/chunks/651.7142f31ce1e052b3.js +0 -1
  132. package/.next/static/chunks/741.52f7fb873418346f.js +0 -1
  133. package/.next/static/chunks/98.97381d2021f86cd9.js +0 -1
  134. package/.next/static/chunks/framework-dfd14d7ce6600b03.js +0 -1
  135. package/.next/static/chunks/main-fd466221927468fd.js +0 -1
  136. package/.next/static/chunks/pages/404-459452495a0df278.js +0 -1
  137. package/.next/static/chunks/pages/500-008e30c48eceebed.js +0 -1
  138. package/.next/static/chunks/pages/[...slug]-bd1885159f7dfbba.js +0 -1
  139. package/.next/static/chunks/pages/[slug]/p-fa35dd93d53f75f6.js +0 -1
  140. package/.next/static/chunks/pages/_app-3e4e7e579cb0681a.js +0 -1
  141. package/.next/static/chunks/pages/_error-a7a0c1d9bfbb4f38.js +0 -1
  142. package/.next/static/chunks/pages/account-46263f0c100c3eae.js +0 -1
  143. package/.next/static/chunks/pages/checkout-20bb3710b24df3b6.js +0 -1
  144. package/.next/static/chunks/pages/index-49b7ee570f7cc4b7.js +0 -1
  145. package/.next/static/chunks/pages/login-f9d316d261fcc062.js +0 -1
  146. package/.next/static/chunks/pages/s-1cbe740b5b781d28.js +0 -1
  147. package/.next/static/chunks/polyfills-c67a75d1b6f99dc8.js +0 -1
  148. package/.next/static/chunks/webpack-eb5ed34c93d07fac.js +0 -1
  149. package/.next/static/css/1323734429a8aa40.css +0 -1
  150. package/.next/static/css/13a4da555ff5e3be.css +0 -1
  151. package/.next/static/css/2e00f7ba49c754b3.css +0 -1
  152. package/.next/static/css/7d822a137c54a781.css +0 -1
  153. package/.next/static/css/a0feab89b7648c5c.css +0 -1
  154. package/.next/static/css/a13a9f9cd349d906.css +0 -1
  155. package/.next/static/css/a45618030b16a245.css +0 -1
  156. package/.next/static/css/bde408cc006e64f8.css +0 -1
  157. package/.next/static/css/d462d9478ce00021.css +0 -1
  158. package/.next/static/css/e02cdad8fc000339.css +0 -1
  159. package/.next/trace +0 -69
  160. package/public/~partytown/debug/partytown-atomics.js +0 -556
  161. package/public/~partytown/debug/partytown-media.js +0 -374
  162. package/public/~partytown/debug/partytown-sandbox-sw.js +0 -543
  163. package/public/~partytown/debug/partytown-sw.js +0 -59
  164. package/public/~partytown/debug/partytown-ww-atomics.js +0 -1789
  165. package/public/~partytown/debug/partytown-ww-sw.js +0 -1781
  166. package/public/~partytown/debug/partytown.js +0 -72
  167. package/public/~partytown/partytown-atomics.js +0 -2
  168. package/public/~partytown/partytown-media.js +0 -2
  169. package/public/~partytown/partytown-sw.js +0 -2
  170. package/public/~partytown/partytown.js +0 -2
@@ -16,18 +16,16 @@ info - Collecting page data...
16
16
  info - Generating static pages (0/7)
17
17
  info - Generating static pages (1/7)
18
18
  info - Generating static pages (3/7)
19
- warn - CallToAction not found. Add a new component for this section or remove it from the CMS
20
- warn - IncentivesHeader not found. Add a new component for this section or remove it from the CMS
21
19
  info - Generating static pages (5/7)
22
20
  info - Generating static pages (7/7)
23
21
  info - Finalizing page optimization...
24
22
 
25
23
  Route (pages) Size First Load JS
26
- ┌ ● / 2.97 kB 126 kB
24
+ ┌ ● / 3.09 kB 126 kB
27
25
  ├ └ css/13a4da555ff5e3be.css 7.19 kB
28
26
  ├ /_app 0 B 77.9 kB
29
- ├ ● /[...slug] 10 kB 133 kB
30
- ├ └ css/1323734429a8aa40.css 7.9 kB
27
+ ├ ● /[...slug] 10.1 kB 133 kB
28
+ ├ └ css/6e41f1b6078c14c1.css 7.9 kB
31
29
  ├ ● /[slug]/p 11.7 kB 135 kB
32
30
  ├ └ css/d462d9478ce00021.css 10.9 kB
33
31
  ├ ○ /404 1.09 kB 113 kB
@@ -41,9 +39,9 @@ Route (pages) Size First Load JS
41
39
  + First Load JS shared by all 80.7 kB
42
40
  ├ chunks/framework-dfd14d7ce6600b03.js 45.3 kB
43
41
  ├ chunks/main-fd466221927468fd.js 23.9 kB
44
- ├ chunks/pages/_app-3e4e7e579cb0681a.js 6.43 kB
45
- ├ chunks/webpack-eb5ed34c93d07fac.js 2.26 kB
46
- └ css/bde408cc006e64f8.css 2.82 kB
42
+ ├ chunks/pages/_app-d2e10aaf891151f9.js 6.44 kB
43
+ ├ chunks/webpack-90918babbeee4949.js 2.26 kB
44
+ └ css/47d82dcec9a7dbc2.css 2.78 kB
47
45
 
48
46
  λ (Server) server-side renders at runtime (uses getInitialProps or getServerSideProps)
49
47
  ○ (Static) automatically rendered as static HTML (uses no initial props)
@@ -181,6 +181,8 @@ export type IStoreSelectedFacet = {
181
181
 
182
182
  /** Session input. */
183
183
  export type IStoreSession = {
184
+ /** Session input address Type. */
185
+ addressType: InputMaybe<Scalars['String']>
184
186
  /** Session input channel. */
185
187
  channel: InputMaybe<Scalars['String']>
186
188
  /** Session input country. */
@@ -851,6 +853,8 @@ export type StoreSeo = {
851
853
 
852
854
  /** Session information. */
853
855
  export type StoreSession = {
856
+ /** Session address Type. */
857
+ addressType: Maybe<Scalars['String']>
854
858
  /** Session channel. */
855
859
  channel: Maybe<Scalars['String']>
856
860
  /** Session country. */
@@ -1323,6 +1327,7 @@ export type ValidateSessionMutation = {
1323
1327
  channel: string | null
1324
1328
  country: string
1325
1329
  postalCode: string | null
1330
+ addressType: string | null
1326
1331
  geoCoordinates: { latitude: number; longitude: number } | null
1327
1332
  currency: { code: string; symbol: string }
1328
1333
  person: {
@@ -8,6 +8,6 @@
8
8
  "ProductsQuery": "query ProductsQuery($first: Int!, $after: String, $sort: StoreSort!, $term: String!, $selectedFacets: [IStoreSelectedFacet!]!) {\n search(\n first: $first\n after: $after\n sort: $sort\n term: $term\n selectedFacets: $selectedFacets\n ) {\n products {\n pageInfo {\n totalCount\n }\n edges {\n node {\n id: productID\n slug\n sku\n brand {\n brandName: name\n name\n }\n name\n gtin\n isVariantOf {\n productGroupID\n name\n }\n image {\n url\n alternateName\n }\n offers {\n lowPrice\n offers {\n availability\n price\n listPrice\n quantity\n seller {\n identifier\n }\n }\n }\n }\n }\n }\n }\n}\n",
9
9
  "SearchSuggestionsQuery": "query SearchSuggestionsQuery($term: String!, $selectedFacets: [IStoreSelectedFacet!]) {\n search(first: 5, term: $term, selectedFacets: $selectedFacets) {\n suggestions {\n terms {\n value\n }\n products {\n id: productID\n slug\n sku\n brand {\n brandName: name\n name\n }\n name\n gtin\n isVariantOf {\n productGroupID\n name\n }\n image {\n url\n alternateName\n }\n offers {\n lowPrice\n offers {\n availability\n price\n listPrice\n quantity\n seller {\n identifier\n }\n }\n }\n }\n }\n }\n}\n",
10
10
  "TopSearchSuggestionsQuery": "query TopSearchSuggestionsQuery($term: String!, $selectedFacets: [IStoreSelectedFacet!]) {\n search(first: 5, term: $term, selectedFacets: $selectedFacets) {\n suggestions {\n terms {\n value\n }\n }\n }\n}\n",
11
- "ValidateSession": "mutation ValidateSession($session: IStoreSession!, $search: String!) {\n validateSession(session: $session, search: $search) {\n locale\n channel\n country\n postalCode\n geoCoordinates {\n latitude\n longitude\n }\n currency {\n code\n symbol\n }\n person {\n id\n email\n givenName\n familyName\n }\n }\n}\n",
11
+ "ValidateSession": "mutation ValidateSession($session: IStoreSession!, $search: String!) {\n validateSession(session: $session, search: $search) {\n locale\n channel\n country\n postalCode\n addressType\n geoCoordinates {\n latitude\n longitude\n }\n currency {\n code\n symbol\n }\n person {\n id\n email\n givenName\n familyName\n }\n }\n}\n",
12
12
  "ShippingSimulationQuery": "query ShippingSimulationQuery($postalCode: String!, $country: String!, $items: [IShippingItem!]!) {\n shipping(items: $items, postalCode: $postalCode, country: $country) {\n logisticsInfo {\n slas {\n carrier\n price\n shippingEstimate\n localizedEstimates\n }\n }\n address {\n city\n neighborhood\n }\n }\n}\n"
13
13
  }
package/CHANGELOG.md CHANGED
@@ -3,6 +3,16 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ ## [2.0.156-alpha.0](https://github.com/vtex/faststore/compare/v2.0.155-alpha.0...v2.0.156-alpha.0) (2023-05-23)
7
+
8
+ **Note:** Version bump only for package @faststore/core
9
+
10
+ ## [2.0.154-alpha.0](https://github.com/vtex/faststore/compare/v2.0.153-alpha.0...v2.0.154-alpha.0) (2023-05-23)
11
+
12
+ ### Features
13
+
14
+ - Adjust `ProductShelf` for CMS ([#1766](https://github.com/vtex/faststore/issues/1766)) ([1798536](https://github.com/vtex/faststore/commit/1798536f60a508997616350f0b4ac6c11878dc04))
15
+
6
16
  ## [2.0.153-alpha.0](https://github.com/vtex/faststore/compare/v2.0.152-alpha.0...v2.0.153-alpha.0) (2023-05-23)
7
17
 
8
18
  ### Features
@@ -834,8 +834,8 @@
834
834
  ],
835
835
  "enumNames": [
836
836
  "Discount: higher to lower",
837
- "Name: Z-A",
838
837
  "Name: A-Z",
838
+ "Name: Z-A",
839
839
  "Orders: higher to lower",
840
840
  "Price: lower to higher",
841
841
  "Price: higher to lower",
@@ -879,15 +879,10 @@
879
879
  "type": "boolean",
880
880
  "default": true
881
881
  },
882
- "showBuyButton": {
883
- "title": "Show buy button?",
882
+ "bordered": {
883
+ "title": "Cards should be bordered?",
884
884
  "type": "boolean",
885
885
  "default": true
886
- },
887
- "buyButtonTitle": {
888
- "title": "Buy Button Text",
889
- "type": "string",
890
- "default": "Buy"
891
886
  }
892
887
  }
893
888
  }
@@ -29,6 +29,7 @@ module.exports = {
29
29
  locale: 'en-US',
30
30
  channel: '{"salesChannel":"1","regionId":""}',
31
31
  country: 'USA',
32
+ addressType: null,
32
33
  postalCode: null,
33
34
  geoCoordinates: null,
34
35
  person: null,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@faststore/core",
3
- "version": "2.0.153-alpha.0",
3
+ "version": "2.0.156-alpha.0",
4
4
  "license": "MIT",
5
5
  "browserslist": "supports es6-module and not dead",
6
6
  "scripts": {
@@ -29,11 +29,11 @@
29
29
  "@envelop/graphql-jit": "^1.1.1",
30
30
  "@envelop/parser-cache": "^2.2.0",
31
31
  "@envelop/validation-cache": "^2.2.0",
32
- "@faststore/api": "^2.0.140-alpha.0",
32
+ "@faststore/api": "^2.0.156-alpha.0",
33
33
  "@faststore/components": "^2.0.152-alpha.0",
34
34
  "@faststore/graphql-utils": "^2.0.3-alpha.0",
35
- "@faststore/sdk": "^2.0.118-alpha.0",
36
- "@faststore/ui": "^2.0.152-alpha.0",
35
+ "@faststore/sdk": "^2.0.156-alpha.0",
36
+ "@faststore/ui": "^2.0.154-alpha.0",
37
37
  "@types/react": "^18.0.14",
38
38
  "@vtex/client-cms": "^0.2.12",
39
39
  "autoprefixer": "^10.4.0",
@@ -108,5 +108,5 @@
108
108
  "msw": {
109
109
  "workerDirectory": "public"
110
110
  },
111
- "gitHead": "cf054b325389e594cf3bd28559c74f93c16215a7"
111
+ "gitHead": "d24d06c4907a19c8f33cae1812175e393f223340"
112
112
  }
@@ -27,41 +27,19 @@ const COMPONENTS: Record<string, ComponentType<any>> = {
27
27
  ...CUSTOM_COMPONENTS,
28
28
  }
29
29
 
30
- const useDividedSections = (sections: Section[]) => {
31
- return useMemo(() => {
32
- const indexChildren = sections.findIndex(({ name }) => name === 'Children')
33
- const hasChildren = indexChildren > -1
34
-
35
- return {
36
- hasChildren,
37
- firstSections: hasChildren ? sections.slice(0, indexChildren) : sections,
38
- ...(hasChildren && { lastSections: sections.slice(indexChildren + 1) }),
39
- }
40
- }, [sections])
41
- }
42
-
43
30
  function GlobalSections({
44
31
  children,
45
- sections,
32
+ ...otherProps
46
33
  }: PropsWithChildren<GlobalSectionsData>) {
47
- const { hasChildren, firstSections, lastSections } =
48
- useDividedSections(sections)
49
-
50
34
  return (
51
- <>
52
- <RenderSections sections={firstSections} components={COMPONENTS} />
53
-
35
+ <RenderSections components={COMPONENTS} {...otherProps}>
54
36
  <Toast />
55
37
 
56
38
  <main>
57
39
  <RegionBar className="display-mobile" />
58
40
  {children}
59
41
  </main>
60
-
61
- {hasChildren && (
62
- <RenderSections sections={lastSections} components={COMPONENTS} />
63
- )}
64
- </>
42
+ </RenderSections>
65
43
  )
66
44
  }
67
45
 
@@ -1,7 +1,8 @@
1
1
  import chalk from 'chalk'
2
- import { ComponentType } from 'react'
2
+ import { ComponentType, PropsWithChildren, useMemo } from 'react'
3
3
 
4
4
  import SectionBoundary from './SectionBoundary'
5
+ import { Section } from '@vtex/client-cms'
5
6
 
6
7
  interface Props {
7
8
  components: Record<string, ComponentType<any>>
@@ -9,7 +10,20 @@ interface Props {
9
10
  context?: unknown
10
11
  }
11
12
 
12
- const RenderSections = ({ sections = [], context, components }: Props) => {
13
+ const useDividedSections = (sections: Section[]) => {
14
+ return useMemo(() => {
15
+ const indexChildren = sections.findIndex(({ name }) => name === 'Children')
16
+ const hasChildren = indexChildren > -1
17
+
18
+ return {
19
+ hasChildren,
20
+ firstSections: hasChildren ? sections.slice(0, indexChildren) : sections,
21
+ ...(hasChildren && { lastSections: sections.slice(indexChildren + 1) }),
22
+ }
23
+ }, [sections])
24
+ }
25
+
26
+ const RenderSectionsBase = ({ sections = [], context, components }: Props) => {
13
27
  return (
14
28
  <>
15
29
  {sections.map(({ name, data }, index) => {
@@ -36,4 +50,25 @@ const RenderSections = ({ sections = [], context, components }: Props) => {
36
50
  )
37
51
  }
38
52
 
53
+ function RenderSections({
54
+ children,
55
+ sections,
56
+ ...otherProps
57
+ }: PropsWithChildren<Props>) {
58
+ const { hasChildren, firstSections, lastSections } =
59
+ useDividedSections(sections)
60
+
61
+ return (
62
+ <>
63
+ <RenderSectionsBase sections={firstSections} {...otherProps} />
64
+
65
+ {children}
66
+
67
+ {hasChildren && (
68
+ <RenderSectionsBase sections={lastSections} {...otherProps} />
69
+ )}
70
+ </>
71
+ )
72
+ }
73
+
39
74
  export default RenderSections
@@ -1,8 +1,10 @@
1
1
  import { useMemo } from 'react'
2
2
 
3
3
  import type { ProductDetailsFragment_ProductFragment } from '@generated/graphql'
4
-
5
- import ProductShelf from '../ProductShelf'
4
+ import UIProductShelf from 'src/components/ui/ProductShelf'
5
+ import { useInView } from 'react-intersection-observer'
6
+ import styles from '../ProductShelf/section.module.scss'
7
+ import Section from '../Section'
6
8
 
7
9
  interface Props {
8
10
  items: number
@@ -12,13 +14,25 @@ interface Props {
12
14
  }
13
15
 
14
16
  const CrossSellingShelf = ({ items, title, context, kind }: Props) => {
17
+ const { ref, inView } = useInView()
18
+
15
19
  const selectedFacets = useMemo(
16
20
  () => [{ key: kind, value: context.isVariantOf.productGroupID }],
17
21
  [kind, context.isVariantOf.productGroupID]
18
22
  )
19
23
 
20
24
  return (
21
- <ProductShelf first={items} title={title} selectedFacets={selectedFacets} />
25
+ <Section
26
+ className={`${styles.section} section-product-shelf layout__section`}
27
+ ref={ref}
28
+ >
29
+ <UIProductShelf
30
+ inView={inView}
31
+ first={items}
32
+ title={title}
33
+ selectedFacets={selectedFacets}
34
+ />
35
+ </Section>
22
36
  )
23
37
  }
24
38
 
@@ -1,91 +1,22 @@
1
- import { useEffect, useId, useRef } from 'react'
2
1
  import { useInView } from 'react-intersection-observer'
3
-
4
- import { ProductShelf as UIProductShelf } from '@faststore/ui'
5
-
6
- import type { ProductsQueryQueryVariables } from '@generated/graphql'
7
- import ProductShelfSkeleton from 'src/components/skeletons/ProductShelfSkeleton'
8
- import { useViewItemListEvent } from 'src/sdk/analytics/hooks/useViewItemListEvent'
9
- import { useProductsQuery } from 'src/sdk/product/useProductsQuery'
10
- import { textToKebabCase } from 'src/utils/utilities'
11
-
12
- import Carousel from '../../ui/Carousel'
13
2
  import Section from '../Section'
14
- import { Components } from './Overrides'
15
- const { ProductCard } = Components
16
3
 
17
4
  import styles from './section.module.scss'
5
+ import ProductShelf, { ProductShelfProps } from 'src/components/ui/ProductShelf'
18
6
 
19
- interface ProductShelfProps extends Partial<ProductsQueryQueryVariables> {
20
- title: string
21
- withDivisor?: boolean
22
- }
23
-
24
- function ProductShelf({
25
- title,
26
- withDivisor = false,
27
- ...variables
28
- }: ProductShelfProps) {
29
- const titleId = textToKebabCase(title)
30
- const id = useId()
31
- const viewedOnce = useRef(false)
7
+ function ProductShelfSection({
8
+ ...otherProps
9
+ }: Omit<ProductShelfProps, 'inView'>) {
32
10
  const { ref, inView } = useInView()
33
- const products = useProductsQuery(variables)
34
- const productEdges = products?.edges ?? []
35
- const aspectRatio = 1
36
-
37
- const { sendViewItemListEvent } = useViewItemListEvent({
38
- products: productEdges,
39
- title,
40
- page: 0,
41
- pageSize: 0,
42
- })
43
-
44
- useEffect(() => {
45
- if (inView && !viewedOnce.current && productEdges.length) {
46
- sendViewItemListEvent()
47
-
48
- viewedOnce.current = true
49
- }
50
- }, [inView, productEdges.length, sendViewItemListEvent])
51
-
52
- if (products?.edges.length === 0) {
53
- return null
54
- }
55
11
 
56
12
  return (
57
13
  <Section
58
- className={`${styles.section} section-product-shelf layout__section ${
59
- withDivisor ? 'section__divisor' : ''
60
- }`}
14
+ className={`${styles.section} section-product-shelf layout__section`}
61
15
  ref={ref}
62
16
  >
63
- <h2 className="text__title-section layout__content">{title}</h2>
64
- <ProductShelfSkeleton
65
- aspectRatio={aspectRatio}
66
- loading={products === undefined}
67
- >
68
- <UIProductShelf>
69
- <Carousel id={titleId || id}>
70
- {productEdges.map((product, idx) => (
71
- <ProductCard
72
- bordered
73
- key={`${product.node.id}`}
74
- product={product.node}
75
- index={idx + 1}
76
- aspectRatio={aspectRatio}
77
- imgProps={{
78
- width: 216,
79
- height: 216,
80
- sizes: '(max-width: 768px) 42vw, 30vw',
81
- }}
82
- />
83
- ))}
84
- </Carousel>
85
- </UIProductShelf>
86
- </ProductShelfSkeleton>
17
+ <ProductShelf inView={inView} {...otherProps} />
87
18
  </Section>
88
19
  )
89
20
  }
90
21
 
91
- export default ProductShelf
22
+ export default ProductShelfSection
@@ -7,10 +7,3 @@
7
7
  margin-bottom: var(--fs-spacing-3);
8
8
  }
9
9
  }
10
-
11
- .section__divisor {
12
- padding-top: var(--fs-spacing-5);
13
- border-top: var(--fs-border-width) solid var(--fs-border-color-light);
14
-
15
- @include media(">=notebook") { padding-top: var(--fs-spacing-9); }
16
- }
@@ -3,8 +3,8 @@ import ProductCard from 'src/components/product/ProductCard'
3
3
  import ProductShelfCustomizations from 'src/customizations/components/overrides/ProductShelf'
4
4
 
5
5
  const Components = {
6
- ProductCard,
7
- ...ProductShelfCustomizations.components
6
+ ProductCard,
7
+ ...ProductShelfCustomizations.components,
8
8
  }
9
9
 
10
10
  export { Components }
@@ -0,0 +1,106 @@
1
+ import { useEffect, useId, useRef } from 'react'
2
+
3
+ import { ProductShelf as UIProductShelf } from '@faststore/ui'
4
+
5
+ import ProductShelfSkeleton from 'src/components/skeletons/ProductShelfSkeleton'
6
+ import { useViewItemListEvent } from 'src/sdk/analytics/hooks/useViewItemListEvent'
7
+ import { useProductsQuery } from 'src/sdk/product/useProductsQuery'
8
+ import { textToKebabCase } from 'src/utils/utilities'
9
+
10
+ import Carousel from '../../ui/Carousel'
11
+
12
+ import { Components } from 'src/components/ui/ProductShelf/Overrides'
13
+
14
+ const { ProductCard } = Components
15
+
16
+ type Sort =
17
+ | 'discount_desc'
18
+ | 'name_asc'
19
+ | 'name_desc'
20
+ | 'orders_desc'
21
+ | 'price_asc'
22
+ | 'price_desc'
23
+ | 'release_desc'
24
+ | 'score_desc'
25
+
26
+ export type ProductShelfProps = {
27
+ title: string
28
+ first?: number
29
+ after?: string
30
+ sort?: Sort
31
+ term?: string
32
+ selectedFacets?: {
33
+ key: string
34
+ value: string
35
+ }[]
36
+ productCardConfiguration?: {
37
+ showDiscountBadge: boolean
38
+ bordered: boolean
39
+ }
40
+ inView: boolean
41
+ }
42
+
43
+ function ProductShelf({
44
+ title,
45
+ inView,
46
+ productCardConfiguration,
47
+ ...variables
48
+ }: ProductShelfProps) {
49
+ const titleId = textToKebabCase(title)
50
+ const id = useId()
51
+ const viewedOnce = useRef(false)
52
+ const products = useProductsQuery(variables)
53
+ const productEdges = products?.edges ?? []
54
+ const aspectRatio = 1
55
+
56
+ const { sendViewItemListEvent } = useViewItemListEvent({
57
+ products: productEdges,
58
+ title,
59
+ page: 0,
60
+ pageSize: 0,
61
+ })
62
+
63
+ useEffect(() => {
64
+ if (inView && !viewedOnce.current && productEdges.length) {
65
+ sendViewItemListEvent()
66
+
67
+ viewedOnce.current = true
68
+ }
69
+ }, [inView, productEdges.length, sendViewItemListEvent])
70
+
71
+ if (products?.edges.length === 0) {
72
+ return null
73
+ }
74
+
75
+ return (
76
+ <>
77
+ <h2 className="text__title-section layout__content">{title}</h2>
78
+ <ProductShelfSkeleton
79
+ aspectRatio={aspectRatio}
80
+ loading={products === undefined}
81
+ >
82
+ <UIProductShelf>
83
+ <Carousel id={titleId || id}>
84
+ {productEdges.map((product, idx) => (
85
+ <ProductCard
86
+ bordered={productCardConfiguration?.bordered}
87
+ showDiscountBadge={productCardConfiguration?.showDiscountBadge}
88
+ key={`${product.node.id}`}
89
+ product={product.node}
90
+ index={idx + 1}
91
+ aspectRatio={aspectRatio}
92
+ imgProps={{
93
+ width: 216,
94
+ height: 216,
95
+ sizes: '(max-width: 768px) 42vw, 30vw',
96
+ }}
97
+ />
98
+ ))}
99
+ </Carousel>
100
+ </UIProductShelf>
101
+ </ProductShelfSkeleton>
102
+ </>
103
+ )
104
+ }
105
+
106
+ export default ProductShelf
@@ -0,0 +1,2 @@
1
+ export { default } from './ProductShelf'
2
+ export type { ProductShelfProps } from './ProductShelf'
@@ -49,6 +49,7 @@ const COMPONENTS: Record<string, ComponentType<any>> = {
49
49
  Breadcrumb,
50
50
  Hero,
51
51
  ProductGallery,
52
+ ProductShelf,
52
53
  ...CUSTOM_COMPONENTS,
53
54
  }
54
55
 
@@ -143,13 +144,6 @@ function Page({
143
144
  components={COMPONENTS}
144
145
  />
145
146
 
146
- <ProductShelf
147
- first={ITEMS_PER_SECTION}
148
- sort="score_desc"
149
- title="You might also like"
150
- withDivisor
151
- />
152
-
153
147
  <ScrollToTopButton />
154
148
  </SearchProvider>
155
149
  </GlobalSections>
@@ -19,6 +19,7 @@ export const mutation = gql`
19
19
  channel
20
20
  country
21
21
  postalCode
22
+ addressType
22
23
  geoCoordinates {
23
24
  latitude
24
25
  longitude
package/.next/BUILD_ID DELETED
@@ -1 +0,0 @@
1
- Jdc52lXcDWIk2D0wQ-Z4p