@weaverse/hydrogen 2.8.0 → 2.8.2

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
@@ -1,7 +1,7 @@
1
1
  import { ElementData, ElementSchema, BasicInput as BasicInput$1, WeaverseElement, WeaverseCoreParams, WeaverseProjectDataType, WeaverseResourcePickerData, Weaverse, PlatformTypeEnum, WeaverseItemStore } from '@weaverse/react';
2
2
  export { InputType, PositionInputValue, WeaverseImage, useChildInstances, useItemInstance, useParentInstance, useWeaverse } from '@weaverse/react';
3
3
  import { NavigateFunction } from '@remix-run/react';
4
- import { createWithCache, Storefront } from '@shopify/hydrogen';
4
+ import { createWithCache, I18nBase, Storefront } from '@shopify/hydrogen';
5
5
  import { LanguageCode, CountryCode, CurrencyCode } from '@shopify/hydrogen/storefront-api-types';
6
6
  import { LoaderFunctionArgs, AppLoadContext } from '@shopify/remix-oxygen';
7
7
  import React, { ForwardRefExoticComponent } from 'react';
@@ -136,7 +136,7 @@ type WeaverseLoaderRequestInfo = {
136
136
  queries: {
137
137
  [key: string]: string | boolean;
138
138
  };
139
- i18n: I18nLocale;
139
+ i18n: I18nBase;
140
140
  };
141
141
  type WeaverseStorefrontData = {
142
142
  id?: string;
@@ -264,7 +264,7 @@ type LoadPageParams = PageAssignmentParams & {
264
264
  type FetchProjectRequestBody = {
265
265
  projectId: string;
266
266
  url: string;
267
- i18n?: I18nLocale;
267
+ i18n?: I18nBase;
268
268
  params?: PageAssignmentParams;
269
269
  isDesignMode?: boolean;
270
270
  };
@@ -277,16 +277,21 @@ type FetchProjectPayload = {
277
277
  type HydrogenThemeEnv = {
278
278
  WEAVERSE_PROJECT_ID: string;
279
279
  WEAVERSE_API_KEY: string;
280
- WEAVERSE_HOST: string;
281
- PUBLIC_STORE_DOMAIN: string;
282
- PUBLIC_STOREFRONT_API_TOKEN: string;
280
+ WEAVERSE_HOST?: string;
281
+ PUBLIC_STORE_DOMAIN?: string;
282
+ PUBLIC_STOREFRONT_API_TOKEN?: string;
283
+ SESSION_SECRET?: string;
284
+ PRIVATE_STOREFRONT_API_TOKEN: string;
285
+ PUBLIC_STOREFRONT_ID: string;
286
+ PUBLIC_CUSTOMER_ACCOUNT_API_CLIENT_ID: string;
287
+ PUBLIC_CUSTOMER_ACCOUNT_API_URL: string;
283
288
  };
284
289
  type WeaverseClientArgs = {
285
290
  request: Request;
286
291
  cache: Cache;
287
292
  waitUntil: ExecutionContext['waitUntil'];
288
293
  env: HydrogenThemeEnv;
289
- storefront: Storefront<I18nLocale>;
294
+ storefront: Storefront<I18nBase>;
290
295
  components: HydrogenComponent[];
291
296
  countries?: Localizations;
292
297
  themeSchema: HydrogenThemeSchema;
package/dist/index.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import { ElementData, ElementSchema, BasicInput as BasicInput$1, WeaverseElement, WeaverseCoreParams, WeaverseProjectDataType, WeaverseResourcePickerData, Weaverse, PlatformTypeEnum, WeaverseItemStore } from '@weaverse/react';
2
2
  export { InputType, PositionInputValue, WeaverseImage, useChildInstances, useItemInstance, useParentInstance, useWeaverse } from '@weaverse/react';
3
3
  import { NavigateFunction } from '@remix-run/react';
4
- import { createWithCache, Storefront } from '@shopify/hydrogen';
4
+ import { createWithCache, I18nBase, Storefront } from '@shopify/hydrogen';
5
5
  import { LanguageCode, CountryCode, CurrencyCode } from '@shopify/hydrogen/storefront-api-types';
6
6
  import { LoaderFunctionArgs, AppLoadContext } from '@shopify/remix-oxygen';
7
7
  import React, { ForwardRefExoticComponent } from 'react';
@@ -136,7 +136,7 @@ type WeaverseLoaderRequestInfo = {
136
136
  queries: {
137
137
  [key: string]: string | boolean;
138
138
  };
139
- i18n: I18nLocale;
139
+ i18n: I18nBase;
140
140
  };
141
141
  type WeaverseStorefrontData = {
142
142
  id?: string;
@@ -264,7 +264,7 @@ type LoadPageParams = PageAssignmentParams & {
264
264
  type FetchProjectRequestBody = {
265
265
  projectId: string;
266
266
  url: string;
267
- i18n?: I18nLocale;
267
+ i18n?: I18nBase;
268
268
  params?: PageAssignmentParams;
269
269
  isDesignMode?: boolean;
270
270
  };
@@ -277,16 +277,21 @@ type FetchProjectPayload = {
277
277
  type HydrogenThemeEnv = {
278
278
  WEAVERSE_PROJECT_ID: string;
279
279
  WEAVERSE_API_KEY: string;
280
- WEAVERSE_HOST: string;
281
- PUBLIC_STORE_DOMAIN: string;
282
- PUBLIC_STOREFRONT_API_TOKEN: string;
280
+ WEAVERSE_HOST?: string;
281
+ PUBLIC_STORE_DOMAIN?: string;
282
+ PUBLIC_STOREFRONT_API_TOKEN?: string;
283
+ SESSION_SECRET?: string;
284
+ PRIVATE_STOREFRONT_API_TOKEN: string;
285
+ PUBLIC_STOREFRONT_ID: string;
286
+ PUBLIC_CUSTOMER_ACCOUNT_API_CLIENT_ID: string;
287
+ PUBLIC_CUSTOMER_ACCOUNT_API_URL: string;
283
288
  };
284
289
  type WeaverseClientArgs = {
285
290
  request: Request;
286
291
  cache: Cache;
287
292
  waitUntil: ExecutionContext['waitUntil'];
288
293
  env: HydrogenThemeEnv;
289
- storefront: Storefront<I18nLocale>;
294
+ storefront: Storefront<I18nBase>;
290
295
  components: HydrogenComponent[];
291
296
  countries?: Localizations;
292
297
  themeSchema: HydrogenThemeSchema;
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
@@ -106,17 +106,18 @@ function createWeaverseInstance(weaverseData, components) {
106
106
  var ThemeProvider = (0, import_react3.createContext)(null);
107
107
  ThemeProvider.displayName = "WeaverseThemeProvider";
108
108
 
109
- // src/hooks/use-studio.ts
110
- var import_react7 = require("@remix-run/react");
111
- var import_react8 = require("@weaverse/react");
112
- 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");
113
112
 
114
113
  // src/hooks/use-theme-context.ts
115
- 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
+ }
116
119
 
117
120
  // src/hooks/use-theme-settings.ts
118
- var import_react4 = require("react");
119
- var import_react5 = require("@weaverse/react");
120
121
  var ThemeSettingsStore = class _ThemeSettingsStore {
121
122
  static settings = null;
122
123
  listeners = [];
@@ -125,7 +126,7 @@ var ThemeSettingsStore = class _ThemeSettingsStore {
125
126
  publicEnv;
126
127
  constructor(data) {
127
128
  let { theme, countries, schema: schema2, publicEnv } = data || {};
128
- if (import_react5.isBrowser && _ThemeSettingsStore.settings) {
129
+ if (import_react6.isBrowser && _ThemeSettingsStore.settings) {
129
130
  _ThemeSettingsStore.settings = {
130
131
  ...theme,
131
132
  ..._ThemeSettingsStore.settings
@@ -164,7 +165,7 @@ var ThemeSettingsStore = class _ThemeSettingsStore {
164
165
  };
165
166
  function useThemeSettings() {
166
167
  let themeSettingsStore = useThemeContext();
167
- let settings = (0, import_react4.useSyncExternalStore)(
168
+ let settings = (0, import_react5.useSyncExternalStore)(
168
169
  themeSettingsStore.subscribe,
169
170
  themeSettingsStore.getSnapshot,
170
171
  themeSettingsStore.getServerSnapshot
@@ -172,20 +173,42 @@ function useThemeSettings() {
172
173
  return settings;
173
174
  }
174
175
 
175
- // src/hooks/use-theme-context.ts
176
- function useThemeContext() {
177
- let themeContext = (0, import_react6.useContext)(ThemeProvider);
178
- 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]);
179
199
  }
180
200
 
181
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");
182
205
  function useStudio(weaverse) {
183
- let { revalidate } = (0, import_react7.useRevalidator)();
184
- let { pathname, search } = (0, import_react7.useLocation)();
185
- 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)();
186
209
  let themeSettingsStore = useThemeContext();
187
210
  let { isDesignMode, weaverseHost, weaverseVersion } = weaverse;
188
- (0, import_react9.useEffect)(() => {
211
+ (0, import_react11.useEffect)(() => {
189
212
  if (isDesignMode) {
190
213
  weaverse.internal = {
191
214
  ...weaverse.internal,
@@ -194,43 +217,39 @@ function useStudio(weaverse) {
194
217
  themeSettingsStore
195
218
  };
196
219
  let studioSrc = `${weaverseHost}/static/studio/hydrogen/index.js?v=${weaverseVersion}`;
197
- (0, import_react8.loadScript)(studioSrc).then(() => {
220
+ (0, import_react10.loadScript)(studioSrc).then(() => {
198
221
  window.weaverseStudio?.init(weaverse);
199
222
  }).catch(console.error);
200
223
  }
201
224
  }, [pathname, search]);
202
225
  }
203
226
 
204
- // src/pixel.tsx
205
- var import_react10 = __toESM(require("react"));
206
- function Pixel({ baseUrl, projectId, pageId }) {
207
- const url = `${baseUrl}/api/public/px?projectId=${projectId}&pageId=${pageId}`;
208
- return /* @__PURE__ */ import_react10.default.createElement("img", { src: url, alt: "weaverse pixel", style: { display: "none" } });
209
- }
210
- function WeaversePixel({ context }) {
211
- let { projectId, pageId, weaverseHost, isDesignMode } = context;
212
- if (isDesignMode || !projectId || !pageId || !weaverseHost)
227
+ // src/Effect.tsx
228
+ var WeaverseEffect = (0, import_react12.memo)(
229
+ ({ context }) => {
230
+ useStudio(context);
231
+ usePixel(context);
213
232
  return null;
214
- return /* @__PURE__ */ import_react10.default.createElement(Pixel, { baseUrl: weaverseHost, projectId, pageId });
215
- }
233
+ }
234
+ );
216
235
 
217
236
  // src/WeaverseHydrogenRoot.tsx
218
- var WeaverseHydrogenRoot = (0, import_react13.memo)(
237
+ var WeaverseHydrogenRoot = (0, import_react15.memo)(
219
238
  ({
220
239
  errorComponent: ErrorComponent = FallbackError,
221
240
  components
222
241
  }) => {
223
- let loaderData = (0, import_react11.useLoaderData)();
242
+ let loaderData = (0, import_react13.useLoaderData)();
224
243
  let data = loaderData?.weaverseData;
225
244
  if (data) {
226
245
  if (data instanceof Promise) {
227
- 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) => {
228
- 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 });
229
248
  })));
230
249
  }
231
- return /* @__PURE__ */ import_react13.default.createElement(RenderRoot, { data, components });
250
+ return /* @__PURE__ */ import_react15.default.createElement(RenderRoot, { data, components });
232
251
  }
233
- return /* @__PURE__ */ import_react13.default.createElement(
252
+ return /* @__PURE__ */ import_react15.default.createElement(
234
253
  ErrorComponent,
235
254
  {
236
255
  error: { message: "No Weaverse data return from route loader!" }
@@ -241,18 +260,17 @@ var WeaverseHydrogenRoot = (0, import_react13.memo)(
241
260
  function RenderRoot(props) {
242
261
  let { data, components } = props;
243
262
  let weaverse = createWeaverseInstance(data, components);
244
- useStudio(weaverse);
245
- 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 }));
246
264
  }
247
265
  function withWeaverse(Component) {
248
266
  return (props) => {
249
- let loaderData = (0, import_react11.useRouteLoaderData)("root");
267
+ let loaderData = (0, import_react13.useRouteLoaderData)("root");
250
268
  let themeSettingsStore = new ThemeSettingsStore(loaderData?.weaverseTheme);
251
- 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 }));
252
270
  };
253
271
  }
254
272
  function FallbackError({ error }) {
255
- 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");
256
274
  }
257
275
 
258
276
  // src/weaverse-client.ts
@@ -263,7 +281,7 @@ var package_default = {
263
281
  name: "@weaverse/hydrogen",
264
282
  author: "Weaverse Team",
265
283
  description: "Components, hooks, and utilities for building Shopify Hydrogen websites with Weaverse",
266
- version: "2.8.0",
284
+ version: "2.8.2",
267
285
  license: "MIT",
268
286
  main: "dist/index.js",
269
287
  typings: "dist/index.d.ts",
@@ -301,7 +319,7 @@ var package_default = {
301
319
  singleQuote: true
302
320
  },
303
321
  dependencies: {
304
- "@weaverse/react": "2.8.0",
322
+ "@weaverse/react": "2.8.2",
305
323
  "react-error-boundary": "^4.0.11"
306
324
  },
307
325
  devDependencies: {
@@ -344,8 +362,8 @@ function getWeaverseConfigs(request, env) {
344
362
  weaverseVersion: weaverseVersion || "",
345
363
  isDesignMode: isDesignMode || false,
346
364
  publicEnv: {
347
- PUBLIC_STORE_DOMAIN,
348
- PUBLIC_STOREFRONT_API_TOKEN
365
+ PUBLIC_STORE_DOMAIN: PUBLIC_STORE_DOMAIN || "",
366
+ PUBLIC_STOREFRONT_API_TOKEN: PUBLIC_STOREFRONT_API_TOKEN || ""
349
367
  }
350
368
  };
351
369
  }
@@ -518,9 +536,7 @@ var WeaverseClient = class {
518
536
  }
519
537
  if (page?.items) {
520
538
  let items = page.items;
521
- page.items = await Promise.all(
522
- items.map((item) => this.execComponentLoader(item))
523
- );
539
+ page.items = await Promise.all(items.map(this.execComponentLoader));
524
540
  }
525
541
  let data = {
526
542
  page,
@@ -530,6 +546,7 @@ var WeaverseClient = class {
530
546
  ...basePageConfigs,
531
547
  requestInfo: {
532
548
  i18n: storefront.i18n,
549
+ // TODO: @hta218 - migrate to Remix hooks
533
550
  queries: getRequestQueries(request),
534
551
  pathname: new URL(request.url).pathname,
535
552
  search: new URL(request.url).search
@@ -546,7 +563,7 @@ var WeaverseClient = class {
546
563
  execComponentLoader = async (item) => {
547
564
  let { data = {}, type, id } = item;
548
565
  let schema2 = this.components.find(({ schema: schema3 }) => schema3?.type === type);
549
- let { loader } = schema2 || {};
566
+ let loader = schema2?.loader;
550
567
  if (loader && typeof loader === "function") {
551
568
  try {
552
569
  return {
@@ -575,7 +592,7 @@ function getSelectedProductOptions(request) {
575
592
  }
576
593
 
577
594
  // src/index.ts
578
- var WeaverseHydrogen = class extends import_react14.Weaverse {
595
+ var WeaverseHydrogen = class extends import_react16.Weaverse {
579
596
  platformType = "shopify-hydrogen";
580
597
  pageId;
581
598
  internal;
@@ -592,7 +609,7 @@ var WeaverseHydrogen = class extends import_react14.Weaverse {
592
609
  }
593
610
  registerComponents = (components) => {
594
611
  components.forEach((comp) => {
595
- import_react14.Weaverse.registerElement({
612
+ import_react16.Weaverse.registerElement({
596
613
  type: comp?.schema?.type,
597
614
  Component: comp?.default,
598
615
  schema: comp?.schema,
@@ -601,7 +618,7 @@ var WeaverseHydrogen = class extends import_react14.Weaverse {
601
618
  });
602
619
  };
603
620
  };
604
- var WeaverseHydrogenItem = class extends import_react14.WeaverseItemStore {
621
+ var WeaverseHydrogenItem = class extends import_react16.WeaverseItemStore {
605
622
  constructor(initialData, weaverse) {
606
623
  super(initialData, weaverse);
607
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
@@ -72,17 +72,18 @@ function createWeaverseInstance(weaverseData, components) {
72
72
  var ThemeProvider = createContext(null);
73
73
  ThemeProvider.displayName = "WeaverseThemeProvider";
74
74
 
75
- // src/hooks/use-studio.ts
76
- import { useLocation, useNavigate, useRevalidator } from "@remix-run/react";
77
- import { loadScript } from "@weaverse/react";
78
- import { useEffect } from "react";
75
+ // src/hooks/use-theme-settings.ts
76
+ import { useSyncExternalStore } from "react";
77
+ import { isBrowser as isBrowser2 } from "@weaverse/react";
79
78
 
80
79
  // src/hooks/use-theme-context.ts
81
80
  import { useContext } from "react";
81
+ function useThemeContext() {
82
+ let themeContext = useContext(ThemeProvider);
83
+ return themeContext || new ThemeSettingsStore({ theme: {} });
84
+ }
82
85
 
83
86
  // src/hooks/use-theme-settings.ts
84
- import { useSyncExternalStore } from "react";
85
- import { isBrowser as isBrowser2 } from "@weaverse/react";
86
87
  var ThemeSettingsStore = class _ThemeSettingsStore {
87
88
  static settings = null;
88
89
  listeners = [];
@@ -138,20 +139,42 @@ function useThemeSettings() {
138
139
  return settings;
139
140
  }
140
141
 
141
- // src/hooks/use-theme-context.ts
142
- function useThemeContext() {
143
- let themeContext = useContext(ThemeProvider);
144
- 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]);
145
165
  }
146
166
 
147
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";
148
171
  function useStudio(weaverse) {
149
172
  let { revalidate } = useRevalidator();
150
- let { pathname, search } = useLocation();
173
+ let { pathname, search } = useLocation2();
151
174
  let navigate = useNavigate();
152
175
  let themeSettingsStore = useThemeContext();
153
176
  let { isDesignMode, weaverseHost, weaverseVersion } = weaverse;
154
- useEffect(() => {
177
+ useEffect2(() => {
155
178
  if (isDesignMode) {
156
179
  weaverse.internal = {
157
180
  ...weaverse.internal,
@@ -167,21 +190,17 @@ function useStudio(weaverse) {
167
190
  }, [pathname, search]);
168
191
  }
169
192
 
170
- // src/pixel.tsx
171
- import React2 from "react";
172
- function Pixel({ baseUrl, projectId, pageId }) {
173
- const url = `${baseUrl}/api/public/px?projectId=${projectId}&pageId=${pageId}`;
174
- return /* @__PURE__ */ React2.createElement("img", { src: url, alt: "weaverse pixel", style: { display: "none" } });
175
- }
176
- function WeaversePixel({ context }) {
177
- let { projectId, pageId, weaverseHost, isDesignMode } = context;
178
- if (isDesignMode || !projectId || !pageId || !weaverseHost)
193
+ // src/Effect.tsx
194
+ var WeaverseEffect = memo(
195
+ ({ context }) => {
196
+ useStudio(context);
197
+ usePixel(context);
179
198
  return null;
180
- return /* @__PURE__ */ React2.createElement(Pixel, { baseUrl: weaverseHost, projectId, pageId });
181
- }
199
+ }
200
+ );
182
201
 
183
202
  // src/WeaverseHydrogenRoot.tsx
184
- var WeaverseHydrogenRoot = memo(
203
+ var WeaverseHydrogenRoot = memo2(
185
204
  ({
186
205
  errorComponent: ErrorComponent = FallbackError,
187
206
  components
@@ -190,13 +209,13 @@ var WeaverseHydrogenRoot = memo(
190
209
  let data = loaderData?.weaverseData;
191
210
  if (data) {
192
211
  if (data instanceof Promise) {
193
- return /* @__PURE__ */ React3.createElement(ErrorBoundary, { fallbackRender: ErrorComponent }, /* @__PURE__ */ React3.createElement(Suspense, null, /* @__PURE__ */ React3.createElement(Await, { resolve: data }, (resolvedData) => {
194
- 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 });
195
214
  })));
196
215
  }
197
- return /* @__PURE__ */ React3.createElement(RenderRoot, { data, components });
216
+ return /* @__PURE__ */ React2.createElement(RenderRoot, { data, components });
198
217
  }
199
- return /* @__PURE__ */ React3.createElement(
218
+ return /* @__PURE__ */ React2.createElement(
200
219
  ErrorComponent,
201
220
  {
202
221
  error: { message: "No Weaverse data return from route loader!" }
@@ -207,18 +226,17 @@ var WeaverseHydrogenRoot = memo(
207
226
  function RenderRoot(props) {
208
227
  let { data, components } = props;
209
228
  let weaverse = createWeaverseInstance(data, components);
210
- useStudio(weaverse);
211
- 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 }));
212
230
  }
213
231
  function withWeaverse(Component) {
214
232
  return (props) => {
215
233
  let loaderData = useRouteLoaderData("root");
216
234
  let themeSettingsStore = new ThemeSettingsStore(loaderData?.weaverseTheme);
217
- 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 }));
218
236
  };
219
237
  }
220
238
  function FallbackError({ error }) {
221
- 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");
222
240
  }
223
241
 
224
242
  // src/weaverse-client.ts
@@ -229,7 +247,7 @@ var package_default = {
229
247
  name: "@weaverse/hydrogen",
230
248
  author: "Weaverse Team",
231
249
  description: "Components, hooks, and utilities for building Shopify Hydrogen websites with Weaverse",
232
- version: "2.8.0",
250
+ version: "2.8.2",
233
251
  license: "MIT",
234
252
  main: "dist/index.js",
235
253
  typings: "dist/index.d.ts",
@@ -267,7 +285,7 @@ var package_default = {
267
285
  singleQuote: true
268
286
  },
269
287
  dependencies: {
270
- "@weaverse/react": "2.8.0",
288
+ "@weaverse/react": "2.8.2",
271
289
  "react-error-boundary": "^4.0.11"
272
290
  },
273
291
  devDependencies: {
@@ -310,8 +328,8 @@ function getWeaverseConfigs(request, env) {
310
328
  weaverseVersion: weaverseVersion || "",
311
329
  isDesignMode: isDesignMode || false,
312
330
  publicEnv: {
313
- PUBLIC_STORE_DOMAIN,
314
- PUBLIC_STOREFRONT_API_TOKEN
331
+ PUBLIC_STORE_DOMAIN: PUBLIC_STORE_DOMAIN || "",
332
+ PUBLIC_STOREFRONT_API_TOKEN: PUBLIC_STOREFRONT_API_TOKEN || ""
315
333
  }
316
334
  };
317
335
  }
@@ -484,9 +502,7 @@ var WeaverseClient = class {
484
502
  }
485
503
  if (page?.items) {
486
504
  let items = page.items;
487
- page.items = await Promise.all(
488
- items.map((item) => this.execComponentLoader(item))
489
- );
505
+ page.items = await Promise.all(items.map(this.execComponentLoader));
490
506
  }
491
507
  let data = {
492
508
  page,
@@ -496,6 +512,7 @@ var WeaverseClient = class {
496
512
  ...basePageConfigs,
497
513
  requestInfo: {
498
514
  i18n: storefront.i18n,
515
+ // TODO: @hta218 - migrate to Remix hooks
499
516
  queries: getRequestQueries(request),
500
517
  pathname: new URL(request.url).pathname,
501
518
  search: new URL(request.url).search
@@ -512,7 +529,7 @@ var WeaverseClient = class {
512
529
  execComponentLoader = async (item) => {
513
530
  let { data = {}, type, id } = item;
514
531
  let schema2 = this.components.find(({ schema: schema3 }) => schema3?.type === type);
515
- let { loader } = schema2 || {};
532
+ let loader = schema2?.loader;
516
533
  if (loader && typeof loader === "function") {
517
534
  try {
518
535
  return {
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.8.0",
5
+ "version": "2.8.2",
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.8.0",
43
+ "@weaverse/react": "2.8.2",
44
44
  "react-error-boundary": "^4.0.11"
45
45
  },
46
46
  "devDependencies": {