@gem-sdk/pages 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -0
- package/dist/cjs/components/ErrorBoundary.js +32 -0
- package/dist/cjs/components/ErrorFallback.js +9 -0
- package/dist/cjs/components/FacebookPixel.js +41 -0
- package/dist/cjs/components/GoogleAnalytic.js +43 -0
- package/dist/cjs/components/TikTokPixel.js +20 -0
- package/dist/cjs/components/builder/Toolbox.js +200 -0
- package/dist/cjs/index.js +62 -0
- package/dist/cjs/layouts/main.js +15 -0
- package/dist/cjs/libs/api/get-builder-props.js +33 -0
- package/dist/cjs/libs/api/get-collection-props.js +64 -0
- package/dist/cjs/libs/api/get-home-page-props-v2.js +127 -0
- package/dist/cjs/libs/api/get-home-page-props.js +135 -0
- package/dist/cjs/libs/api/get-preview-props.js +18 -0
- package/dist/cjs/libs/api/get-product-props.js +71 -0
- package/dist/cjs/libs/api/get-static-page-props-preview.js +133 -0
- package/dist/cjs/libs/api/get-static-page-props-v2.js +130 -0
- package/dist/cjs/libs/api/get-static-page-props.js +132 -0
- package/dist/cjs/libs/fetcher.js +71 -0
- package/dist/cjs/libs/get-layout.js +10 -0
- package/dist/cjs/libs/get-storefront-api.js +12 -0
- package/dist/cjs/libs/getStaticPaths.js +10 -0
- package/dist/cjs/libs/google-fonts.js +68 -0
- package/dist/cjs/libs/helpers/gen-css.js +102 -0
- package/dist/cjs/libs/helpers/generate-manifres.js +5 -0
- package/dist/cjs/libs/helpers/get-fallback.js +29 -0
- package/dist/cjs/libs/helpers/normalize.js +87 -0
- package/dist/cjs/libs/helpers/parse-json.js +18 -0
- package/dist/cjs/pages/404.js +11 -0
- package/dist/cjs/pages/500.js +19 -0
- package/dist/cjs/pages/builder.js +26 -0
- package/dist/cjs/pages/collection-detail.js +21 -0
- package/dist/cjs/pages/preview.js +20 -0
- package/dist/cjs/pages/product-detail.js +21 -0
- package/dist/cjs/pages/static-v2.js +17 -0
- package/dist/cjs/pages/static.js +19 -0
- package/dist/esm/components/ErrorBoundary.js +30 -0
- package/dist/esm/components/ErrorFallback.js +7 -0
- package/dist/esm/components/FacebookPixel.js +39 -0
- package/dist/esm/components/GoogleAnalytic.js +41 -0
- package/dist/esm/components/TikTokPixel.js +18 -0
- package/dist/esm/components/builder/Toolbox.js +196 -0
- package/dist/esm/index.js +28 -0
- package/dist/esm/layouts/main.js +11 -0
- package/dist/esm/libs/api/get-builder-props.js +31 -0
- package/dist/esm/libs/api/get-collection-props.js +62 -0
- package/dist/esm/libs/api/get-home-page-props-v2.js +125 -0
- package/dist/esm/libs/api/get-home-page-props.js +133 -0
- package/dist/esm/libs/api/get-preview-props.js +16 -0
- package/dist/esm/libs/api/get-product-props.js +69 -0
- package/dist/esm/libs/api/get-static-page-props-preview.js +131 -0
- package/dist/esm/libs/api/get-static-page-props-v2.js +128 -0
- package/dist/esm/libs/api/get-static-page-props.js +130 -0
- package/dist/esm/libs/fetcher.js +68 -0
- package/dist/esm/libs/get-layout.js +8 -0
- package/dist/esm/libs/get-storefront-api.js +10 -0
- package/dist/esm/libs/getStaticPaths.js +8 -0
- package/dist/esm/libs/google-fonts.js +64 -0
- package/dist/esm/libs/helpers/gen-css.js +100 -0
- package/dist/esm/libs/helpers/generate-manifres.js +3 -0
- package/dist/esm/libs/helpers/get-fallback.js +27 -0
- package/dist/esm/libs/helpers/normalize.js +83 -0
- package/dist/esm/libs/helpers/parse-json.js +15 -0
- package/dist/esm/pages/404.js +9 -0
- package/dist/esm/pages/500.js +17 -0
- package/dist/esm/pages/builder.js +24 -0
- package/dist/esm/pages/collection-detail.js +17 -0
- package/dist/esm/pages/preview.js +18 -0
- package/dist/esm/pages/product-detail.js +17 -0
- package/dist/esm/pages/static-v2.js +15 -0
- package/dist/esm/pages/static.js +15 -0
- package/dist/types/index.d.ts +173 -0
- package/package.json +45 -0
package/README.md
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var react = require('react');
|
|
5
|
+
|
|
6
|
+
const initialState = { hasError: false };
|
|
7
|
+
class ErrorBoundary extends react.Component {
|
|
8
|
+
state = initialState;
|
|
9
|
+
static getDerivedStateFromError(error) {
|
|
10
|
+
// Update state so the next render will show the fallback UI
|
|
11
|
+
return { hasError: true, error };
|
|
12
|
+
}
|
|
13
|
+
reset = () => {
|
|
14
|
+
this.setState(initialState);
|
|
15
|
+
};
|
|
16
|
+
componentDidCatch(error, errorInfo) {
|
|
17
|
+
// You can use your own error logging service here
|
|
18
|
+
this.props.onError?.(error, errorInfo);
|
|
19
|
+
}
|
|
20
|
+
render() {
|
|
21
|
+
const { FallbackComponent } = this.props;
|
|
22
|
+
// Check if the error is thrown
|
|
23
|
+
if (this.state.hasError) {
|
|
24
|
+
// You can render any custom fallback UI
|
|
25
|
+
return jsxRuntime.jsx(FallbackComponent, { error: this.state.error, resetErrorBoundary: this.reset });
|
|
26
|
+
}
|
|
27
|
+
// Return children components in case of no error
|
|
28
|
+
return this.props.children;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
exports.ErrorBoundary = ErrorBoundary;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
|
|
5
|
+
const ErrorFallback = ({ error, resetErrorBoundary }) => {
|
|
6
|
+
return (jsxRuntime.jsxs("div", { role: "alert", className: "flex flex-col items-center gap-2", children: [jsxRuntime.jsx("p", { className: "text-center text-2xl", children: "Oops! Something went wrong" }), jsxRuntime.jsx("pre", { children: error?.message }), jsxRuntime.jsx("button", { onClick: resetErrorBoundary, className: "inline-flex h-10 items-center justify-center gap-2 rounded bg-[#3C67FF] px-6 text-white active:translate-y-1", children: "Try again" })] }));
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
exports.ErrorFallback = ErrorFallback;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var core = require('@gem-sdk/core');
|
|
5
|
+
var router = require('next/router');
|
|
6
|
+
var Script = require('next/script');
|
|
7
|
+
var react = require('react');
|
|
8
|
+
|
|
9
|
+
const FacebookPixel = ({ pixelId }) => {
|
|
10
|
+
const router$1 = router.useRouter();
|
|
11
|
+
react.useEffect(() => {
|
|
12
|
+
// This pageview only triggers the first time (it's important for Pixel to have real information)
|
|
13
|
+
core.fpixel.pageview();
|
|
14
|
+
const handleRouteChange = () => {
|
|
15
|
+
core.fpixel.pageview();
|
|
16
|
+
};
|
|
17
|
+
router$1.events.on('routeChangeComplete', handleRouteChange);
|
|
18
|
+
router$1.events.on('hashChangeComplete', handleRouteChange);
|
|
19
|
+
return () => {
|
|
20
|
+
router$1.events.off('routeChangeComplete', handleRouteChange);
|
|
21
|
+
router$1.events.off('hashChangeComplete', handleRouteChange);
|
|
22
|
+
};
|
|
23
|
+
}, [router$1.events]);
|
|
24
|
+
if (!pixelId)
|
|
25
|
+
return null;
|
|
26
|
+
return (jsxRuntime.jsx(Script, { id: "fb-pixel", strategy: "afterInteractive", dangerouslySetInnerHTML: {
|
|
27
|
+
__html: `
|
|
28
|
+
!function(f,b,e,v,n,t,s)
|
|
29
|
+
{if(f.fbq)return;n=f.fbq=function(){n.callMethod?
|
|
30
|
+
n.callMethod.apply(n,arguments):n.queue.push(arguments)};
|
|
31
|
+
if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0';
|
|
32
|
+
n.queue=[];t=b.createElement(e);t.async=!0;
|
|
33
|
+
t.src=v;s=b.getElementsByTagName(e)[0];
|
|
34
|
+
s.parentNode.insertBefore(t,s)}(window, document,'script',
|
|
35
|
+
'https://connect.facebook.net/en_US/fbevents.js');
|
|
36
|
+
fbq('init', ${pixelId});
|
|
37
|
+
`,
|
|
38
|
+
} }));
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
exports.FacebookPixel = FacebookPixel;
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var core = require('@gem-sdk/core');
|
|
5
|
+
var router = require('next/router');
|
|
6
|
+
var Script = require('next/script');
|
|
7
|
+
var react = require('react');
|
|
8
|
+
|
|
9
|
+
const GoogleAnalytic = ({ trackingId }) => {
|
|
10
|
+
const router$1 = router.useRouter();
|
|
11
|
+
react.useEffect(() => {
|
|
12
|
+
const handleRouteChange = (url) => {
|
|
13
|
+
core.gtag.pageview(url, trackingId);
|
|
14
|
+
};
|
|
15
|
+
router$1.events.on('routeChangeComplete', handleRouteChange);
|
|
16
|
+
router$1.events.on('hashChangeComplete', handleRouteChange);
|
|
17
|
+
return () => {
|
|
18
|
+
router$1.events.off('routeChangeComplete', handleRouteChange);
|
|
19
|
+
router$1.events.off('hashChangeComplete', handleRouteChange);
|
|
20
|
+
};
|
|
21
|
+
}, [trackingId, router$1.events]);
|
|
22
|
+
if (!trackingId)
|
|
23
|
+
return null;
|
|
24
|
+
if (trackingId.startsWith('UA-'))
|
|
25
|
+
return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(Script, { src: "https://www.google-analytics.com/analytics.js", async: true, strategy: "afterInteractive" }), jsxRuntime.jsx(Script, { strategy: "afterInteractive", id: "google-analytics", dangerouslySetInnerHTML: {
|
|
26
|
+
__html: `window.ga=window.ga||function(){(ga.q=ga.q||[]).push(arguments)};ga.l=+new Date;
|
|
27
|
+
ga('create', '${trackingId}', 'auto');
|
|
28
|
+
ga('send', 'pageview');
|
|
29
|
+
`,
|
|
30
|
+
} })] }));
|
|
31
|
+
return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(Script, { strategy: "afterInteractive", src: `https://www.googletagmanager.com/gtag/js?id=${trackingId}` }), jsxRuntime.jsx(Script, { id: "gtag-init", strategy: "afterInteractive", dangerouslySetInnerHTML: {
|
|
32
|
+
__html: `
|
|
33
|
+
window.dataLayer = window.dataLayer || [];
|
|
34
|
+
function gtag(){dataLayer.push(arguments);}
|
|
35
|
+
gtag('js', new Date());
|
|
36
|
+
gtag('config', '${trackingId}', {
|
|
37
|
+
page_path: window.location.pathname,
|
|
38
|
+
});
|
|
39
|
+
`,
|
|
40
|
+
} })] }));
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
exports.GoogleAnalytic = GoogleAnalytic;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var Script = require('next/script');
|
|
5
|
+
|
|
6
|
+
const TikTokPixel = ({ pixelId }) => {
|
|
7
|
+
if (!pixelId)
|
|
8
|
+
return null;
|
|
9
|
+
return (jsxRuntime.jsx(Script, { id: "tiktok-pixel", strategy: "afterInteractive", dangerouslySetInnerHTML: {
|
|
10
|
+
__html: `
|
|
11
|
+
!function (w, d, t) {
|
|
12
|
+
w.TiktokAnalyticsObject=t;var ttq=w[t]=w[t]||[];ttq.methods=["page","track","identify","instances","debug","on","off","once","ready","alias","group","enableCookie","disableCookie"],ttq.setAndDefer=function(t,e){t[e]=function(){t.push([e].concat(Array.prototype.slice.call(arguments,0)))}};for(var i=0;i<ttq.methods.length;i++)ttq.setAndDefer(ttq,ttq.methods[i]);ttq.instance=function(t){for(var e=ttq._i[t]||[],n=0;n<ttq.methods.length;n++)ttq.setAndDefer(e,ttq.methods[n]);return e},ttq.load=function(e,n){var i="https://analytics.tiktok.com/i18n/pixel/events.js";ttq._i=ttq._i||{},ttq._i[e]=[],ttq._i[e]._u=i,ttq._t=ttq._t||{},ttq._t[e]=+new Date,ttq._o=ttq._o||{},ttq._o[e]=n||{};var o=document.createElement("script");o.type="text/javascript",o.async=!0,o.src=i+"?sdkid="+e+"&lib="+t;var a=document.getElementsByTagName("script")[0];a.parentNode.insertBefore(o,a)};
|
|
13
|
+
ttq.load('${pixelId}');
|
|
14
|
+
ttq.page();
|
|
15
|
+
}(window, document, 'ttq');
|
|
16
|
+
`,
|
|
17
|
+
} }));
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
exports.TikTokPixel = TikTokPixel;
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
var core = require('@gem-sdk/core');
|
|
6
|
+
var react = require('react');
|
|
7
|
+
var googleFonts = require('../../libs/google-fonts.js');
|
|
8
|
+
var genCss = require('../../libs/helpers/gen-css.js');
|
|
9
|
+
var getStorefrontApi = require('../../libs/get-storefront-api.js');
|
|
10
|
+
|
|
11
|
+
const globalStyleId = 'global-style';
|
|
12
|
+
const globalFontId = 'google-font-builder';
|
|
13
|
+
const Toolbox = () => {
|
|
14
|
+
const matchMutate = core.useMatchMutate();
|
|
15
|
+
const provider = core.useShopStore((s) => s.provider);
|
|
16
|
+
const changeStorefrontInfo = core.useShopStore((s) => s.changeStorefrontInfo);
|
|
17
|
+
const initState = core.useBuilderPreviewStore((s) => s.initState);
|
|
18
|
+
const initNormalizeState = core.useBuilderPreviewStore((s) => s.forceChangeState);
|
|
19
|
+
const changeItemPropByKey = core.useBuilderPreviewStore((s) => s.changeItemPropByKey);
|
|
20
|
+
const addItem = core.useBuilderPreviewStore((s) => s.addItem);
|
|
21
|
+
const moveItem = core.useBuilderPreviewStore((s) => s.moveItem);
|
|
22
|
+
const removeItem = core.useBuilderPreviewStore((s) => s.removeItem);
|
|
23
|
+
const addSection = core.useSectionStore((s) => s.addSection);
|
|
24
|
+
const changeSwatches = core.useShopStore((s) => s.changeSwatches);
|
|
25
|
+
// Revalidate all query with key match query/
|
|
26
|
+
const onRevalidateQuery = react.useCallback(() => {
|
|
27
|
+
matchMutate(/query\//);
|
|
28
|
+
}, [matchMutate]);
|
|
29
|
+
// Update shop info
|
|
30
|
+
const onChangeShopInfo = react.useCallback((e) => {
|
|
31
|
+
const detail = e.detail;
|
|
32
|
+
changeStorefrontInfo({
|
|
33
|
+
url: detail.shopHandle ? getStorefrontApi.getStorefrontApi(detail.shopHandle, provider) : undefined,
|
|
34
|
+
token: detail.shopToken,
|
|
35
|
+
});
|
|
36
|
+
}, [changeStorefrontInfo, provider]);
|
|
37
|
+
const onChangeGlobalStyle = react.useCallback((e) => {
|
|
38
|
+
const detail = e.detail;
|
|
39
|
+
try {
|
|
40
|
+
if (detail.data) {
|
|
41
|
+
const themeStyle = genCss.genCSS(detail.data, detail.mobileOnly);
|
|
42
|
+
const font = Object.entries(detail.data?.font).map(([, value]) => {
|
|
43
|
+
return value;
|
|
44
|
+
});
|
|
45
|
+
const fontUrl = googleFonts.createFontUrl(font);
|
|
46
|
+
const globalStyle = document.getElementById(globalStyleId);
|
|
47
|
+
const googleFont = document.getElementById(globalFontId);
|
|
48
|
+
if (googleFont) {
|
|
49
|
+
googleFont.getAttribute('href') !== fontUrl && googleFont.setAttribute('href', fontUrl);
|
|
50
|
+
//
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
const link = document.createElement('link');
|
|
54
|
+
link.id = globalFontId;
|
|
55
|
+
link.href = fontUrl;
|
|
56
|
+
link.rel = 'stylesheet';
|
|
57
|
+
document.head.appendChild(link);
|
|
58
|
+
}
|
|
59
|
+
if (globalStyle) {
|
|
60
|
+
globalStyle.innerHTML = themeStyle;
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
const style = document.createElement('style');
|
|
64
|
+
style.id = globalStyleId;
|
|
65
|
+
style.innerHTML = themeStyle;
|
|
66
|
+
document.head.appendChild(style);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
//
|
|
72
|
+
}
|
|
73
|
+
}, []);
|
|
74
|
+
// Init builder data
|
|
75
|
+
const onInitBuilder = react.useCallback((e) => {
|
|
76
|
+
try {
|
|
77
|
+
const detail = e.detail;
|
|
78
|
+
if (detail.data) {
|
|
79
|
+
if (detail.type === 'flat') {
|
|
80
|
+
initNormalizeState(detail.data);
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
initState(detail.data);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
//
|
|
89
|
+
}
|
|
90
|
+
}, [initNormalizeState, initState]);
|
|
91
|
+
// Add new entity
|
|
92
|
+
const onAddEntity = react.useCallback((e) => {
|
|
93
|
+
try {
|
|
94
|
+
const detail = e.detail;
|
|
95
|
+
if (detail.entity) {
|
|
96
|
+
addItem({
|
|
97
|
+
data: detail.entity,
|
|
98
|
+
id: detail.id,
|
|
99
|
+
position: detail.position,
|
|
100
|
+
type: detail.type ?? 'component',
|
|
101
|
+
});
|
|
102
|
+
if (detail?.type === 'section' && !Array.isArray(detail.entity)) {
|
|
103
|
+
addSection(detail.entity.uid, detail.entity);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
//
|
|
109
|
+
}
|
|
110
|
+
}, [addItem, addSection]);
|
|
111
|
+
// Update props of entity
|
|
112
|
+
const onUpdateEntityProp = react.useCallback((e) => {
|
|
113
|
+
try {
|
|
114
|
+
const detail = e.detail;
|
|
115
|
+
if (detail.uid && detail.propName) {
|
|
116
|
+
changeItemPropByKey({
|
|
117
|
+
id: detail.uid,
|
|
118
|
+
key: detail.propName,
|
|
119
|
+
data: detail.propValue,
|
|
120
|
+
group: detail.group,
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
catch {
|
|
125
|
+
//
|
|
126
|
+
}
|
|
127
|
+
}, [changeItemPropByKey]);
|
|
128
|
+
// Move entity
|
|
129
|
+
const onMoveEntity = react.useCallback((e) => {
|
|
130
|
+
try {
|
|
131
|
+
const detail = e.detail;
|
|
132
|
+
if (detail.to && detail.uid) {
|
|
133
|
+
moveItem(detail.uid, detail.to, Number(detail.position) ?? 0);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
catch {
|
|
137
|
+
//
|
|
138
|
+
}
|
|
139
|
+
}, [moveItem]);
|
|
140
|
+
// Remove entity
|
|
141
|
+
const onRemoveEntity = react.useCallback((e) => {
|
|
142
|
+
try {
|
|
143
|
+
const detail = e.detail;
|
|
144
|
+
if (detail.uid) {
|
|
145
|
+
removeItem(detail.uid);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
catch {
|
|
149
|
+
//
|
|
150
|
+
}
|
|
151
|
+
}, [removeItem]);
|
|
152
|
+
// Change Swatches Data
|
|
153
|
+
const onChangeSwatchesData = react.useCallback((e) => {
|
|
154
|
+
const detail = e.detail;
|
|
155
|
+
try {
|
|
156
|
+
if (detail.data) {
|
|
157
|
+
changeSwatches(detail.data);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
catch {
|
|
161
|
+
//
|
|
162
|
+
}
|
|
163
|
+
}, [changeSwatches]);
|
|
164
|
+
react.useEffect(() => {
|
|
165
|
+
window.addEventListener('update-shop-info', onChangeShopInfo);
|
|
166
|
+
window.addEventListener('revalidate-query', onRevalidateQuery);
|
|
167
|
+
window.addEventListener('init-builder', onInitBuilder);
|
|
168
|
+
window.addEventListener('add-entity', onAddEntity);
|
|
169
|
+
window.addEventListener('remove-entity', onRemoveEntity);
|
|
170
|
+
window.addEventListener('move-entity', onMoveEntity);
|
|
171
|
+
window.addEventListener('update-entity-prop', onUpdateEntityProp);
|
|
172
|
+
window.addEventListener('set-global-style', onChangeGlobalStyle);
|
|
173
|
+
window.addEventListener('update-global-swatches-data', onChangeSwatchesData);
|
|
174
|
+
return () => {
|
|
175
|
+
window.removeEventListener('update-shop-info', onChangeShopInfo);
|
|
176
|
+
window.removeEventListener('revalidate-query', onRevalidateQuery);
|
|
177
|
+
window.removeEventListener('init-builder', onInitBuilder);
|
|
178
|
+
window.removeEventListener('add-entity', onAddEntity);
|
|
179
|
+
window.removeEventListener('remove-entity', onRemoveEntity);
|
|
180
|
+
window.removeEventListener('move-entity', onMoveEntity);
|
|
181
|
+
window.removeEventListener('update-entity-prop', onUpdateEntityProp);
|
|
182
|
+
window.removeEventListener('set-global-style', onChangeGlobalStyle);
|
|
183
|
+
window.removeEventListener('update-global-swatches-data', onChangeSwatchesData);
|
|
184
|
+
};
|
|
185
|
+
}, [
|
|
186
|
+
onAddEntity,
|
|
187
|
+
onUpdateEntityProp,
|
|
188
|
+
onInitBuilder,
|
|
189
|
+
onMoveEntity,
|
|
190
|
+
onRemoveEntity,
|
|
191
|
+
onChangeGlobalStyle,
|
|
192
|
+
onChangeSwatchesData,
|
|
193
|
+
onRevalidateQuery,
|
|
194
|
+
onChangeShopInfo,
|
|
195
|
+
]);
|
|
196
|
+
return null;
|
|
197
|
+
};
|
|
198
|
+
var Toolbox$1 = react.memo(Toolbox);
|
|
199
|
+
|
|
200
|
+
exports.default = Toolbox$1;
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var getCollectionProps = require('./libs/api/get-collection-props.js');
|
|
4
|
+
var getHomePageProps = require('./libs/api/get-home-page-props.js');
|
|
5
|
+
var getHomePagePropsV2 = require('./libs/api/get-home-page-props-v2.js');
|
|
6
|
+
var getPreviewProps = require('./libs/api/get-preview-props.js');
|
|
7
|
+
var getBuilderProps = require('./libs/api/get-builder-props.js');
|
|
8
|
+
var getProductProps = require('./libs/api/get-product-props.js');
|
|
9
|
+
var getStaticPageProps = require('./libs/api/get-static-page-props.js');
|
|
10
|
+
var getStaticPagePropsV2 = require('./libs/api/get-static-page-props-v2.js');
|
|
11
|
+
var getStaticPagePropsPreview = require('./libs/api/get-static-page-props-preview.js');
|
|
12
|
+
var fetcher = require('./libs/fetcher.js');
|
|
13
|
+
var getLayout = require('./libs/get-layout.js');
|
|
14
|
+
var genCss = require('./libs/helpers/gen-css.js');
|
|
15
|
+
var collectionDetail = require('./pages/collection-detail.js');
|
|
16
|
+
var preview = require('./pages/preview.js');
|
|
17
|
+
var productDetail = require('./pages/product-detail.js');
|
|
18
|
+
var _static = require('./pages/static.js');
|
|
19
|
+
var builder = require('./pages/builder.js');
|
|
20
|
+
var staticV2 = require('./pages/static-v2.js');
|
|
21
|
+
var getStaticPaths = require('./libs/getStaticPaths.js');
|
|
22
|
+
var googleFonts = require('./libs/google-fonts.js');
|
|
23
|
+
var getStorefrontApi = require('./libs/get-storefront-api.js');
|
|
24
|
+
var ErrorBoundary = require('./components/ErrorBoundary.js');
|
|
25
|
+
var ErrorFallback = require('./components/ErrorFallback.js');
|
|
26
|
+
var _404 = require('./pages/404.js');
|
|
27
|
+
var _500 = require('./pages/500.js');
|
|
28
|
+
var GoogleAnalytic = require('./components/GoogleAnalytic.js');
|
|
29
|
+
var FacebookPixel = require('./components/FacebookPixel.js');
|
|
30
|
+
var TikTokPixel = require('./components/TikTokPixel.js');
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
exports.getCollectionProps = getCollectionProps.getCollectionProps;
|
|
35
|
+
exports.getHomePageProps = getHomePageProps.getHomePageProps;
|
|
36
|
+
exports.getHomePagePropsV2 = getHomePagePropsV2.getHomePagePropsV2;
|
|
37
|
+
exports.getPreviewProps = getPreviewProps.getPreviewProps;
|
|
38
|
+
exports.getBuilderProps = getBuilderProps.getBuilderProps;
|
|
39
|
+
exports.getProductProps = getProductProps.getProductProps;
|
|
40
|
+
exports.getStaticPageProps = getStaticPageProps.getStaticPageProps;
|
|
41
|
+
exports.getStaticPagePropsV2 = getStaticPagePropsV2.getStaticPagePropsV2;
|
|
42
|
+
exports.getStaticPagePropsPreview = getStaticPagePropsPreview.getStaticPagePropsPreview;
|
|
43
|
+
exports.createFetcher = fetcher.createFetcher;
|
|
44
|
+
exports.createShopifyFetcher = fetcher.createShopifyFetcher;
|
|
45
|
+
exports.getLayout = getLayout.getLayout;
|
|
46
|
+
exports.genCSS = genCss.genCSS;
|
|
47
|
+
exports.CollectionDetailPage = collectionDetail.default;
|
|
48
|
+
exports.PreviewPage = preview.PreviewPage;
|
|
49
|
+
exports.ProductDetailPage = productDetail.default;
|
|
50
|
+
exports.StaticPage = _static.default;
|
|
51
|
+
exports.BuilderPage = builder.BuilderPage;
|
|
52
|
+
exports.StaticPageV2 = staticV2.StaticPageV2;
|
|
53
|
+
exports.getStaticPaths = getStaticPaths.getStaticPaths;
|
|
54
|
+
exports.getFonts = googleFonts.getFonts;
|
|
55
|
+
exports.getStorefrontApi = getStorefrontApi.getStorefrontApi;
|
|
56
|
+
exports.ErrorBoundary = ErrorBoundary.ErrorBoundary;
|
|
57
|
+
exports.ErrorFallback = ErrorFallback.ErrorFallback;
|
|
58
|
+
exports.Page404 = _404.Page404;
|
|
59
|
+
exports.Page500 = _500.Page500;
|
|
60
|
+
exports.GoogleAnalytic = GoogleAnalytic.GoogleAnalytic;
|
|
61
|
+
exports.FacebookPixel = FacebookPixel.FacebookPixel;
|
|
62
|
+
exports.TikTokPixel = TikTokPixel.TikTokPixel;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
6
|
+
var core = require('@gem-sdk/core');
|
|
7
|
+
|
|
8
|
+
const MainLayout = ({ children }) => {
|
|
9
|
+
const mobileOnly = core.useShopStore((s) => s.mobileOnly);
|
|
10
|
+
return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("div", { className: core.cls({
|
|
11
|
+
'max-w-mobile mx-auto w-full': mobileOnly,
|
|
12
|
+
}), children: children }), jsxRuntime.jsx(core.AddOn, { name: "cookie-bar" }), jsxRuntime.jsx(core.AddOn, { name: "cart-drawer" })] }));
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
exports.default = MainLayout;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var core = require('@gem-sdk/core');
|
|
4
|
+
var adapterShopify = require('@gem-sdk/adapter-shopify');
|
|
5
|
+
var parseJson = require('../helpers/parse-json.js');
|
|
6
|
+
|
|
7
|
+
const getBuilderProps = async (fetcher, shopifyFetcher) => {
|
|
8
|
+
const [storeProperty, shopifyMeta] = await Promise.allSettled([
|
|
9
|
+
fetcher([core.StorePropertyDocument]),
|
|
10
|
+
shopifyFetcher([adapterShopify.ShopMetaDocument]),
|
|
11
|
+
]);
|
|
12
|
+
const shopMeta = shopifyMeta.status === 'fulfilled' ? shopifyMeta.value : undefined;
|
|
13
|
+
const shopData = storeProperty.status === 'fulfilled' ? storeProperty.value : undefined;
|
|
14
|
+
const seo = shopMeta
|
|
15
|
+
? {
|
|
16
|
+
titleTemplate: `%s | ${shopMeta.shop.name}`,
|
|
17
|
+
defaultTitle: shopMeta?.shop.name,
|
|
18
|
+
title: 'Preview',
|
|
19
|
+
description: shopMeta?.shop.description,
|
|
20
|
+
}
|
|
21
|
+
: {};
|
|
22
|
+
return parseJson.serializableJson({
|
|
23
|
+
currency: shopMeta?.localization.country.currency.isoCode ?? null,
|
|
24
|
+
locale: shopMeta?.localization.country.isoCode ?? null,
|
|
25
|
+
swatches: parseJson.parseJson(shopData?.storeProperty?.swatchesConfig),
|
|
26
|
+
swr: {
|
|
27
|
+
revalidateOnMount: true,
|
|
28
|
+
},
|
|
29
|
+
seo,
|
|
30
|
+
});
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
exports.getBuilderProps = getBuilderProps;
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var core = require('@gem-sdk/core');
|
|
4
|
+
var genCss = require('../helpers/gen-css.js');
|
|
5
|
+
var normalize = require('../helpers/normalize.js');
|
|
6
|
+
var parseJson = require('../helpers/parse-json.js');
|
|
7
|
+
|
|
8
|
+
const getCollectionProps = (fetcher) => async (handle) => {
|
|
9
|
+
const pageType = 'COLLECTION';
|
|
10
|
+
const variables = {
|
|
11
|
+
slug: handle,
|
|
12
|
+
slugType: pageType,
|
|
13
|
+
};
|
|
14
|
+
const [collectionData, theme] = await Promise.all([
|
|
15
|
+
fetcher([
|
|
16
|
+
core.CollectionDocument,
|
|
17
|
+
{
|
|
18
|
+
handle,
|
|
19
|
+
},
|
|
20
|
+
]),
|
|
21
|
+
fetcher([
|
|
22
|
+
core.PublishedThemePagesDocument,
|
|
23
|
+
variables,
|
|
24
|
+
]),
|
|
25
|
+
]);
|
|
26
|
+
const dataBuilder = theme.publishedThemePages?.[0];
|
|
27
|
+
const collectionTemplate = normalize.parseBuilderTemplate(dataBuilder);
|
|
28
|
+
if (!collectionData || !collectionData?.collection || !dataBuilder) {
|
|
29
|
+
throw new Error('Collection not found');
|
|
30
|
+
}
|
|
31
|
+
const { collection } = collectionData;
|
|
32
|
+
const queries = core.prefetchQueries(collectionTemplate);
|
|
33
|
+
const datas = await Promise.allSettled(queries.map(({ query, variables, func }) => {
|
|
34
|
+
if (func) {
|
|
35
|
+
return func(fetcher, variables);
|
|
36
|
+
}
|
|
37
|
+
if (query)
|
|
38
|
+
return fetcher([query, variables]);
|
|
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 parseJson.serializableJson({
|
|
52
|
+
builderData: collectionTemplate,
|
|
53
|
+
collection,
|
|
54
|
+
pageType,
|
|
55
|
+
themeStyle: genCss.genCSS(dataBuilder.pageStyle?.data),
|
|
56
|
+
swr: { fallback },
|
|
57
|
+
seo: {
|
|
58
|
+
title: collection.title,
|
|
59
|
+
description: collection.description,
|
|
60
|
+
},
|
|
61
|
+
});
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
exports.getCollectionProps = getCollectionProps;
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var core = require('@gem-sdk/core');
|
|
4
|
+
var adapterShopify = require('@gem-sdk/adapter-shopify');
|
|
5
|
+
var googleFonts = require('../google-fonts.js');
|
|
6
|
+
var genCss = require('../helpers/gen-css.js');
|
|
7
|
+
var generateManifres = require('../helpers/generate-manifres.js');
|
|
8
|
+
var getFallback = require('../helpers/get-fallback.js');
|
|
9
|
+
var normalize = require('../helpers/normalize.js');
|
|
10
|
+
var parseJson = require('../helpers/parse-json.js');
|
|
11
|
+
var nextjs = require('@sentry/nextjs');
|
|
12
|
+
|
|
13
|
+
const getHomePagePropsV2 = (fetcher, shopifyFetcher) => async () => {
|
|
14
|
+
try {
|
|
15
|
+
const variables = {
|
|
16
|
+
slugType: 'STATIC',
|
|
17
|
+
};
|
|
18
|
+
const [theme, storeProperty, shopifyMeta] = await Promise.allSettled([
|
|
19
|
+
fetcher([
|
|
20
|
+
core.PublishedThemePagesDocument,
|
|
21
|
+
variables,
|
|
22
|
+
]),
|
|
23
|
+
fetcher([core.StorePropertyDocument]),
|
|
24
|
+
shopifyFetcher([adapterShopify.ShopMetaDocument]),
|
|
25
|
+
]);
|
|
26
|
+
if (theme.status === 'rejected') {
|
|
27
|
+
throw new Error(theme.reason?.[0]);
|
|
28
|
+
}
|
|
29
|
+
const dataBuilder = theme.value?.publishedThemePages?.[0];
|
|
30
|
+
if (!dataBuilder) {
|
|
31
|
+
throw new Error(`No data builder found for Home page`);
|
|
32
|
+
}
|
|
33
|
+
const homeTemplate = normalize.parseBuilderTemplateV2(dataBuilder);
|
|
34
|
+
const [fontStyle, fallback] = await Promise.all([
|
|
35
|
+
googleFonts.getFontFromGlobalStyle(dataBuilder?.pageStyle?.data),
|
|
36
|
+
getFallback.getFallbackV2(fetcher, homeTemplate),
|
|
37
|
+
]);
|
|
38
|
+
const mobileOnly = dataBuilder.isMobile ?? false;
|
|
39
|
+
const description = dataBuilder?.themePageDataSEO?.find((item) => item?.key === 'global-meta-description')?.value;
|
|
40
|
+
const thumbnail = parseJson.parseJson(dataBuilder?.themePageDataSEO?.find((item) => item?.key === 'global-meta-thumbnail')?.value);
|
|
41
|
+
const shopMeta = shopifyMeta.status === 'fulfilled' ? shopifyMeta.value : undefined;
|
|
42
|
+
const shopData = storeProperty.status === 'fulfilled' ? storeProperty.value : undefined;
|
|
43
|
+
const favicon = shopData?.storeProperty?.favicon ?? '/favicon/favicon-32x32.png';
|
|
44
|
+
const seo = {
|
|
45
|
+
defaultTitle: shopMeta?.shop.name,
|
|
46
|
+
title: dataBuilder?.name ?? 'Home',
|
|
47
|
+
description: description ?? shopMeta?.shop.description,
|
|
48
|
+
openGraph: {
|
|
49
|
+
site_name: shopMeta?.shop.name,
|
|
50
|
+
locale: shopMeta?.localization.country.isoCode,
|
|
51
|
+
title: dataBuilder?.name ?? shopMeta?.shop.name,
|
|
52
|
+
description: description ?? shopMeta?.shop.description,
|
|
53
|
+
images: thumbnail ? [thumbnail] : [],
|
|
54
|
+
},
|
|
55
|
+
additionalMetaTags: [
|
|
56
|
+
{
|
|
57
|
+
name: 'theme-color',
|
|
58
|
+
content: '#000000',
|
|
59
|
+
},
|
|
60
|
+
],
|
|
61
|
+
canonical: '/',
|
|
62
|
+
additionalLinkTags: [
|
|
63
|
+
{
|
|
64
|
+
rel: 'icon',
|
|
65
|
+
sizes: '32x32',
|
|
66
|
+
href: `${favicon}-/crop/1:1/center/-/smart_resize/32x32/`,
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
rel: 'icon',
|
|
70
|
+
sizes: '16x16',
|
|
71
|
+
href: `${favicon}-/crop/1:1/center/-/smart_resize/16x16/`,
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
rel: 'apple-touch-icon',
|
|
75
|
+
sizes: '180x180',
|
|
76
|
+
href: `${favicon}-/crop/1:1/center/-/smart_resize/180x180/`,
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
rel: 'manifest',
|
|
80
|
+
href: generateManifres.generateManifest({
|
|
81
|
+
theme_color: '#000000',
|
|
82
|
+
background_color: '#ffffff',
|
|
83
|
+
display: 'standalone',
|
|
84
|
+
scope: '/',
|
|
85
|
+
start_url: '/',
|
|
86
|
+
name: shopMeta?.shop.name,
|
|
87
|
+
short_name: shopMeta?.shop.name,
|
|
88
|
+
description: shopMeta?.shop.description,
|
|
89
|
+
icons: [
|
|
90
|
+
{
|
|
91
|
+
src: `${favicon}-/crop/1:1/center/-/smart_resize/192x192/`,
|
|
92
|
+
sizes: '192x192',
|
|
93
|
+
type: 'image/png',
|
|
94
|
+
purpose: 'any maskable',
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
src: `${favicon}-/crop/1:1/center/-/smart_resize/512x512/`,
|
|
98
|
+
sizes: '512x512',
|
|
99
|
+
type: 'image/png',
|
|
100
|
+
},
|
|
101
|
+
],
|
|
102
|
+
}),
|
|
103
|
+
},
|
|
104
|
+
],
|
|
105
|
+
};
|
|
106
|
+
return parseJson.serializableJson({
|
|
107
|
+
themeStyle: genCss.genCSS(dataBuilder?.pageStyle?.data, mobileOnly),
|
|
108
|
+
fontStyle,
|
|
109
|
+
builderData: homeTemplate,
|
|
110
|
+
swr: { fallback },
|
|
111
|
+
currency: shopMeta?.localization.country.currency.isoCode ?? null,
|
|
112
|
+
locale: shopMeta?.localization.country.isoCode ?? null,
|
|
113
|
+
swatches: parseJson.parseJson(shopData?.storeProperty?.swatchesConfig),
|
|
114
|
+
seo,
|
|
115
|
+
mobileOnly,
|
|
116
|
+
gaTrackingId: dataBuilder.themePageAnalytic?.gaTrackingID ?? null,
|
|
117
|
+
facebookPixelId: dataBuilder.themePageAnalytic?.fbPixelID ?? null,
|
|
118
|
+
tiktokPixelId: dataBuilder.themePageAnalytic?.tiktokPixelID ?? null,
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
catch (err) {
|
|
122
|
+
nextjs.captureException(err);
|
|
123
|
+
throw err;
|
|
124
|
+
}
|
|
125
|
+
};
|
|
126
|
+
|
|
127
|
+
exports.getHomePagePropsV2 = getHomePagePropsV2;
|