@gem-sdk/pages 1.5.7 → 1.5.23

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 (79) hide show
  1. package/dist/cjs/components/ErrorBoundary.js +32 -24
  2. package/dist/cjs/components/ErrorFallback.js +19 -2
  3. package/dist/cjs/components/FacebookPixel.js +25 -20
  4. package/dist/cjs/components/Footer.js +462 -0
  5. package/dist/cjs/components/GoogleAnalytic.js +49 -23
  6. package/dist/cjs/components/Header.js +211 -0
  7. package/dist/cjs/components/TikTokPixel.js +9 -6
  8. package/dist/cjs/components/builder/Toolbox.js +215 -188
  9. package/dist/cjs/layouts/main.js +19 -5
  10. package/dist/cjs/libs/api/get-builder-props.js +26 -24
  11. package/dist/cjs/libs/api/get-collection-props.js +59 -55
  12. package/dist/cjs/libs/api/get-home-page-props-v2.js +121 -114
  13. package/dist/cjs/libs/api/get-home-page-props.js +133 -123
  14. package/dist/cjs/libs/api/get-preview-props.js +10 -10
  15. package/dist/cjs/libs/api/get-product-props.js +64 -62
  16. package/dist/cjs/libs/api/get-static-page-props-preview.js +128 -121
  17. package/dist/cjs/libs/api/get-static-page-props-v2.js +126 -119
  18. package/dist/cjs/libs/api/get-static-page-props.js +130 -120
  19. package/dist/cjs/libs/fetcher.js +59 -63
  20. package/dist/cjs/libs/get-layout.js +5 -2
  21. package/dist/cjs/libs/get-storefront-api.js +7 -7
  22. package/dist/cjs/libs/getStaticPaths.js +5 -5
  23. package/dist/cjs/libs/google-fonts.js +54 -61
  24. package/dist/cjs/libs/helpers/gen-css.js +103 -94
  25. package/dist/cjs/libs/helpers/generate-manifres.js +1 -1
  26. package/dist/cjs/libs/helpers/get-fallback.js +24 -22
  27. package/dist/cjs/libs/helpers/normalize.js +82 -80
  28. package/dist/cjs/libs/helpers/parse-json.js +10 -12
  29. package/dist/cjs/libs/helpers/user-agent.js +2 -2
  30. package/dist/cjs/libs/hooks/use-tracking-view.js +36 -31
  31. package/dist/cjs/libs/parse-html.js +33 -26
  32. package/dist/cjs/pages/404.js +34 -2
  33. package/dist/cjs/pages/500.js +63 -8
  34. package/dist/cjs/pages/builder.js +69 -14
  35. package/dist/cjs/pages/collection-detail.js +48 -7
  36. package/dist/cjs/pages/preview.js +18 -12
  37. package/dist/cjs/pages/product-detail.js +53 -7
  38. package/dist/cjs/pages/static-v2.js +62 -7
  39. package/dist/cjs/pages/static.js +60 -6
  40. package/dist/esm/components/ErrorBoundary.js +32 -24
  41. package/dist/esm/components/ErrorFallback.js +19 -2
  42. package/dist/esm/components/FacebookPixel.js +25 -20
  43. package/dist/esm/components/Footer.js +458 -0
  44. package/dist/esm/components/GoogleAnalytic.js +49 -23
  45. package/dist/esm/components/Header.js +207 -0
  46. package/dist/esm/components/TikTokPixel.js +9 -6
  47. package/dist/esm/components/builder/Toolbox.js +217 -190
  48. package/dist/esm/layouts/main.js +19 -5
  49. package/dist/esm/libs/api/get-builder-props.js +26 -24
  50. package/dist/esm/libs/api/get-collection-props.js +59 -55
  51. package/dist/esm/libs/api/get-home-page-props-v2.js +121 -114
  52. package/dist/esm/libs/api/get-home-page-props.js +133 -123
  53. package/dist/esm/libs/api/get-preview-props.js +10 -10
  54. package/dist/esm/libs/api/get-product-props.js +64 -62
  55. package/dist/esm/libs/api/get-static-page-props-preview.js +128 -121
  56. package/dist/esm/libs/api/get-static-page-props-v2.js +126 -119
  57. package/dist/esm/libs/api/get-static-page-props.js +130 -120
  58. package/dist/esm/libs/fetcher.js +59 -63
  59. package/dist/esm/libs/get-layout.js +5 -2
  60. package/dist/esm/libs/get-storefront-api.js +7 -7
  61. package/dist/esm/libs/getStaticPaths.js +5 -5
  62. package/dist/esm/libs/google-fonts.js +54 -61
  63. package/dist/esm/libs/helpers/gen-css.js +103 -94
  64. package/dist/esm/libs/helpers/generate-manifres.js +1 -1
  65. package/dist/esm/libs/helpers/get-fallback.js +24 -22
  66. package/dist/esm/libs/helpers/normalize.js +82 -80
  67. package/dist/esm/libs/helpers/parse-json.js +10 -12
  68. package/dist/esm/libs/helpers/user-agent.js +2 -2
  69. package/dist/esm/libs/hooks/use-tracking-view.js +36 -31
  70. package/dist/esm/libs/parse-html.js +33 -26
  71. package/dist/esm/pages/404.js +34 -2
  72. package/dist/esm/pages/500.js +63 -8
  73. package/dist/esm/pages/builder.js +69 -14
  74. package/dist/esm/pages/collection-detail.js +48 -7
  75. package/dist/esm/pages/preview.js +18 -12
  76. package/dist/esm/pages/product-detail.js +53 -7
  77. package/dist/esm/pages/static-v2.js +62 -7
  78. package/dist/esm/pages/static.js +60 -6
  79. package/package.json +3 -3
@@ -1,196 +1,223 @@
1
- import { useMatchMutate, useShopStore, useBuilderPreviewStore, useSectionStore } from '@gem-sdk/core';
2
- import { memo, useCallback, useEffect } from 'react';
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { useMatchMutate, useShopStore, useBuilderPreviewStore, useSectionStore, cls } from '@gem-sdk/core';
3
+ import { memo, useState, useCallback, useEffect } from 'react';
3
4
  import { createFontUrl } from '../../libs/google-fonts.js';
4
5
  import { genCSS } from '../../libs/helpers/gen-css.js';
5
6
  import { getStorefrontApi } from '../../libs/get-storefront-api.js';
6
7
 
7
- const globalStyleId = 'global-style';
8
- const globalFontId = 'google-font-builder';
9
- const Toolbox = () => {
10
- const matchMutate = useMatchMutate();
11
- const provider = useShopStore((s) => s.provider);
12
- const changeStorefrontInfo = useShopStore((s) => s.changeStorefrontInfo);
13
- const initState = useBuilderPreviewStore((s) => s.initState);
14
- const initNormalizeState = useBuilderPreviewStore((s) => s.forceChangeState);
15
- const changeItemPropByKey = useBuilderPreviewStore((s) => s.changeItemPropByKey);
16
- const addItem = useBuilderPreviewStore((s) => s.addItem);
17
- const moveItem = useBuilderPreviewStore((s) => s.moveItem);
18
- const removeItem = useBuilderPreviewStore((s) => s.removeItem);
19
- const addSection = useSectionStore((s) => s.addSection);
20
- const changeSwatches = useShopStore((s) => s.changeSwatches);
21
- // Revalidate all query with key match query/
22
- const onRevalidateQuery = useCallback(() => {
23
- matchMutate(/query\//);
24
- }, [matchMutate]);
25
- // Update shop info
26
- const onChangeShopInfo = useCallback((e) => {
27
- const detail = e.detail;
28
- changeStorefrontInfo({
29
- url: detail.shopHandle ? getStorefrontApi(detail.shopHandle, provider) : undefined,
30
- token: detail.shopToken,
31
- });
32
- }, [changeStorefrontInfo, provider]);
33
- const onChangeGlobalStyle = useCallback((e) => {
34
- const detail = e.detail;
35
- try {
36
- if (detail.data) {
37
- const themeStyle = genCSS(detail.data, detail.mobileOnly);
38
- const font = Object.entries(detail.data?.font).map(([, value]) => {
39
- return value;
40
- });
41
- const fontUrl = createFontUrl(font);
42
- const globalStyle = document.getElementById(globalStyleId);
43
- const googleFont = document.getElementById(globalFontId);
44
- if (googleFont) {
45
- googleFont.getAttribute('href') !== fontUrl && googleFont.setAttribute('href', fontUrl);
46
- //
47
- }
48
- else {
49
- const link = document.createElement('link');
50
- link.id = globalFontId;
51
- link.href = fontUrl;
52
- link.rel = 'stylesheet';
53
- document.head.appendChild(link);
54
- }
55
- if (globalStyle) {
56
- globalStyle.innerHTML = themeStyle;
57
- }
58
- else {
59
- const style = document.createElement('style');
60
- style.id = globalStyleId;
61
- style.innerHTML = themeStyle;
62
- document.head.appendChild(style);
63
- }
64
- }
65
- }
66
- catch {
67
- //
68
- }
69
- }, []);
70
- // Init builder data
71
- const onInitBuilder = useCallback((e) => {
72
- try {
73
- const detail = e.detail;
74
- if (detail.data) {
75
- if (detail.type === 'flat') {
76
- initNormalizeState(detail.data);
77
- }
78
- else {
79
- initState(detail.data);
80
- }
81
- }
82
- }
83
- catch {
84
- //
85
- }
86
- }, [initNormalizeState, initState]);
87
- // Add new entity
88
- const onAddEntity = useCallback((e) => {
89
- try {
90
- const detail = e.detail;
91
- if (detail.entity) {
92
- addItem({
93
- data: detail.entity,
94
- id: detail.id,
95
- position: detail.position,
96
- type: detail.type ?? 'component',
97
- });
98
- if (detail?.type === 'section' && !Array.isArray(detail.entity)) {
99
- addSection(detail.entity.uid, detail.entity);
100
- }
101
- }
102
- }
103
- catch {
104
- //
105
- }
106
- }, [addItem, addSection]);
107
- // Update props of entity
108
- const onUpdateEntityProp = useCallback((e) => {
109
- try {
110
- const detail = e.detail;
111
- if (detail.uid && detail.propName) {
112
- changeItemPropByKey({
113
- id: detail.uid,
114
- key: detail.propName,
115
- data: detail.propValue,
116
- group: detail.group,
117
- });
118
- }
119
- }
120
- catch {
121
- //
122
- }
123
- }, [changeItemPropByKey]);
124
- // Move entity
125
- const onMoveEntity = useCallback((e) => {
126
- try {
127
- const detail = e.detail;
128
- if (detail.to && detail.uid) {
129
- moveItem(detail.uid, detail.to, Number(detail.position) ?? 0);
130
- }
131
- }
132
- catch {
133
- //
134
- }
135
- }, [moveItem]);
136
- // Remove entity
137
- const onRemoveEntity = useCallback((e) => {
138
- try {
139
- const detail = e.detail;
140
- if (detail.uid) {
141
- removeItem(detail.uid);
142
- }
143
- }
144
- catch {
145
- //
146
- }
147
- }, [removeItem]);
148
- // Change Swatches Data
149
- const onChangeSwatchesData = useCallback((e) => {
150
- const detail = e.detail;
151
- try {
152
- if (detail.data) {
153
- changeSwatches(detail.data);
154
- }
155
- }
156
- catch {
157
- //
158
- }
159
- }, [changeSwatches]);
160
- useEffect(() => {
161
- window.addEventListener('update-shop-info', onChangeShopInfo);
162
- window.addEventListener('revalidate-query', onRevalidateQuery);
163
- window.addEventListener('init-builder', onInitBuilder);
164
- window.addEventListener('add-entity', onAddEntity);
165
- window.addEventListener('remove-entity', onRemoveEntity);
166
- window.addEventListener('move-entity', onMoveEntity);
167
- window.addEventListener('update-entity-prop', onUpdateEntityProp);
168
- window.addEventListener('set-global-style', onChangeGlobalStyle);
169
- window.addEventListener('update-global-swatches-data', onChangeSwatchesData);
170
- return () => {
171
- window.removeEventListener('update-shop-info', onChangeShopInfo);
172
- window.removeEventListener('revalidate-query', onRevalidateQuery);
173
- window.removeEventListener('init-builder', onInitBuilder);
174
- window.removeEventListener('add-entity', onAddEntity);
175
- window.removeEventListener('remove-entity', onRemoveEntity);
176
- window.removeEventListener('move-entity', onMoveEntity);
177
- window.removeEventListener('update-entity-prop', onUpdateEntityProp);
178
- window.removeEventListener('set-global-style', onChangeGlobalStyle);
179
- window.removeEventListener('update-global-swatches-data', onChangeSwatchesData);
180
- };
181
- }, [
182
- onAddEntity,
183
- onUpdateEntityProp,
184
- onInitBuilder,
185
- onMoveEntity,
186
- onRemoveEntity,
187
- onChangeGlobalStyle,
188
- onChangeSwatchesData,
189
- onRevalidateQuery,
190
- onChangeShopInfo,
191
- ]);
192
- return null;
193
- };
194
- var Toolbox$1 = memo(Toolbox);
8
+ const globalStyleId = 'global-style';
9
+ const globalFontId = 'google-font-builder';
10
+ const Toolbox = ()=>{
11
+ const matchMutate = useMatchMutate();
12
+ const provider = useShopStore((s)=>s.provider);
13
+ const changeStorefrontInfo = useShopStore((s)=>s.changeStorefrontInfo);
14
+ const initState = useBuilderPreviewStore((s)=>s.initState);
15
+ const initNormalizeState = useBuilderPreviewStore((s)=>s.forceChangeState);
16
+ const changeItemPropByKey = useBuilderPreviewStore((s)=>s.changeItemPropByKey);
17
+ const addItem = useBuilderPreviewStore((s)=>s.addItem);
18
+ const moveItem = useBuilderPreviewStore((s)=>s.moveItem);
19
+ const removeItem = useBuilderPreviewStore((s)=>s.removeItem);
20
+ const addSection = useSectionStore((s)=>s.addSection);
21
+ const changeSwatches = useShopStore((s)=>s.changeSwatches);
22
+ const changeLayoutSettings = useShopStore((s)=>s.changeLayoutSettings);
23
+ const [initEventSuccess, setInitEventSuccess] = useState(false);
24
+ // Revalidate all query with key match query/
25
+ const onRevalidateQuery = useCallback(()=>{
26
+ matchMutate(/query\//);
27
+ }, [
28
+ matchMutate
29
+ ]);
30
+ // Update shop info
31
+ const onChangeShopInfo = useCallback((e)=>{
32
+ const detail = e.detail;
33
+ changeStorefrontInfo({
34
+ url: detail.shopHandle ? getStorefrontApi(detail.shopHandle, provider) : undefined,
35
+ token: detail.shopToken
36
+ });
37
+ }, [
38
+ changeStorefrontInfo,
39
+ provider
40
+ ]);
41
+ const onChangeGlobalStyle = useCallback((e)=>{
42
+ const detail = e.detail;
43
+ try {
44
+ if (detail.data) {
45
+ const themeStyle = genCSS(detail.data, detail.mobileOnly);
46
+ const font = Object.entries(detail.data?.font).map(([, value])=>{
47
+ return value;
48
+ });
49
+ const fontUrl = createFontUrl(font);
50
+ const globalStyle = document.getElementById(globalStyleId);
51
+ const googleFont = document.getElementById(globalFontId);
52
+ if (googleFont) {
53
+ googleFont.getAttribute('href') !== fontUrl && googleFont.setAttribute('href', fontUrl);
54
+ //
55
+ } else {
56
+ const link = document.createElement('link');
57
+ link.id = globalFontId;
58
+ link.href = fontUrl;
59
+ link.rel = 'stylesheet';
60
+ document.head.appendChild(link);
61
+ }
62
+ if (globalStyle) {
63
+ globalStyle.innerHTML = themeStyle;
64
+ } else {
65
+ const style = document.createElement('style');
66
+ style.id = globalStyleId;
67
+ style.innerHTML = themeStyle;
68
+ document.head.appendChild(style);
69
+ }
70
+ }
71
+ } catch {
72
+ //
73
+ }
74
+ }, []);
75
+ // Init builder data
76
+ const onInitBuilder = useCallback((e)=>{
77
+ try {
78
+ const detail = e.detail;
79
+ if (detail.data) {
80
+ if (detail.type === 'flat') {
81
+ initNormalizeState(detail.data);
82
+ } else {
83
+ initState(detail.data);
84
+ }
85
+ }
86
+ } catch {
87
+ //
88
+ }
89
+ }, [
90
+ initNormalizeState,
91
+ initState
92
+ ]);
93
+ // Add new entity
94
+ const onAddEntity = useCallback((e)=>{
95
+ try {
96
+ const detail = e.detail;
97
+ if (detail.entity) {
98
+ addItem({
99
+ data: detail.entity,
100
+ id: detail.id,
101
+ position: detail.position,
102
+ type: detail.type ?? 'component'
103
+ });
104
+ if (detail?.type === 'section' && !Array.isArray(detail.entity)) {
105
+ addSection(detail.entity.uid, detail.entity);
106
+ }
107
+ }
108
+ } catch {
109
+ //
110
+ }
111
+ }, [
112
+ addItem,
113
+ addSection
114
+ ]);
115
+ // Update props of entity
116
+ const onUpdateEntityProp = useCallback((e)=>{
117
+ try {
118
+ const detail = e.detail;
119
+ if (detail.uid && detail.propName) {
120
+ changeItemPropByKey({
121
+ id: detail.uid,
122
+ key: detail.propName,
123
+ data: detail.propValue,
124
+ group: detail.group
125
+ });
126
+ }
127
+ } catch {
128
+ //
129
+ }
130
+ }, [
131
+ changeItemPropByKey
132
+ ]);
133
+ // Move entity
134
+ const onMoveEntity = useCallback((e)=>{
135
+ try {
136
+ const detail = e.detail;
137
+ if (detail.to && detail.uid) {
138
+ moveItem(detail.uid, detail.to, Number(detail.position) ?? 0);
139
+ }
140
+ } catch {
141
+ //
142
+ }
143
+ }, [
144
+ moveItem
145
+ ]);
146
+ // Remove entity
147
+ const onRemoveEntity = useCallback((e)=>{
148
+ try {
149
+ const detail = e.detail;
150
+ if (detail.uid) {
151
+ removeItem(detail.uid);
152
+ }
153
+ } catch {
154
+ //
155
+ }
156
+ }, [
157
+ removeItem
158
+ ]);
159
+ // Change Swatches Data
160
+ const onChangeSwatchesData = useCallback((e)=>{
161
+ const detail = e.detail;
162
+ try {
163
+ if (detail.data) {
164
+ changeSwatches(detail.data);
165
+ }
166
+ } catch {
167
+ //
168
+ }
169
+ }, [
170
+ changeSwatches
171
+ ]);
172
+ const onChangeLayoutSettingData = useCallback((e)=>{
173
+ const detail = e.detail;
174
+ if (!detail) return;
175
+ changeLayoutSettings(detail);
176
+ }, [
177
+ changeLayoutSettings
178
+ ]);
179
+ useEffect(()=>{
180
+ window.addEventListener('update-shop-info', onChangeShopInfo);
181
+ window.addEventListener('revalidate-query', onRevalidateQuery);
182
+ window.addEventListener('init-builder', onInitBuilder);
183
+ window.addEventListener('add-entity', onAddEntity);
184
+ window.addEventListener('remove-entity', onRemoveEntity);
185
+ window.addEventListener('move-entity', onMoveEntity);
186
+ window.addEventListener('update-entity-prop', onUpdateEntityProp);
187
+ window.addEventListener('set-global-style', onChangeGlobalStyle);
188
+ window.addEventListener('update-global-swatches-data', onChangeSwatchesData);
189
+ window.addEventListener('on-off-header-footer', onChangeLayoutSettingData);
190
+ setInitEventSuccess(true);
191
+ return ()=>{
192
+ window.removeEventListener('update-shop-info', onChangeShopInfo);
193
+ window.removeEventListener('revalidate-query', onRevalidateQuery);
194
+ window.removeEventListener('init-builder', onInitBuilder);
195
+ window.removeEventListener('add-entity', onAddEntity);
196
+ window.removeEventListener('remove-entity', onRemoveEntity);
197
+ window.removeEventListener('move-entity', onMoveEntity);
198
+ window.removeEventListener('update-entity-prop', onUpdateEntityProp);
199
+ window.removeEventListener('set-global-style', onChangeGlobalStyle);
200
+ window.removeEventListener('update-global-swatches-data', onChangeSwatchesData);
201
+ window.addEventListener('on-off-header-footer', onChangeLayoutSettingData);
202
+ };
203
+ }, [
204
+ onAddEntity,
205
+ onUpdateEntityProp,
206
+ onInitBuilder,
207
+ onMoveEntity,
208
+ onRemoveEntity,
209
+ onChangeGlobalStyle,
210
+ onChangeSwatchesData,
211
+ onRevalidateQuery,
212
+ onChangeShopInfo,
213
+ onChangeLayoutSettingData
214
+ ]);
215
+ return /*#__PURE__*/ jsx("div", {
216
+ className: cls({
217
+ "toolbox": initEventSuccess
218
+ })
219
+ });
220
+ };
221
+ var Toolbox$1 = /*#__PURE__*/ memo(Toolbox);
195
222
 
196
223
  export { Toolbox$1 as default };
@@ -2,11 +2,25 @@ import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
2
2
  import { useShopStore, cls, AddOn } from '@gem-sdk/core';
3
3
  import { parseHtml } from '../libs/parse-html.js';
4
4
 
5
- const MainLayout = ({ children, ...props }) => {
6
- const mobileOnly = useShopStore((s) => s.mobileOnly);
7
- return (jsxs(Fragment, { children: [parseHtml(props?.customCodeBody), jsx("div", { className: cls({
8
- 'max-w-mobile mx-auto w-full': mobileOnly,
9
- }), children: children }), jsx(AddOn, { name: "cookie-bar" }), jsx(AddOn, { name: "cart-drawer" })] }));
5
+ const MainLayout = ({ children , ...props })=>{
6
+ const mobileOnly = useShopStore((s)=>s.mobileOnly);
7
+ return /*#__PURE__*/ jsxs(Fragment, {
8
+ children: [
9
+ parseHtml(props?.customCodeBody),
10
+ /*#__PURE__*/ jsx("div", {
11
+ className: cls({
12
+ 'max-w-mobile mx-auto w-full': mobileOnly
13
+ }),
14
+ children: children
15
+ }),
16
+ /*#__PURE__*/ jsx(AddOn, {
17
+ name: "cookie-bar"
18
+ }),
19
+ /*#__PURE__*/ jsx(AddOn, {
20
+ name: "cart-drawer"
21
+ })
22
+ ]
23
+ });
10
24
  };
11
25
 
12
26
  export { MainLayout as default };
@@ -2,30 +2,32 @@ import { StorePropertyDocument } from '@gem-sdk/core';
2
2
  import { ShopMetaDocument } from '@gem-sdk/adapter-shopify';
3
3
  import { serializableJson, parseJson } from '../helpers/parse-json.js';
4
4
 
5
- const getBuilderProps = async (fetcher, shopifyFetcher) => {
6
- const [storeProperty, shopifyMeta] = await Promise.allSettled([
7
- fetcher([StorePropertyDocument]),
8
- shopifyFetcher([ShopMetaDocument]),
9
- ]);
10
- const shopMeta = shopifyMeta.status === 'fulfilled' ? shopifyMeta.value : undefined;
11
- const shopData = storeProperty.status === 'fulfilled' ? storeProperty.value : undefined;
12
- const seo = shopMeta
13
- ? {
14
- titleTemplate: `%s | ${shopMeta.shop.name}`,
15
- defaultTitle: shopMeta?.shop.name,
16
- title: 'Preview',
17
- description: shopMeta?.shop.description,
18
- }
19
- : {};
20
- return serializableJson({
21
- currency: shopMeta?.localization.country.currency.isoCode ?? null,
22
- locale: shopMeta?.localization.country.isoCode ?? null,
23
- swatches: parseJson(shopData?.storeProperty?.swatchesConfig),
24
- swr: {
25
- revalidateOnMount: true,
26
- },
27
- seo,
28
- });
5
+ const getBuilderProps = async (fetcher, shopifyFetcher)=>{
6
+ const [storeProperty, shopifyMeta] = await Promise.allSettled([
7
+ fetcher([
8
+ StorePropertyDocument
9
+ ]),
10
+ shopifyFetcher([
11
+ ShopMetaDocument
12
+ ])
13
+ ]);
14
+ const shopMeta = shopifyMeta.status === 'fulfilled' ? shopifyMeta.value : undefined;
15
+ const shopData = storeProperty.status === 'fulfilled' ? storeProperty.value : undefined;
16
+ const seo = shopMeta ? {
17
+ titleTemplate: `%s | ${shopMeta.shop.name}`,
18
+ defaultTitle: shopMeta?.shop.name,
19
+ title: 'Preview',
20
+ description: shopMeta?.shop.description
21
+ } : {};
22
+ return serializableJson({
23
+ currency: shopMeta?.localization.country.currency.isoCode ?? null,
24
+ locale: shopMeta?.localization.country.isoCode ?? null,
25
+ swatches: parseJson(shopData?.storeProperty?.swatchesConfig),
26
+ swr: {
27
+ revalidateOnMount: true
28
+ },
29
+ seo
30
+ });
29
31
  };
30
32
 
31
33
  export { getBuilderProps };
@@ -3,60 +3,64 @@ import { genCSS } from '../helpers/gen-css.js';
3
3
  import { parseBuilderTemplate } from '../helpers/normalize.js';
4
4
  import { serializableJson } from '../helpers/parse-json.js';
5
5
 
6
- const getCollectionProps = (fetcher) => async (handle) => {
7
- const pageType = 'COLLECTION';
8
- const variables = {
9
- slug: handle,
10
- slugType: pageType,
11
- };
12
- const [collectionData, theme] = await Promise.all([
13
- fetcher([
14
- CollectionDocument,
15
- {
16
- handle,
17
- },
18
- ]),
19
- fetcher([
20
- PublishedThemePagesDocument,
21
- variables,
22
- ]),
23
- ]);
24
- const dataBuilder = theme.publishedThemePages?.[0];
25
- const collectionTemplate = parseBuilderTemplate(dataBuilder);
26
- if (!collectionData || !collectionData?.collection || !dataBuilder) {
27
- throw new Error('Collection not found');
28
- }
29
- const { collection } = collectionData;
30
- const queries = prefetchQueries(collectionTemplate);
31
- const datas = await Promise.allSettled(queries.map(({ query, variables, func }) => {
32
- if (func) {
33
- return func(fetcher, variables);
34
- }
35
- if (query)
36
- return fetcher([query, variables]);
37
- return {};
38
- }));
39
- const fallback = queries.reduce((acc, { key }, index) => {
40
- const res = datas[index];
41
- if (res?.status === 'fulfilled') {
42
- return {
43
- ...acc,
44
- [key]: res.value,
45
- };
46
- }
47
- return acc;
48
- }, {});
49
- return serializableJson({
50
- builderData: collectionTemplate,
51
- collection,
52
- pageType,
53
- themeStyle: genCSS(dataBuilder.pageStyle?.data),
54
- swr: { fallback },
55
- seo: {
56
- title: collection.title,
57
- description: collection.description,
58
- },
59
- });
60
- };
6
+ const getCollectionProps = (fetcher)=>async (handle)=>{
7
+ const pageType = 'COLLECTION';
8
+ const variables = {
9
+ slug: handle,
10
+ slugType: pageType
11
+ };
12
+ const [collectionData, theme] = await Promise.all([
13
+ fetcher([
14
+ CollectionDocument,
15
+ {
16
+ handle
17
+ }
18
+ ]),
19
+ fetcher([
20
+ PublishedThemePagesDocument,
21
+ variables
22
+ ])
23
+ ]);
24
+ const dataBuilder = theme.publishedThemePages?.[0];
25
+ const collectionTemplate = parseBuilderTemplate(dataBuilder);
26
+ if (!collectionData || !collectionData?.collection || !dataBuilder) {
27
+ throw new Error('Collection not found');
28
+ }
29
+ const { collection } = collectionData;
30
+ const queries = prefetchQueries(collectionTemplate);
31
+ const datas = await Promise.allSettled(queries.map(({ query , variables , func })=>{
32
+ if (func) {
33
+ return func(fetcher, variables);
34
+ }
35
+ if (query) return fetcher([
36
+ query,
37
+ variables
38
+ ]);
39
+ return {};
40
+ }));
41
+ const fallback = queries.reduce((acc, { key }, index)=>{
42
+ const res = datas[index];
43
+ if (res?.status === 'fulfilled') {
44
+ return {
45
+ ...acc,
46
+ [key]: res.value
47
+ };
48
+ }
49
+ return acc;
50
+ }, {});
51
+ return serializableJson({
52
+ builderData: collectionTemplate,
53
+ collection,
54
+ pageType,
55
+ themeStyle: genCSS(dataBuilder.pageStyle?.data),
56
+ swr: {
57
+ fallback
58
+ },
59
+ seo: {
60
+ title: collection.title,
61
+ description: collection.description
62
+ }
63
+ });
64
+ };
61
65
 
62
66
  export { getCollectionProps };