@weaverse/hydrogen 2.7.4 → 2.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.mts CHANGED
@@ -140,7 +140,6 @@ type WeaverseLoaderRequestInfo = {
140
140
  };
141
141
  type WeaverseStorefrontData = {
142
142
  id?: string;
143
- __cachedId?: string;
144
143
  rootId: string;
145
144
  name: string;
146
145
  items: HydrogenComponentData[];
@@ -227,9 +226,9 @@ interface WeaverseLoaderData {
227
226
  }
228
227
  interface HydrogenPageData extends WeaverseProjectDataType {
229
228
  id: string;
230
- pageId: string;
231
229
  name: string;
232
230
  items: HydrogenComponentData[];
231
+ __cacheId?: string;
233
232
  [key: string]: any;
234
233
  }
235
234
  interface WeaverseHydrogenRootProps {
@@ -273,6 +272,7 @@ type FetchProjectPayload = {
273
272
  page: HydrogenPageData;
274
273
  project: HydrogenProjectType;
275
274
  pageAssignment: HydrogenPageAssignment;
275
+ error?: string;
276
276
  };
277
277
  type HydrogenThemeEnv = {
278
278
  WEAVERSE_PROJECT_ID: string;
@@ -310,7 +310,7 @@ type WeaverseArticle = WeaverseResourcePickerData;
310
310
  declare global {
311
311
  interface Window {
312
312
  __weaverse: WeaverseHydrogen;
313
- __weaverses: WeaverseHydrogen[];
313
+ __weaverses: Record<string, WeaverseHydrogen>;
314
314
  }
315
315
  }
316
316
 
package/dist/index.d.ts CHANGED
@@ -140,7 +140,6 @@ type WeaverseLoaderRequestInfo = {
140
140
  };
141
141
  type WeaverseStorefrontData = {
142
142
  id?: string;
143
- __cachedId?: string;
144
143
  rootId: string;
145
144
  name: string;
146
145
  items: HydrogenComponentData[];
@@ -227,9 +226,9 @@ interface WeaverseLoaderData {
227
226
  }
228
227
  interface HydrogenPageData extends WeaverseProjectDataType {
229
228
  id: string;
230
- pageId: string;
231
229
  name: string;
232
230
  items: HydrogenComponentData[];
231
+ __cacheId?: string;
233
232
  [key: string]: any;
234
233
  }
235
234
  interface WeaverseHydrogenRootProps {
@@ -273,6 +272,7 @@ type FetchProjectPayload = {
273
272
  page: HydrogenPageData;
274
273
  project: HydrogenProjectType;
275
274
  pageAssignment: HydrogenPageAssignment;
275
+ error?: string;
276
276
  };
277
277
  type HydrogenThemeEnv = {
278
278
  WEAVERSE_PROJECT_ID: string;
@@ -310,7 +310,7 @@ type WeaverseArticle = WeaverseResourcePickerData;
310
310
  declare global {
311
311
  interface Window {
312
312
  __weaverse: WeaverseHydrogen;
313
- __weaverses: WeaverseHydrogen[];
313
+ __weaverses: Record<string, WeaverseHydrogen>;
314
314
  }
315
315
  }
316
316
 
package/dist/index.js CHANGED
@@ -38,15 +38,15 @@ __export(src_exports, {
38
38
  getRequestQueries: () => getRequestQueries,
39
39
  getSelectedProductOptions: () => getSelectedProductOptions,
40
40
  getWeaverseConfigs: () => getWeaverseConfigs,
41
- useChildInstances: () => import_react14.useChildInstances,
42
- useItemInstance: () => import_react14.useItemInstance,
43
- useParentInstance: () => import_react14.useParentInstance,
41
+ useChildInstances: () => import_react16.useChildInstances,
42
+ useItemInstance: () => import_react16.useItemInstance,
43
+ useParentInstance: () => import_react16.useParentInstance,
44
44
  useThemeSettings: () => useThemeSettings,
45
- useWeaverse: () => import_react14.useWeaverse,
45
+ useWeaverse: () => import_react16.useWeaverse,
46
46
  withWeaverse: () => withWeaverse
47
47
  });
48
48
  module.exports = __toCommonJS(src_exports);
49
- var import_react14 = require("@weaverse/react");
49
+ var import_react16 = require("@weaverse/react");
50
50
 
51
51
  // src/components/main.tsx
52
52
  var main_exports = {};
@@ -69,9 +69,9 @@ var schema = {
69
69
  var defaultComponents = [main_exports];
70
70
 
71
71
  // src/WeaverseHydrogenRoot.tsx
72
- var import_react11 = require("@remix-run/react");
73
- var import_react12 = require("@weaverse/react");
74
- var import_react13 = __toESM(require("react"));
72
+ var import_react13 = require("@remix-run/react");
73
+ var import_react14 = require("@weaverse/react");
74
+ var import_react15 = __toESM(require("react"));
75
75
  var import_react_error_boundary = require("react-error-boundary");
76
76
 
77
77
  // src/context.ts
@@ -79,17 +79,13 @@ var import_react2 = require("@weaverse/react");
79
79
  var import_react3 = require("react");
80
80
  function createCachedWeaverseInstance(params, components) {
81
81
  if (import_react2.isBrowser) {
82
- window.__weaverses = window.__weaverses || [];
83
- let weaverse = window.__weaverses.find((w) => {
84
- let { pathname } = w.requestInfo;
85
- return pathname === params.requestInfo.pathname;
86
- });
82
+ window.__weaverses = window.__weaverses || {};
83
+ let weaverse = window.__weaverses[params.pageId];
87
84
  if (!weaverse) {
88
85
  weaverse = new WeaverseHydrogen(params, components);
89
- window.__weaverses.push(weaverse);
86
+ window.__weaverses[params.pageId] = weaverse;
90
87
  } else if (weaverse.isDesignMode) {
91
- weaverse.requestInfo = params.requestInfo;
92
- weaverse.setProjectData(params.data);
88
+ window.weaverseStudio?.refresh(params);
93
89
  }
94
90
  return weaverse;
95
91
  }
@@ -110,17 +106,18 @@ function createWeaverseInstance(weaverseData, components) {
110
106
  var ThemeProvider = (0, import_react3.createContext)(null);
111
107
  ThemeProvider.displayName = "WeaverseThemeProvider";
112
108
 
113
- // src/hooks/use-studio.ts
114
- var import_react7 = require("@remix-run/react");
115
- var import_react8 = require("@weaverse/react");
116
- var import_react9 = require("react");
109
+ // src/hooks/use-theme-settings.ts
110
+ var import_react5 = require("react");
111
+ var import_react6 = require("@weaverse/react");
117
112
 
118
113
  // src/hooks/use-theme-context.ts
119
- var import_react6 = require("react");
114
+ var import_react4 = require("react");
115
+ function useThemeContext() {
116
+ let themeContext = (0, import_react4.useContext)(ThemeProvider);
117
+ return themeContext || new ThemeSettingsStore({ theme: {} });
118
+ }
120
119
 
121
120
  // src/hooks/use-theme-settings.ts
122
- var import_react4 = require("react");
123
- var import_react5 = require("@weaverse/react");
124
121
  var ThemeSettingsStore = class _ThemeSettingsStore {
125
122
  static settings = null;
126
123
  listeners = [];
@@ -129,7 +126,7 @@ var ThemeSettingsStore = class _ThemeSettingsStore {
129
126
  publicEnv;
130
127
  constructor(data) {
131
128
  let { theme, countries, schema: schema2, publicEnv } = data || {};
132
- if (import_react5.isBrowser && _ThemeSettingsStore.settings) {
129
+ if (import_react6.isBrowser && _ThemeSettingsStore.settings) {
133
130
  _ThemeSettingsStore.settings = {
134
131
  ...theme,
135
132
  ..._ThemeSettingsStore.settings
@@ -168,7 +165,7 @@ var ThemeSettingsStore = class _ThemeSettingsStore {
168
165
  };
169
166
  function useThemeSettings() {
170
167
  let themeSettingsStore = useThemeContext();
171
- let settings = (0, import_react4.useSyncExternalStore)(
168
+ let settings = (0, import_react5.useSyncExternalStore)(
172
169
  themeSettingsStore.subscribe,
173
170
  themeSettingsStore.getSnapshot,
174
171
  themeSettingsStore.getServerSnapshot
@@ -176,68 +173,83 @@ function useThemeSettings() {
176
173
  return settings;
177
174
  }
178
175
 
179
- // src/hooks/use-theme-context.ts
180
- function useThemeContext() {
181
- let themeContext = (0, import_react6.useContext)(ThemeProvider);
182
- return themeContext || new ThemeSettingsStore({ theme: {} });
176
+ // src/Effect.tsx
177
+ var import_react12 = require("react");
178
+
179
+ // src/hooks/use-pixel.ts
180
+ var import_react7 = require("react");
181
+ var import_react8 = require("@remix-run/react");
182
+ var fetchingKey = "";
183
+ function usePixel(context) {
184
+ let { projectId, pageId, weaverseHost, isDesignMode } = context;
185
+ let location = (0, import_react8.useLocation)();
186
+ (0, import_react7.useEffect)(() => {
187
+ if (isDesignMode || !projectId || !pageId || !weaverseHost)
188
+ return;
189
+ let currentKey = `${projectId}-${pageId}-${location.pathname}`;
190
+ if (fetchingKey === currentKey)
191
+ return;
192
+ fetchingKey = currentKey;
193
+ let url = `${weaverseHost}/api/public/px`;
194
+ let xhr = new XMLHttpRequest();
195
+ xhr.open("POST", url, true);
196
+ xhr.setRequestHeader("Content-Type", "application/json");
197
+ xhr.send(JSON.stringify({ projectId, pageId }));
198
+ }, [location]);
183
199
  }
184
200
 
185
201
  // src/hooks/use-studio.ts
202
+ var import_react9 = require("@remix-run/react");
203
+ var import_react10 = require("@weaverse/react");
204
+ var import_react11 = require("react");
186
205
  function useStudio(weaverse) {
187
- let { revalidate } = (0, import_react7.useRevalidator)();
188
- let navigate = (0, import_react7.useNavigate)();
206
+ let { revalidate } = (0, import_react9.useRevalidator)();
207
+ let { pathname, search } = (0, import_react9.useLocation)();
208
+ let navigate = (0, import_react9.useNavigate)();
189
209
  let themeSettingsStore = useThemeContext();
190
210
  let { isDesignMode, weaverseHost, weaverseVersion } = weaverse;
191
- let isStudio = import_react8.isIframe && isDesignMode && weaverseHost && weaverseVersion;
192
- (0, import_react9.useEffect)(() => {
193
- if (isStudio) {
211
+ (0, import_react11.useEffect)(() => {
212
+ if (isDesignMode) {
194
213
  weaverse.internal = {
195
214
  ...weaverse.internal,
196
215
  navigate,
197
216
  revalidate,
198
217
  themeSettingsStore
199
218
  };
200
- window.__weaverse = weaverse;
201
- if (window.weaverseStudio) {
202
- window.weaverseStudio.init(weaverse);
203
- } else {
204
- let studioSrc = `${weaverseHost}/static/studio/hydrogen/index.js?v=${weaverseVersion}`;
205
- (0, import_react8.loadScript)(studioSrc);
206
- }
219
+ let studioSrc = `${weaverseHost}/static/studio/hydrogen/index.js?v=${weaverseVersion}`;
220
+ (0, import_react10.loadScript)(studioSrc).then(() => {
221
+ window.weaverseStudio?.init(weaverse);
222
+ }).catch(console.error);
207
223
  }
208
- }, [weaverse.requestInfo]);
224
+ }, [pathname, search]);
209
225
  }
210
226
 
211
- // src/pixel.tsx
212
- var import_react10 = __toESM(require("react"));
213
- var Pixel = ({ baseUrl, projectId, pageId }) => {
214
- const url = `${baseUrl}/api/public/px?projectId=${projectId}&pageId=${pageId}`;
215
- return /* @__PURE__ */ import_react10.default.createElement("img", { src: url, alt: "weaverse pixel", style: { display: "none" } });
216
- };
217
- var WeaversePixel = ({ context }) => {
218
- let { projectId, pageId, weaverseHost, isDesignMode } = context;
219
- if (isDesignMode || !projectId || !pageId || !weaverseHost)
227
+ // src/Effect.tsx
228
+ var WeaverseEffect = (0, import_react12.memo)(
229
+ ({ context }) => {
230
+ useStudio(context);
231
+ usePixel(context);
220
232
  return null;
221
- return /* @__PURE__ */ import_react10.default.createElement(Pixel, { baseUrl: weaverseHost, projectId, pageId });
222
- };
233
+ }
234
+ );
223
235
 
224
236
  // src/WeaverseHydrogenRoot.tsx
225
- var WeaverseHydrogenRoot = (0, import_react13.memo)(
237
+ var WeaverseHydrogenRoot = (0, import_react15.memo)(
226
238
  ({
227
239
  errorComponent: ErrorComponent = FallbackError,
228
240
  components
229
241
  }) => {
230
- let loaderData = (0, import_react11.useLoaderData)();
242
+ let loaderData = (0, import_react13.useLoaderData)();
231
243
  let data = loaderData?.weaverseData;
232
244
  if (data) {
233
245
  if (data instanceof Promise) {
234
- return /* @__PURE__ */ import_react13.default.createElement(import_react_error_boundary.ErrorBoundary, { fallbackRender: ErrorComponent }, /* @__PURE__ */ import_react13.default.createElement(import_react13.Suspense, null, /* @__PURE__ */ import_react13.default.createElement(import_react11.Await, { resolve: data }, (resolvedData) => {
235
- return /* @__PURE__ */ import_react13.default.createElement(RenderRoot, { data: resolvedData, components });
246
+ return /* @__PURE__ */ import_react15.default.createElement(import_react_error_boundary.ErrorBoundary, { fallbackRender: ErrorComponent }, /* @__PURE__ */ import_react15.default.createElement(import_react15.Suspense, null, /* @__PURE__ */ import_react15.default.createElement(import_react13.Await, { resolve: data }, (resolvedData) => {
247
+ return /* @__PURE__ */ import_react15.default.createElement(RenderRoot, { data: resolvedData, components });
236
248
  })));
237
249
  }
238
- return /* @__PURE__ */ import_react13.default.createElement(RenderRoot, { data, components });
250
+ return /* @__PURE__ */ import_react15.default.createElement(RenderRoot, { data, components });
239
251
  }
240
- return /* @__PURE__ */ import_react13.default.createElement(
252
+ return /* @__PURE__ */ import_react15.default.createElement(
241
253
  ErrorComponent,
242
254
  {
243
255
  error: { message: "No Weaverse data return from route loader!" }
@@ -248,18 +260,17 @@ var WeaverseHydrogenRoot = (0, import_react13.memo)(
248
260
  function RenderRoot(props) {
249
261
  let { data, components } = props;
250
262
  let weaverse = createWeaverseInstance(data, components);
251
- useStudio(weaverse);
252
- return /* @__PURE__ */ import_react13.default.createElement(import_react13.default.Fragment, null, /* @__PURE__ */ import_react13.default.createElement(import_react12.WeaverseRoot, { context: weaverse }), /* @__PURE__ */ import_react13.default.createElement(WeaversePixel, { context: weaverse }));
263
+ return /* @__PURE__ */ import_react15.default.createElement(import_react15.default.Fragment, null, /* @__PURE__ */ import_react15.default.createElement(import_react14.WeaverseRoot, { context: weaverse }), /* @__PURE__ */ import_react15.default.createElement(WeaverseEffect, { context: weaverse }));
253
264
  }
254
265
  function withWeaverse(Component) {
255
266
  return (props) => {
256
- let loaderData = (0, import_react11.useRouteLoaderData)("root");
267
+ let loaderData = (0, import_react13.useRouteLoaderData)("root");
257
268
  let themeSettingsStore = new ThemeSettingsStore(loaderData?.weaverseTheme);
258
- return /* @__PURE__ */ import_react13.default.createElement(ThemeProvider.Provider, { value: themeSettingsStore }, /* @__PURE__ */ import_react13.default.createElement(Component, { ...props }));
269
+ return /* @__PURE__ */ import_react15.default.createElement(ThemeProvider.Provider, { value: themeSettingsStore }, /* @__PURE__ */ import_react15.default.createElement(Component, { ...props }));
259
270
  };
260
271
  }
261
272
  function FallbackError({ error }) {
262
- return /* @__PURE__ */ import_react13.default.createElement("div", null, error?.message || "An unexpected error occurred");
273
+ return /* @__PURE__ */ import_react15.default.createElement("div", null, error?.message || "An unexpected error occurred");
263
274
  }
264
275
 
265
276
  // src/weaverse-client.ts
@@ -270,7 +281,7 @@ var package_default = {
270
281
  name: "@weaverse/hydrogen",
271
282
  author: "Weaverse Team",
272
283
  description: "Components, hooks, and utilities for building Shopify Hydrogen websites with Weaverse",
273
- version: "2.7.4",
284
+ version: "2.8.1",
274
285
  license: "MIT",
275
286
  main: "dist/index.js",
276
287
  typings: "dist/index.d.ts",
@@ -308,7 +319,7 @@ var package_default = {
308
319
  singleQuote: true
309
320
  },
310
321
  dependencies: {
311
- "@weaverse/react": "2.7.4",
322
+ "@weaverse/react": "2.8.1",
312
323
  "react-error-boundary": "^4.0.11"
313
324
  },
314
325
  devDependencies: {
@@ -513,18 +524,19 @@ var WeaverseClient = class {
513
524
  strategy
514
525
  });
515
526
  }
527
+ if (payload?.error) {
528
+ throw new Error(payload?.error);
529
+ }
516
530
  let { page, project, pageAssignment } = payload;
517
- if (!page || !project || !pageAssignment) {
518
- throw new Error(
519
- // @ts-ignore
520
- payload?.error || "Invalid Weaverse project payload!"
521
- );
531
+ if (!project) {
532
+ throw new Error(`Weaverse project not found. Id: ${projectId}`);
533
+ }
534
+ if (!page) {
535
+ throw new Error(`No Weaverse page assigned to this url.`);
522
536
  }
523
537
  if (page?.items) {
524
538
  let items = page.items;
525
- page.items = await Promise.all(
526
- items.map((item) => this.execComponentLoader(item))
527
- );
539
+ page.items = await Promise.all(items.map(this.execComponentLoader));
528
540
  }
529
541
  let data = {
530
542
  page,
@@ -534,6 +546,7 @@ var WeaverseClient = class {
534
546
  ...basePageConfigs,
535
547
  requestInfo: {
536
548
  i18n: storefront.i18n,
549
+ // TODO: @hta218 - migrate to Remix hooks
537
550
  queries: getRequestQueries(request),
538
551
  pathname: new URL(request.url).pathname,
539
552
  search: new URL(request.url).search
@@ -550,7 +563,7 @@ var WeaverseClient = class {
550
563
  execComponentLoader = async (item) => {
551
564
  let { data = {}, type, id } = item;
552
565
  let schema2 = this.components.find(({ schema: schema3 }) => schema3?.type === type);
553
- let { loader } = schema2 || {};
566
+ let loader = schema2?.loader;
554
567
  if (loader && typeof loader === "function") {
555
568
  try {
556
569
  return {
@@ -579,12 +592,13 @@ function getSelectedProductOptions(request) {
579
592
  }
580
593
 
581
594
  // src/index.ts
582
- var WeaverseHydrogen = class extends import_react14.Weaverse {
595
+ var WeaverseHydrogen = class extends import_react16.Weaverse {
583
596
  platformType = "shopify-hydrogen";
584
597
  pageId;
585
598
  internal;
586
599
  requestInfo;
587
600
  constructor(params, components) {
601
+ console.log("\u{1F4BF} New WeaverseHydrogen", params);
588
602
  let { internal, pageId, requestInfo, ...coreParams } = params;
589
603
  super({ ...coreParams, ItemConstructor: WeaverseHydrogenItem });
590
604
  this.internal = internal;
@@ -595,7 +609,7 @@ var WeaverseHydrogen = class extends import_react14.Weaverse {
595
609
  }
596
610
  registerComponents = (components) => {
597
611
  components.forEach((comp) => {
598
- import_react14.Weaverse.registerElement({
612
+ import_react16.Weaverse.registerElement({
599
613
  type: comp?.schema?.type,
600
614
  Component: comp?.default,
601
615
  schema: comp?.schema,
@@ -604,7 +618,7 @@ var WeaverseHydrogen = class extends import_react14.Weaverse {
604
618
  });
605
619
  };
606
620
  };
607
- var WeaverseHydrogenItem = class extends import_react14.WeaverseItemStore {
621
+ var WeaverseHydrogenItem = class extends import_react16.WeaverseItemStore {
608
622
  constructor(initialData, weaverse) {
609
623
  super(initialData, weaverse);
610
624
  let { data, ...rest } = initialData;
package/dist/index.mjs CHANGED
@@ -37,7 +37,7 @@ var defaultComponents = [main_exports];
37
37
  // src/WeaverseHydrogenRoot.tsx
38
38
  import { Await, useLoaderData, useRouteLoaderData } from "@remix-run/react";
39
39
  import { WeaverseRoot } from "@weaverse/react";
40
- import React3, { memo, Suspense } from "react";
40
+ import React2, { memo as memo2, Suspense } from "react";
41
41
  import { ErrorBoundary } from "react-error-boundary";
42
42
 
43
43
  // src/context.ts
@@ -45,17 +45,13 @@ import { isBrowser } from "@weaverse/react";
45
45
  import { createContext } from "react";
46
46
  function createCachedWeaverseInstance(params, components) {
47
47
  if (isBrowser) {
48
- window.__weaverses = window.__weaverses || [];
49
- let weaverse = window.__weaverses.find((w) => {
50
- let { pathname } = w.requestInfo;
51
- return pathname === params.requestInfo.pathname;
52
- });
48
+ window.__weaverses = window.__weaverses || {};
49
+ let weaverse = window.__weaverses[params.pageId];
53
50
  if (!weaverse) {
54
51
  weaverse = new WeaverseHydrogen(params, components);
55
- window.__weaverses.push(weaverse);
52
+ window.__weaverses[params.pageId] = weaverse;
56
53
  } else if (weaverse.isDesignMode) {
57
- weaverse.requestInfo = params.requestInfo;
58
- weaverse.setProjectData(params.data);
54
+ window.weaverseStudio?.refresh(params);
59
55
  }
60
56
  return weaverse;
61
57
  }
@@ -76,17 +72,18 @@ function createWeaverseInstance(weaverseData, components) {
76
72
  var ThemeProvider = createContext(null);
77
73
  ThemeProvider.displayName = "WeaverseThemeProvider";
78
74
 
79
- // src/hooks/use-studio.ts
80
- import { useNavigate, useRevalidator } from "@remix-run/react";
81
- import { isIframe, loadScript } from "@weaverse/react";
82
- import { useEffect } from "react";
75
+ // src/hooks/use-theme-settings.ts
76
+ import { useSyncExternalStore } from "react";
77
+ import { isBrowser as isBrowser2 } from "@weaverse/react";
83
78
 
84
79
  // src/hooks/use-theme-context.ts
85
80
  import { useContext } from "react";
81
+ function useThemeContext() {
82
+ let themeContext = useContext(ThemeProvider);
83
+ return themeContext || new ThemeSettingsStore({ theme: {} });
84
+ }
86
85
 
87
86
  // src/hooks/use-theme-settings.ts
88
- import { useSyncExternalStore } from "react";
89
- import { isBrowser as isBrowser2 } from "@weaverse/react";
90
87
  var ThemeSettingsStore = class _ThemeSettingsStore {
91
88
  static settings = null;
92
89
  listeners = [];
@@ -142,53 +139,68 @@ function useThemeSettings() {
142
139
  return settings;
143
140
  }
144
141
 
145
- // src/hooks/use-theme-context.ts
146
- function useThemeContext() {
147
- let themeContext = useContext(ThemeProvider);
148
- return themeContext || new ThemeSettingsStore({ theme: {} });
142
+ // src/Effect.tsx
143
+ import { memo } from "react";
144
+
145
+ // src/hooks/use-pixel.ts
146
+ import { useEffect } from "react";
147
+ import { useLocation } from "@remix-run/react";
148
+ var fetchingKey = "";
149
+ function usePixel(context) {
150
+ let { projectId, pageId, weaverseHost, isDesignMode } = context;
151
+ let location = useLocation();
152
+ useEffect(() => {
153
+ if (isDesignMode || !projectId || !pageId || !weaverseHost)
154
+ return;
155
+ let currentKey = `${projectId}-${pageId}-${location.pathname}`;
156
+ if (fetchingKey === currentKey)
157
+ return;
158
+ fetchingKey = currentKey;
159
+ let url = `${weaverseHost}/api/public/px`;
160
+ let xhr = new XMLHttpRequest();
161
+ xhr.open("POST", url, true);
162
+ xhr.setRequestHeader("Content-Type", "application/json");
163
+ xhr.send(JSON.stringify({ projectId, pageId }));
164
+ }, [location]);
149
165
  }
150
166
 
151
167
  // src/hooks/use-studio.ts
168
+ import { useLocation as useLocation2, useNavigate, useRevalidator } from "@remix-run/react";
169
+ import { loadScript } from "@weaverse/react";
170
+ import { useEffect as useEffect2 } from "react";
152
171
  function useStudio(weaverse) {
153
172
  let { revalidate } = useRevalidator();
173
+ let { pathname, search } = useLocation2();
154
174
  let navigate = useNavigate();
155
175
  let themeSettingsStore = useThemeContext();
156
176
  let { isDesignMode, weaverseHost, weaverseVersion } = weaverse;
157
- let isStudio = isIframe && isDesignMode && weaverseHost && weaverseVersion;
158
- useEffect(() => {
159
- if (isStudio) {
177
+ useEffect2(() => {
178
+ if (isDesignMode) {
160
179
  weaverse.internal = {
161
180
  ...weaverse.internal,
162
181
  navigate,
163
182
  revalidate,
164
183
  themeSettingsStore
165
184
  };
166
- window.__weaverse = weaverse;
167
- if (window.weaverseStudio) {
168
- window.weaverseStudio.init(weaverse);
169
- } else {
170
- let studioSrc = `${weaverseHost}/static/studio/hydrogen/index.js?v=${weaverseVersion}`;
171
- loadScript(studioSrc);
172
- }
185
+ let studioSrc = `${weaverseHost}/static/studio/hydrogen/index.js?v=${weaverseVersion}`;
186
+ loadScript(studioSrc).then(() => {
187
+ window.weaverseStudio?.init(weaverse);
188
+ }).catch(console.error);
173
189
  }
174
- }, [weaverse.requestInfo]);
190
+ }, [pathname, search]);
175
191
  }
176
192
 
177
- // src/pixel.tsx
178
- import React2 from "react";
179
- var Pixel = ({ baseUrl, projectId, pageId }) => {
180
- const url = `${baseUrl}/api/public/px?projectId=${projectId}&pageId=${pageId}`;
181
- return /* @__PURE__ */ React2.createElement("img", { src: url, alt: "weaverse pixel", style: { display: "none" } });
182
- };
183
- var WeaversePixel = ({ context }) => {
184
- let { projectId, pageId, weaverseHost, isDesignMode } = context;
185
- if (isDesignMode || !projectId || !pageId || !weaverseHost)
193
+ // src/Effect.tsx
194
+ var WeaverseEffect = memo(
195
+ ({ context }) => {
196
+ useStudio(context);
197
+ usePixel(context);
186
198
  return null;
187
- return /* @__PURE__ */ React2.createElement(Pixel, { baseUrl: weaverseHost, projectId, pageId });
188
- };
199
+ }
200
+ );
189
201
 
190
202
  // src/WeaverseHydrogenRoot.tsx
191
- var WeaverseHydrogenRoot = memo(
203
+ var WeaverseHydrogenRoot = memo2(
192
204
  ({
193
205
  errorComponent: ErrorComponent = FallbackError,
194
206
  components
@@ -197,13 +209,13 @@ var WeaverseHydrogenRoot = memo(
197
209
  let data = loaderData?.weaverseData;
198
210
  if (data) {
199
211
  if (data instanceof Promise) {
200
- return /* @__PURE__ */ React3.createElement(ErrorBoundary, { fallbackRender: ErrorComponent }, /* @__PURE__ */ React3.createElement(Suspense, null, /* @__PURE__ */ React3.createElement(Await, { resolve: data }, (resolvedData) => {
201
- return /* @__PURE__ */ React3.createElement(RenderRoot, { data: resolvedData, components });
212
+ return /* @__PURE__ */ React2.createElement(ErrorBoundary, { fallbackRender: ErrorComponent }, /* @__PURE__ */ React2.createElement(Suspense, null, /* @__PURE__ */ React2.createElement(Await, { resolve: data }, (resolvedData) => {
213
+ return /* @__PURE__ */ React2.createElement(RenderRoot, { data: resolvedData, components });
202
214
  })));
203
215
  }
204
- return /* @__PURE__ */ React3.createElement(RenderRoot, { data, components });
216
+ return /* @__PURE__ */ React2.createElement(RenderRoot, { data, components });
205
217
  }
206
- return /* @__PURE__ */ React3.createElement(
218
+ return /* @__PURE__ */ React2.createElement(
207
219
  ErrorComponent,
208
220
  {
209
221
  error: { message: "No Weaverse data return from route loader!" }
@@ -214,18 +226,17 @@ var WeaverseHydrogenRoot = memo(
214
226
  function RenderRoot(props) {
215
227
  let { data, components } = props;
216
228
  let weaverse = createWeaverseInstance(data, components);
217
- useStudio(weaverse);
218
- return /* @__PURE__ */ React3.createElement(React3.Fragment, null, /* @__PURE__ */ React3.createElement(WeaverseRoot, { context: weaverse }), /* @__PURE__ */ React3.createElement(WeaversePixel, { context: weaverse }));
229
+ return /* @__PURE__ */ React2.createElement(React2.Fragment, null, /* @__PURE__ */ React2.createElement(WeaverseRoot, { context: weaverse }), /* @__PURE__ */ React2.createElement(WeaverseEffect, { context: weaverse }));
219
230
  }
220
231
  function withWeaverse(Component) {
221
232
  return (props) => {
222
233
  let loaderData = useRouteLoaderData("root");
223
234
  let themeSettingsStore = new ThemeSettingsStore(loaderData?.weaverseTheme);
224
- return /* @__PURE__ */ React3.createElement(ThemeProvider.Provider, { value: themeSettingsStore }, /* @__PURE__ */ React3.createElement(Component, { ...props }));
235
+ return /* @__PURE__ */ React2.createElement(ThemeProvider.Provider, { value: themeSettingsStore }, /* @__PURE__ */ React2.createElement(Component, { ...props }));
225
236
  };
226
237
  }
227
238
  function FallbackError({ error }) {
228
- return /* @__PURE__ */ React3.createElement("div", null, error?.message || "An unexpected error occurred");
239
+ return /* @__PURE__ */ React2.createElement("div", null, error?.message || "An unexpected error occurred");
229
240
  }
230
241
 
231
242
  // src/weaverse-client.ts
@@ -236,7 +247,7 @@ var package_default = {
236
247
  name: "@weaverse/hydrogen",
237
248
  author: "Weaverse Team",
238
249
  description: "Components, hooks, and utilities for building Shopify Hydrogen websites with Weaverse",
239
- version: "2.7.4",
250
+ version: "2.8.1",
240
251
  license: "MIT",
241
252
  main: "dist/index.js",
242
253
  typings: "dist/index.d.ts",
@@ -274,7 +285,7 @@ var package_default = {
274
285
  singleQuote: true
275
286
  },
276
287
  dependencies: {
277
- "@weaverse/react": "2.7.4",
288
+ "@weaverse/react": "2.8.1",
278
289
  "react-error-boundary": "^4.0.11"
279
290
  },
280
291
  devDependencies: {
@@ -479,18 +490,19 @@ var WeaverseClient = class {
479
490
  strategy
480
491
  });
481
492
  }
493
+ if (payload?.error) {
494
+ throw new Error(payload?.error);
495
+ }
482
496
  let { page, project, pageAssignment } = payload;
483
- if (!page || !project || !pageAssignment) {
484
- throw new Error(
485
- // @ts-ignore
486
- payload?.error || "Invalid Weaverse project payload!"
487
- );
497
+ if (!project) {
498
+ throw new Error(`Weaverse project not found. Id: ${projectId}`);
499
+ }
500
+ if (!page) {
501
+ throw new Error(`No Weaverse page assigned to this url.`);
488
502
  }
489
503
  if (page?.items) {
490
504
  let items = page.items;
491
- page.items = await Promise.all(
492
- items.map((item) => this.execComponentLoader(item))
493
- );
505
+ page.items = await Promise.all(items.map(this.execComponentLoader));
494
506
  }
495
507
  let data = {
496
508
  page,
@@ -500,6 +512,7 @@ var WeaverseClient = class {
500
512
  ...basePageConfigs,
501
513
  requestInfo: {
502
514
  i18n: storefront.i18n,
515
+ // TODO: @hta218 - migrate to Remix hooks
503
516
  queries: getRequestQueries(request),
504
517
  pathname: new URL(request.url).pathname,
505
518
  search: new URL(request.url).search
@@ -516,7 +529,7 @@ var WeaverseClient = class {
516
529
  execComponentLoader = async (item) => {
517
530
  let { data = {}, type, id } = item;
518
531
  let schema2 = this.components.find(({ schema: schema3 }) => schema3?.type === type);
519
- let { loader } = schema2 || {};
532
+ let loader = schema2?.loader;
520
533
  if (loader && typeof loader === "function") {
521
534
  try {
522
535
  return {
@@ -551,6 +564,7 @@ var WeaverseHydrogen = class extends Weaverse {
551
564
  internal;
552
565
  requestInfo;
553
566
  constructor(params, components) {
567
+ console.log("\u{1F4BF} New WeaverseHydrogen", params);
554
568
  let { internal, pageId, requestInfo, ...coreParams } = params;
555
569
  super({ ...coreParams, ItemConstructor: WeaverseHydrogenItem });
556
570
  this.internal = internal;
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@weaverse/hydrogen",
3
3
  "author": "Weaverse Team",
4
4
  "description": "Components, hooks, and utilities for building Shopify Hydrogen websites with Weaverse",
5
- "version": "2.7.4",
5
+ "version": "2.8.1",
6
6
  "license": "MIT",
7
7
  "main": "dist/index.js",
8
8
  "typings": "dist/index.d.ts",
@@ -40,7 +40,7 @@
40
40
  "singleQuote": true
41
41
  },
42
42
  "dependencies": {
43
- "@weaverse/react": "2.7.4",
43
+ "@weaverse/react": "2.8.1",
44
44
  "react-error-boundary": "^4.0.11"
45
45
  },
46
46
  "devDependencies": {