@gem-sdk/core 1.5.15 → 1.5.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (206) hide show
  1. package/dist/cjs/components/AddOn.js +7 -7
  2. package/dist/cjs/components/ComponentWrapper.js +14 -8
  3. package/dist/cjs/components/ComponentWrapperPreview.js +55 -46
  4. package/dist/cjs/components/Empty.js +1 -1
  5. package/dist/cjs/components/Render.js +50 -13
  6. package/dist/cjs/components/Render.liquid.js +81 -57
  7. package/dist/cjs/components/RenderBlock.js +41 -8
  8. package/dist/cjs/components/RenderPreview.js +51 -13
  9. package/dist/cjs/components/RenderSection.js +11 -7
  10. package/dist/cjs/components/constant.js +24 -24
  11. package/dist/cjs/contexts/AddonContext.js +25 -14
  12. package/dist/cjs/contexts/BuilderComponent.js +23 -19
  13. package/dist/cjs/contexts/BuilderContext.js +25 -19
  14. package/dist/cjs/contexts/BuilderPreviewContext.js +349 -341
  15. package/dist/cjs/contexts/CartLineContext.js +19 -14
  16. package/dist/cjs/contexts/CollectionContext.js +21 -13
  17. package/dist/cjs/contexts/ProductContext.js +136 -115
  18. package/dist/cjs/contexts/ProductListContext.js +21 -13
  19. package/dist/cjs/contexts/SectionContext.js +41 -37
  20. package/dist/cjs/contexts/ShopContext.js +49 -31
  21. package/dist/cjs/graphql/fragments/analytic.generated.js +1 -1
  22. package/dist/cjs/graphql/fragments/collection-detail.generated.js +1 -1
  23. package/dist/cjs/graphql/fragments/collection-product.generated.js +1 -1
  24. package/dist/cjs/graphql/fragments/custom-code.generated.js +1 -1
  25. package/dist/cjs/graphql/fragments/data-seo.generated.js +1 -1
  26. package/dist/cjs/graphql/fragments/media.generated.js +1 -1
  27. package/dist/cjs/graphql/fragments/product-little.generated.js +1 -1
  28. package/dist/cjs/graphql/fragments/product-option-value.generated.js +1 -1
  29. package/dist/cjs/graphql/fragments/product-option.generated.js +1 -1
  30. package/dist/cjs/graphql/fragments/product.generated.js +1 -1
  31. package/dist/cjs/graphql/fragments/published-custom-section.generated.js +1 -1
  32. package/dist/cjs/graphql/fragments/published-page-section.generated.js +1 -1
  33. package/dist/cjs/graphql/fragments/published-theme-page.generated.js +1 -1
  34. package/dist/cjs/graphql/fragments/published-theme-style.generated.js +1 -1
  35. package/dist/cjs/graphql/fragments/selected-option.generated.js +1 -1
  36. package/dist/cjs/graphql/fragments/variant.generated.js +1 -1
  37. package/dist/cjs/graphql/mutations/page-view-up.generated.js +1 -1
  38. package/dist/cjs/graphql/queries/products.generated.js +1 -1
  39. package/dist/cjs/graphql/queries/store-property.generated.js +1 -1
  40. package/dist/cjs/helpers/GlobalEvent.js +12 -10
  41. package/dist/cjs/helpers/background.js +96 -96
  42. package/dist/cjs/helpers/borders.js +123 -127
  43. package/dist/cjs/helpers/clone-deep.js +1 -1
  44. package/dist/cjs/helpers/cls.js +11 -15
  45. package/dist/cjs/helpers/colors.js +121 -156
  46. package/dist/cjs/helpers/compose-advance-style.js +115 -121
  47. package/dist/cjs/helpers/constant.js +16 -11
  48. package/dist/cjs/helpers/css-variable.js +2 -2
  49. package/dist/cjs/helpers/email.js +3 -3
  50. package/dist/cjs/helpers/flatten-connection.js +4 -5
  51. package/dist/cjs/helpers/get-resonsive-value.js +24 -25
  52. package/dist/cjs/helpers/get-shortname.js +87 -87
  53. package/dist/cjs/helpers/is-browser.js +2 -2
  54. package/dist/cjs/helpers/is-defined.js +2 -2
  55. package/dist/cjs/helpers/is-empty-children.js +2 -2
  56. package/dist/cjs/helpers/layout.js +9 -10
  57. package/dist/cjs/helpers/load-script.js +26 -27
  58. package/dist/cjs/helpers/make-style.js +77 -86
  59. package/dist/cjs/helpers/normalize-builder-data.js +18 -12
  60. package/dist/cjs/helpers/prefetch-queries.js +72 -52
  61. package/dist/cjs/helpers/product.js +25 -29
  62. package/dist/cjs/helpers/queries/get-collection.js +179 -167
  63. package/dist/cjs/helpers/queries/get-product-by-slug.js +103 -94
  64. package/dist/cjs/helpers/queries/get-product.js +121 -106
  65. package/dist/cjs/helpers/queries/get-products.js +137 -125
  66. package/dist/cjs/helpers/radius.js +78 -81
  67. package/dist/cjs/helpers/render.js +56 -56
  68. package/dist/cjs/helpers/shadow.js +38 -38
  69. package/dist/cjs/helpers/size.js +12 -13
  70. package/dist/cjs/helpers/spacing.js +35 -37
  71. package/dist/cjs/helpers/tracking/fpixel.js +21 -22
  72. package/dist/cjs/helpers/tracking/gtag.js +84 -90
  73. package/dist/cjs/helpers/tracking/tiktokpixel.js +12 -12
  74. package/dist/cjs/helpers/typography.js +2 -2
  75. package/dist/cjs/hooks/cart/use-add-to-cart.js +10 -10
  76. package/dist/cjs/hooks/cart/use-cart-data.js +18 -16
  77. package/dist/cjs/hooks/cart/use-cart-discount-codes-update.js +10 -10
  78. package/dist/cjs/hooks/cart/use-cart-note-update.js +10 -10
  79. package/dist/cjs/hooks/cart/use-create-cart.js +12 -12
  80. package/dist/cjs/hooks/cart/use-remove-cart-item.js +10 -10
  81. package/dist/cjs/hooks/cart/use-update-cart-item.js +10 -10
  82. package/dist/cjs/hooks/shop/use-collection-query.js +12 -6
  83. package/dist/cjs/hooks/shop/use-product-query.js +12 -6
  84. package/dist/cjs/hooks/shop/use-products-query.js +14 -6
  85. package/dist/cjs/hooks/shop.js +86 -67
  86. package/dist/cjs/hooks/use-current-device.js +14 -16
  87. package/dist/cjs/hooks/use-lazy-video.js +7 -7
  88. package/dist/cjs/hooks/useCartId.js +35 -27
  89. package/dist/cjs/hooks/useCartLine.js +2 -2
  90. package/dist/cjs/hooks/useCartUI.js +37 -31
  91. package/dist/cjs/hooks/useCollection.js +2 -2
  92. package/dist/cjs/hooks/useFetchHandle.js +6 -6
  93. package/dist/cjs/hooks/useFormatMoney.js +11 -7
  94. package/dist/cjs/hooks/useIsomorphicLayoutEffect.js +1 -1
  95. package/dist/cjs/hooks/useLoadScript.js +22 -20
  96. package/dist/cjs/hooks/useMoney.js +59 -42
  97. package/dist/cjs/hooks/usePrevious.js +12 -10
  98. package/dist/cjs/hooks/useProduct.js +93 -69
  99. package/dist/cjs/hooks/useProductList.js +11 -11
  100. package/dist/cjs/hooks/useSuspenseFetch.js +20 -17
  101. package/dist/cjs/hooks/useSwatchesOptions.js +32 -30
  102. package/dist/cjs/types/global-style.js +9 -2
  103. package/dist/esm/components/AddOn.js +7 -7
  104. package/dist/esm/components/ComponentWrapper.js +14 -8
  105. package/dist/esm/components/ComponentWrapperPreview.js +55 -46
  106. package/dist/esm/components/Empty.js +1 -1
  107. package/dist/esm/components/Render.js +50 -13
  108. package/dist/esm/components/Render.liquid.js +81 -57
  109. package/dist/esm/components/RenderBlock.js +41 -8
  110. package/dist/esm/components/RenderPreview.js +51 -13
  111. package/dist/esm/components/RenderSection.js +11 -7
  112. package/dist/esm/components/constant.js +24 -24
  113. package/dist/esm/contexts/AddonContext.js +26 -15
  114. package/dist/esm/contexts/BuilderComponent.js +24 -20
  115. package/dist/esm/contexts/BuilderContext.js +26 -20
  116. package/dist/esm/contexts/BuilderPreviewContext.js +350 -342
  117. package/dist/esm/contexts/CartLineContext.js +20 -15
  118. package/dist/esm/contexts/CollectionContext.js +22 -14
  119. package/dist/esm/contexts/ProductContext.js +137 -116
  120. package/dist/esm/contexts/ProductListContext.js +22 -14
  121. package/dist/esm/contexts/SectionContext.js +42 -38
  122. package/dist/esm/contexts/ShopContext.js +50 -32
  123. package/dist/esm/graphql/fragments/analytic.generated.js +1 -1
  124. package/dist/esm/graphql/fragments/collection-detail.generated.js +1 -1
  125. package/dist/esm/graphql/fragments/collection-product.generated.js +1 -1
  126. package/dist/esm/graphql/fragments/custom-code.generated.js +1 -1
  127. package/dist/esm/graphql/fragments/data-seo.generated.js +1 -1
  128. package/dist/esm/graphql/fragments/media.generated.js +1 -1
  129. package/dist/esm/graphql/fragments/product-little.generated.js +1 -1
  130. package/dist/esm/graphql/fragments/product-option-value.generated.js +1 -1
  131. package/dist/esm/graphql/fragments/product-option.generated.js +1 -1
  132. package/dist/esm/graphql/fragments/product.generated.js +1 -1
  133. package/dist/esm/graphql/fragments/published-custom-section.generated.js +1 -1
  134. package/dist/esm/graphql/fragments/published-page-section.generated.js +1 -1
  135. package/dist/esm/graphql/fragments/published-theme-page.generated.js +1 -1
  136. package/dist/esm/graphql/fragments/published-theme-style.generated.js +1 -1
  137. package/dist/esm/graphql/fragments/selected-option.generated.js +1 -1
  138. package/dist/esm/graphql/fragments/variant.generated.js +1 -1
  139. package/dist/esm/graphql/mutations/page-view-up.generated.js +1 -1
  140. package/dist/esm/graphql/queries/products.generated.js +1 -1
  141. package/dist/esm/graphql/queries/store-property.generated.js +1 -1
  142. package/dist/esm/helpers/GlobalEvent.js +12 -10
  143. package/dist/esm/helpers/background.js +96 -96
  144. package/dist/esm/helpers/borders.js +123 -127
  145. package/dist/esm/helpers/clone-deep.js +1 -1
  146. package/dist/esm/helpers/cls.js +11 -15
  147. package/dist/esm/helpers/colors.js +121 -156
  148. package/dist/esm/helpers/compose-advance-style.js +115 -121
  149. package/dist/esm/helpers/constant.js +16 -11
  150. package/dist/esm/helpers/css-variable.js +2 -2
  151. package/dist/esm/helpers/email.js +3 -3
  152. package/dist/esm/helpers/flatten-connection.js +4 -5
  153. package/dist/esm/helpers/get-resonsive-value.js +24 -25
  154. package/dist/esm/helpers/get-shortname.js +87 -87
  155. package/dist/esm/helpers/is-browser.js +2 -2
  156. package/dist/esm/helpers/is-defined.js +2 -2
  157. package/dist/esm/helpers/is-empty-children.js +2 -2
  158. package/dist/esm/helpers/layout.js +9 -10
  159. package/dist/esm/helpers/load-script.js +26 -27
  160. package/dist/esm/helpers/make-style.js +77 -86
  161. package/dist/esm/helpers/normalize-builder-data.js +18 -12
  162. package/dist/esm/helpers/prefetch-queries.js +72 -52
  163. package/dist/esm/helpers/product.js +25 -29
  164. package/dist/esm/helpers/queries/get-collection.js +179 -167
  165. package/dist/esm/helpers/queries/get-product-by-slug.js +103 -94
  166. package/dist/esm/helpers/queries/get-product.js +121 -106
  167. package/dist/esm/helpers/queries/get-products.js +137 -125
  168. package/dist/esm/helpers/radius.js +78 -81
  169. package/dist/esm/helpers/render.js +56 -56
  170. package/dist/esm/helpers/shadow.js +38 -38
  171. package/dist/esm/helpers/size.js +12 -13
  172. package/dist/esm/helpers/spacing.js +35 -37
  173. package/dist/esm/helpers/tracking/fpixel.js +21 -22
  174. package/dist/esm/helpers/tracking/gtag.js +84 -90
  175. package/dist/esm/helpers/tracking/tiktokpixel.js +12 -12
  176. package/dist/esm/helpers/typography.js +2 -2
  177. package/dist/esm/hooks/cart/use-add-to-cart.js +10 -10
  178. package/dist/esm/hooks/cart/use-cart-data.js +18 -16
  179. package/dist/esm/hooks/cart/use-cart-discount-codes-update.js +10 -10
  180. package/dist/esm/hooks/cart/use-cart-note-update.js +10 -10
  181. package/dist/esm/hooks/cart/use-create-cart.js +12 -12
  182. package/dist/esm/hooks/cart/use-remove-cart-item.js +10 -10
  183. package/dist/esm/hooks/cart/use-update-cart-item.js +10 -10
  184. package/dist/esm/hooks/shop/use-collection-query.js +12 -6
  185. package/dist/esm/hooks/shop/use-product-query.js +12 -6
  186. package/dist/esm/hooks/shop/use-products-query.js +14 -6
  187. package/dist/esm/hooks/shop.js +86 -67
  188. package/dist/esm/hooks/use-current-device.js +14 -16
  189. package/dist/esm/hooks/use-lazy-video.js +7 -7
  190. package/dist/esm/hooks/useCartId.js +35 -27
  191. package/dist/esm/hooks/useCartLine.js +2 -2
  192. package/dist/esm/hooks/useCartUI.js +37 -31
  193. package/dist/esm/hooks/useCollection.js +2 -2
  194. package/dist/esm/hooks/useFetchHandle.js +6 -6
  195. package/dist/esm/hooks/useFormatMoney.js +11 -7
  196. package/dist/esm/hooks/useIsomorphicLayoutEffect.js +1 -1
  197. package/dist/esm/hooks/useLoadScript.js +22 -20
  198. package/dist/esm/hooks/useMoney.js +59 -42
  199. package/dist/esm/hooks/usePrevious.js +12 -10
  200. package/dist/esm/hooks/useProduct.js +93 -70
  201. package/dist/esm/hooks/useProductList.js +11 -11
  202. package/dist/esm/hooks/useSuspenseFetch.js +20 -17
  203. package/dist/esm/hooks/useSwatchesOptions.js +32 -30
  204. package/dist/esm/types/global-style.js +9 -2
  205. package/dist/types/index.d.ts +24 -2
  206. package/package.json +1 -1
@@ -5,58 +5,78 @@ var getCollection = require('./queries/get-collection.js');
5
5
  var getProduct = require('./queries/get-product.js');
6
6
  var getProducts = require('./queries/get-products.js');
7
7
 
8
- const prefetchQueries = (input, isSample) => {
9
- const queries = [];
10
- Object.keys(input).forEach((key) => {
11
- const item = input[key];
12
- let data = undefined;
13
- switch (item.tag) {
14
- case 'Product': {
15
- if (item.settings?.isAuto)
16
- break;
17
- const variables = { id: item.settings?.productSetting?.productId ?? 'latest', isSample };
18
- data = {
19
- key: useSWR.unstable_serialize(['query/product', variables]),
20
- func: getProduct.getProduct,
21
- variables,
22
- };
23
- break;
24
- }
25
- case 'ProductList': {
26
- if (item?.settings?.productSrc === 'Collection') {
27
- const variables = {
28
- id: item.settings?.collectionId ?? 'latest',
29
- numberOfProducts: item.settings?.numberOfProducts ?? 4,
30
- orderBy: item.settings?.orderBy,
31
- isSample,
32
- };
33
- data = {
34
- key: useSWR.unstable_serialize(['query/collection', variables]),
35
- func: getCollection.getCollection,
36
- variables,
37
- };
38
- }
39
- else {
40
- const variables = { ids: [...(item?.settings?.productIds ?? [])].sort(), isSample };
41
- data = {
42
- key: useSWR.unstable_serialize(['query/products', variables]),
43
- func: getProducts.getProducts,
44
- variables,
45
- };
46
- }
47
- break;
48
- }
49
- }
50
- if (data) {
51
- queries.push(data);
52
- }
53
- });
54
- return queries.reduce((accumulator, current) => {
55
- if (!accumulator.some((x) => x.key === current.key)) {
56
- return [...accumulator, current];
57
- }
58
- return accumulator;
59
- }, []);
8
+ const prefetchQueries = (input, isSample)=>{
9
+ const queries = [];
10
+ Object.keys(input).forEach((key)=>{
11
+ const item = input[key];
12
+ let data = undefined;
13
+ switch(item.tag){
14
+ case 'Product':
15
+ {
16
+ if (item.settings?.isAuto) break;
17
+ const variables = {
18
+ id: item.settings?.productSetting?.productId ?? 'latest',
19
+ isSample
20
+ };
21
+ data = {
22
+ key: useSWR.unstable_serialize([
23
+ 'query/product',
24
+ variables
25
+ ]),
26
+ func: getProduct.getProduct,
27
+ variables
28
+ };
29
+ break;
30
+ }
31
+ case 'ProductList':
32
+ {
33
+ if (item?.settings?.productSrc === 'Collection') {
34
+ const variables = {
35
+ id: item.settings?.collectionId ?? 'latest',
36
+ numberOfProducts: item.settings?.numberOfProducts ?? 4,
37
+ orderBy: item.settings?.orderBy,
38
+ isSample
39
+ };
40
+ data = {
41
+ key: useSWR.unstable_serialize([
42
+ 'query/collection',
43
+ variables
44
+ ]),
45
+ func: getCollection.getCollection,
46
+ variables
47
+ };
48
+ } else {
49
+ const variables = {
50
+ ids: [
51
+ ...item?.settings?.productIds ?? []
52
+ ].sort(),
53
+ isSample
54
+ };
55
+ data = {
56
+ key: useSWR.unstable_serialize([
57
+ 'query/products',
58
+ variables
59
+ ]),
60
+ func: getProducts.getProducts,
61
+ variables
62
+ };
63
+ }
64
+ break;
65
+ }
66
+ }
67
+ if (data) {
68
+ queries.push(data);
69
+ }
70
+ });
71
+ return queries.reduce((accumulator, current)=>{
72
+ if (!accumulator.some((x)=>x.key === current.key)) {
73
+ return [
74
+ ...accumulator,
75
+ current
76
+ ];
77
+ }
78
+ return accumulator;
79
+ }, []);
60
80
  };
61
81
 
62
82
  exports.prefetchQueries = prefetchQueries;
@@ -1,34 +1,30 @@
1
1
  'use strict';
2
2
 
3
- function getSelectedVariant(variants, choices) {
4
- /**
5
- * Ensure the user has selected all the required options, not just some.
6
- */
7
- if (!variants ||
8
- !variants.length ||
9
- !choices ||
10
- variants[0]?.selectedOptions.length !== Object.keys(choices).length) {
11
- return;
12
- }
13
- return variants.find((variant) => {
14
- return Object.entries(choices).every(([name, value]) => {
15
- return variant?.selectedOptions.some((option) => option.name === name && option.value === value);
16
- });
17
- });
18
- }
19
- function parseSelectedOption(options) {
20
- if (!options || (options && options.length === 0)) {
21
- return;
22
- }
23
- return options.reduce((acc, { name, value }) => {
24
- if (name && value) {
25
- return {
26
- ...acc,
27
- [name]: value,
28
- };
29
- }
30
- return acc;
31
- }, {});
3
+ function getSelectedVariant(variants, choices) {
4
+ /**
5
+ * Ensure the user has selected all the required options, not just some.
6
+ */ if (!variants || !variants.length || !choices || variants[0]?.selectedOptions.length !== Object.keys(choices).length) {
7
+ return;
8
+ }
9
+ return variants.find((variant)=>{
10
+ return Object.entries(choices).every(([name, value])=>{
11
+ return variant?.selectedOptions.some((option)=>option.name === name && option.value === value);
12
+ });
13
+ });
14
+ }
15
+ function parseSelectedOption(options) {
16
+ if (!options || options && options.length === 0) {
17
+ return;
18
+ }
19
+ return options.reduce((acc, { name , value })=>{
20
+ if (name && value) {
21
+ return {
22
+ ...acc,
23
+ [name]: value
24
+ };
25
+ }
26
+ return acc;
27
+ }, {});
32
28
  }
33
29
 
34
30
  exports.getSelectedVariant = getSelectedVariant;
@@ -4,173 +4,185 @@ var collectionDetailFilter_generated = require('../../graphql/queries/collection
4
4
  var productVariants_generated = require('../../graphql/queries/product-variants.generated.js');
5
5
  var isDefined = require('../is-defined.js');
6
6
 
7
- function productSortedByOrder(key) {
8
- switch (key) {
9
- case 'TITLE_ASC':
10
- return { direction: 'ASC', field: 'TITLE' };
11
- case 'TITLE_DESC':
12
- return { direction: 'DESC', field: 'TITLE' };
13
- case 'CREATED_AT_ASC':
14
- return { direction: 'ASC', field: 'CREATED_AT' };
15
- case 'CREATED_AT_DESC':
16
- return { direction: 'DESC', field: 'CREATED_AT' };
17
- case 'none':
18
- return undefined;
19
- default:
20
- return undefined;
21
- }
22
- }
23
- const getCollection = async (fetcher, arg) => {
24
- const collections = await loopFetchCollection(fetcher, arg);
25
- if (!collections) {
26
- throw new Error('collections not found');
27
- }
28
- // merge product collection variant
29
- const mergeProducts = await mergeProductCollectionVariant(fetcher, collections, arg.isSample);
30
- return mergeProducts;
31
- };
32
- const fetchCollection = async (fetcher, variables) => {
33
- return fetcher([
34
- collectionDetailFilter_generated.CollectionDetailFilterDocument,
35
- variables,
36
- ]);
37
- };
38
- const calculateFirstProduct = (numberOfProducts, currentPage, productsPerPage) => {
39
- const remainingProducts = numberOfProducts - productsPerPage * currentPage;
40
- if (numberOfProducts < productsPerPage)
41
- return numberOfProducts;
42
- return remainingProducts > 0 ? productsPerPage : productsPerPage + remainingProducts;
43
- };
44
- const loopFetchCollection = async (fetcher, arg) => {
45
- const productsPerPage = 8; // number of products per page
46
- let variables; // variables of collection query
47
- let productAfterFetcher; // product after of collection query
48
- let dataCollection; // data of collection query
49
- let hasNextPage; //
50
- let firstCollection;
51
- let currentPage = 1;
52
- if (arg.numberOfProducts) {
53
- const pages = Math.ceil(arg.numberOfProducts / productsPerPage);
54
- while (currentPage <= pages && hasNextPage !== false) {
55
- variables = {
56
- firstVariant: 1,
57
- firstMedia: 30,
58
- orderBy: {
59
- field: 'UPDATED_AT',
60
- direction: 'DESC',
61
- },
62
- orderByMedia: {
63
- field: 'POSITION',
64
- direction: 'ASC',
65
- },
66
- firstProduct: calculateFirstProduct(arg.numberOfProducts, currentPage, productsPerPage),
67
- ...(!arg.id || arg.id.toLowerCase() === 'latest'
68
- ? { where: { hasCollectionProducts: true, isSample: arg.isSample } }
69
- : { where: { baseID: arg.id } }),
70
- orderByProduct: productSortedByOrder(arg.orderBy),
71
- whereProduct: {
72
- isStorefront: true,
73
- isSample: arg.isSample,
74
- },
75
- productsAfter: productAfterFetcher,
76
- };
77
- const pageData = await fetchCollection(fetcher, variables);
78
- productAfterFetcher = pageData?.collections?.edges?.[0]?.node?.products?.pageInfo?.endCursor;
79
- if (currentPage === 1) {
80
- dataCollection = pageData; // set data of first page
81
- firstCollection = dataCollection?.collections?.edges?.[0];
82
- }
83
- else if (firstCollection?.node?.products &&
84
- pageData?.collections?.edges?.[0]?.node?.products?.edges) {
85
- // concat new values to the old ones
86
- firstCollection.node.products = {
87
- pageInfo: pageData?.collections?.edges?.[0]?.node?.products?.pageInfo,
88
- edges: firstCollection.node?.products?.edges.concat(pageData?.collections?.edges?.[0]?.node?.products?.edges),
89
- };
90
- }
91
- currentPage++;
92
- // hasNextPage = false if there is no more pages then break the loop
93
- if (!firstCollection?.node?.products?.pageInfo?.hasNextPage) {
94
- hasNextPage = false;
95
- break;
96
- }
97
- }
98
- return dataCollection;
99
- }
100
- };
101
- const mergeProductCollectionVariant = async (fetcher, collection, isSample) => {
102
- const node = collection?.collections?.edges?.[0]?.node;
103
- if (!node)
104
- return collection;
105
- const productList = node?.products?.edges;
106
- const listBaseId = productList?.map((product) => product?.node?.baseID).filter(isDefined.isDefined);
107
- const ProductListWithVariants = await fetchVariantsByBaseIds(fetcher, {
108
- ids: listBaseId,
109
- isSample,
110
- });
111
- // mapping variant to product list in collections
112
- const newProductList = productList?.map((product) => {
113
- const productVariants = ProductListWithVariants?.variants?.edges?.filter((productV) => productV?.node?.id === product?.node?.id);
114
- return {
115
- ...product,
116
- node: product.node
117
- ? {
118
- ...product.node,
119
- variants: product.node?.variants
120
- ? {
121
- ...product.node?.variants,
122
- edges: productVariants?.[0]?.node?.variants?.edges ?? [],
123
- }
124
- : undefined,
125
- }
126
- : undefined,
127
- };
128
- }) ?? [];
129
- const newCollection = {
130
- ...collection,
131
- collections: {
132
- edges: [
133
- {
134
- node: {
135
- ...node,
136
- products: {
137
- edges: newProductList,
138
- },
139
- },
140
- cursor: undefined,
141
- },
142
- ],
143
- },
144
- };
145
- return newCollection;
146
- };
147
- const fetchVariantsByBaseIds = async (fetcher, { ids, isSample }) => {
148
- const initVariables = {
149
- firstVariant: 100,
150
- first: ids?.length || 1,
151
- orderBy: {
152
- field: 'UPDATED_AT',
153
- direction: 'DESC',
154
- },
155
- where: {
156
- isStorefront: true,
157
- isSample,
158
- ...(ids?.length && { baseIDIn: ids.sort() }),
159
- },
160
- };
161
- const query = async (variables) => {
162
- try {
163
- const response = await fetcher([
164
- productVariants_generated.ProductVariantsDocument,
165
- variables,
166
- ]);
167
- return response;
168
- }
169
- catch {
170
- return {};
171
- }
172
- };
173
- return query(initVariables);
7
+ function productSortedByOrder(key) {
8
+ switch(key){
9
+ case 'TITLE_ASC':
10
+ return {
11
+ direction: 'ASC',
12
+ field: 'TITLE'
13
+ };
14
+ case 'TITLE_DESC':
15
+ return {
16
+ direction: 'DESC',
17
+ field: 'TITLE'
18
+ };
19
+ case 'CREATED_AT_ASC':
20
+ return {
21
+ direction: 'ASC',
22
+ field: 'CREATED_AT'
23
+ };
24
+ case 'CREATED_AT_DESC':
25
+ return {
26
+ direction: 'DESC',
27
+ field: 'CREATED_AT'
28
+ };
29
+ case 'none':
30
+ return undefined;
31
+ default:
32
+ return undefined;
33
+ }
34
+ }
35
+ const getCollection = async (fetcher, arg)=>{
36
+ const collections = await loopFetchCollection(fetcher, arg);
37
+ if (!collections) {
38
+ throw new Error('collections not found');
39
+ }
40
+ // merge product collection variant
41
+ const mergeProducts = await mergeProductCollectionVariant(fetcher, collections, arg.isSample);
42
+ return mergeProducts;
43
+ };
44
+ const fetchCollection = async (fetcher, variables)=>{
45
+ return fetcher([
46
+ collectionDetailFilter_generated.CollectionDetailFilterDocument,
47
+ variables
48
+ ]);
49
+ };
50
+ const calculateFirstProduct = (numberOfProducts, currentPage, productsPerPage)=>{
51
+ const remainingProducts = numberOfProducts - productsPerPage * currentPage;
52
+ if (numberOfProducts < productsPerPage) return numberOfProducts;
53
+ return remainingProducts > 0 ? productsPerPage : productsPerPage + remainingProducts;
54
+ };
55
+ const loopFetchCollection = async (fetcher, arg)=>{
56
+ const productsPerPage = 8; // number of products per page
57
+ let variables; // variables of collection query
58
+ let productAfterFetcher; // product after of collection query
59
+ let dataCollection; // data of collection query
60
+ let hasNextPage; //
61
+ let firstCollection;
62
+ let currentPage = 1;
63
+ if (arg.numberOfProducts) {
64
+ const pages = Math.ceil(arg.numberOfProducts / productsPerPage);
65
+ while(currentPage <= pages && hasNextPage !== false){
66
+ variables = {
67
+ firstVariant: 1,
68
+ firstMedia: 30,
69
+ orderBy: {
70
+ field: 'UPDATED_AT',
71
+ direction: 'DESC'
72
+ },
73
+ orderByMedia: {
74
+ field: 'POSITION',
75
+ direction: 'ASC'
76
+ },
77
+ firstProduct: calculateFirstProduct(arg.numberOfProducts, currentPage, productsPerPage),
78
+ ...!arg.id || arg.id.toLowerCase() === 'latest' ? {
79
+ where: {
80
+ hasCollectionProducts: true,
81
+ isSample: arg.isSample
82
+ }
83
+ } : {
84
+ where: {
85
+ baseID: arg.id
86
+ }
87
+ },
88
+ orderByProduct: productSortedByOrder(arg.orderBy),
89
+ whereProduct: {
90
+ isStorefront: true,
91
+ isSample: arg.isSample
92
+ },
93
+ productsAfter: productAfterFetcher
94
+ };
95
+ const pageData = await fetchCollection(fetcher, variables);
96
+ productAfterFetcher = pageData?.collections?.edges?.[0]?.node?.products?.pageInfo?.endCursor;
97
+ if (currentPage === 1) {
98
+ dataCollection = pageData; // set data of first page
99
+ firstCollection = dataCollection?.collections?.edges?.[0];
100
+ } else if (firstCollection?.node?.products && pageData?.collections?.edges?.[0]?.node?.products?.edges) {
101
+ // concat new values to the old ones
102
+ firstCollection.node.products = {
103
+ pageInfo: pageData?.collections?.edges?.[0]?.node?.products?.pageInfo,
104
+ edges: firstCollection.node?.products?.edges.concat(pageData?.collections?.edges?.[0]?.node?.products?.edges)
105
+ };
106
+ }
107
+ currentPage++;
108
+ // hasNextPage = false if there is no more pages then break the loop
109
+ if (!firstCollection?.node?.products?.pageInfo?.hasNextPage) {
110
+ hasNextPage = false;
111
+ break;
112
+ }
113
+ }
114
+ return dataCollection;
115
+ }
116
+ };
117
+ const mergeProductCollectionVariant = async (fetcher, collection, isSample)=>{
118
+ const node = collection?.collections?.edges?.[0]?.node;
119
+ if (!node) return collection;
120
+ const productList = node?.products?.edges;
121
+ const listBaseId = productList?.map((product)=>product?.node?.baseID).filter(isDefined.isDefined);
122
+ const ProductListWithVariants = await fetchVariantsByBaseIds(fetcher, {
123
+ ids: listBaseId,
124
+ isSample
125
+ });
126
+ // mapping variant to product list in collections
127
+ const newProductList = productList?.map((product)=>{
128
+ const productVariants = ProductListWithVariants?.variants?.edges?.filter((productV)=>productV?.node?.id === product?.node?.id);
129
+ return {
130
+ ...product,
131
+ node: product.node ? {
132
+ ...product.node,
133
+ variants: product.node?.variants ? {
134
+ ...product.node?.variants,
135
+ edges: productVariants?.[0]?.node?.variants?.edges ?? []
136
+ } : undefined
137
+ } : undefined
138
+ };
139
+ }) ?? [];
140
+ const newCollection = {
141
+ ...collection,
142
+ collections: {
143
+ edges: [
144
+ {
145
+ node: {
146
+ ...node,
147
+ products: {
148
+ edges: newProductList
149
+ }
150
+ },
151
+ cursor: undefined
152
+ }
153
+ ]
154
+ }
155
+ };
156
+ return newCollection;
157
+ };
158
+ const fetchVariantsByBaseIds = async (fetcher, { ids , isSample })=>{
159
+ const initVariables = {
160
+ firstVariant: 100,
161
+ first: ids?.length || 1,
162
+ orderBy: {
163
+ field: 'UPDATED_AT',
164
+ direction: 'DESC'
165
+ },
166
+ where: {
167
+ isStorefront: true,
168
+ isSample,
169
+ ...ids?.length && {
170
+ baseIDIn: ids.sort()
171
+ }
172
+ }
173
+ };
174
+ const query = async (variables)=>{
175
+ try {
176
+ const response = await fetcher([
177
+ productVariants_generated.ProductVariantsDocument,
178
+ variables
179
+ ]);
180
+ return response;
181
+ } catch {
182
+ return {};
183
+ }
184
+ };
185
+ return query(initVariables);
174
186
  };
175
187
 
176
188
  exports.calculateFirstProduct = calculateFirstProduct;