@weaverse/react 0.7.20 → 0.7.21

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.ts CHANGED
@@ -93,7 +93,7 @@ interface CountdownElementProps extends WeaverseElementProps {
93
93
  }
94
94
  declare type TimerBlockProps = {
95
95
  label: string;
96
- value: number;
96
+ value: string | number;
97
97
  };
98
98
  interface InstagramElementProps extends WeaverseElementProps {
99
99
  token: string;
package/dist/index.js CHANGED
@@ -39,11 +39,29 @@ module.exports = __toCommonJS(src_exports);
39
39
 
40
40
  // src/elements/button.tsx
41
41
  var React = __toESM(require("react"));
42
+ var import_react2 = require("react");
43
+
44
+ // src/context.ts
45
+ var import_core = require("@weaverse/core");
46
+ var import_react = require("react");
47
+ var createRootContext = (configs) => {
48
+ let rootContext = new import_core.Weaverse(configs);
49
+ Object.keys(Elements).forEach((key) => {
50
+ rootContext.registerElement(Elements[key]);
51
+ });
52
+ return rootContext;
53
+ };
54
+ var WeaverseContext = (0, import_react.createContext)({});
55
+ var WeaverseContextProvider = WeaverseContext.Provider;
56
+ var WeaverseContextConsumer = WeaverseContext.Consumer;
57
+
58
+ // src/elements/button.tsx
42
59
  var Button = React.forwardRef((props, ref) => {
60
+ let { isDesignMode } = (0, import_react2.useContext)(WeaverseContext);
43
61
  let { text, clickAction, linkTo, openInNewTab, ...rest } = props;
44
62
  if (clickAction && linkTo) {
45
63
  return /* @__PURE__ */ React.createElement("a", {
46
- href: linkTo,
64
+ href: !isDesignMode ? linkTo : void 0,
47
65
  target: openInNewTab ? "_blank" : "_self",
48
66
  rel: "noreferrer",
49
67
  ...rest,
@@ -76,11 +94,11 @@ var css = {
76
94
  var button_default = Button;
77
95
 
78
96
  // src/elements/container.tsx
79
- var import_react = __toESM(require("react"));
80
- var Container = (0, import_react.forwardRef)(
97
+ var import_react3 = __toESM(require("react"));
98
+ var Container = (0, import_react3.forwardRef)(
81
99
  (props, ref) => {
82
100
  let { children, ...rest } = props;
83
- return /* @__PURE__ */ import_react.default.createElement("div", {
101
+ return /* @__PURE__ */ import_react3.default.createElement("div", {
84
102
  ref,
85
103
  ...rest
86
104
  }, children);
@@ -104,30 +122,16 @@ Container.defaultProps = {};
104
122
  var container_default = Container;
105
123
 
106
124
  // src/elements/countdown/index.tsx
107
- var import_react4 = __toESM(require("react"));
108
-
109
- // src/context.ts
110
- var import_core = require("@weaverse/core");
111
- var import_react2 = require("react");
112
- var createRootContext = (configs) => {
113
- let rootContext = new import_core.Weaverse(configs);
114
- Object.keys(Elements).forEach((key) => {
115
- rootContext.registerElement(Elements[key]);
116
- });
117
- return rootContext;
118
- };
119
- var WeaverseContext = (0, import_react2.createContext)({});
120
- var WeaverseContextProvider = WeaverseContext.Provider;
121
- var WeaverseContextConsumer = WeaverseContext.Consumer;
125
+ var import_react5 = __toESM(require("react"));
122
126
 
123
127
  // src/elements/countdown/timer-block.tsx
124
- var import_react3 = __toESM(require("react"));
128
+ var import_react4 = __toESM(require("react"));
125
129
  function TimerBlock({ value, label }) {
126
- return /* @__PURE__ */ import_react3.default.createElement("div", {
130
+ return /* @__PURE__ */ import_react4.default.createElement("div", {
127
131
  className: "wv-cd-block"
128
- }, /* @__PURE__ */ import_react3.default.createElement("div", {
132
+ }, /* @__PURE__ */ import_react4.default.createElement("div", {
129
133
  className: "wv-cd-number"
130
- }, value.toString().padStart(2, "0")), label && /* @__PURE__ */ import_react3.default.createElement("div", {
134
+ }, typeof value === "string" ? value : value.toString().padStart(2, "0")), label && /* @__PURE__ */ import_react4.default.createElement("div", {
131
135
  className: "wv-cd-label"
132
136
  }, label));
133
137
  }
@@ -150,51 +154,75 @@ function getTime(_seconds) {
150
154
  }
151
155
 
152
156
  // src/elements/countdown/index.tsx
153
- var Countdown = (0, import_react4.forwardRef)(
157
+ var countdownKey = "wv-cd-evergreen-start";
158
+ var Countdown = (0, import_react5.forwardRef)(
154
159
  (props, ref) => {
155
- const { isDesignMode } = (0, import_react4.useContext)(WeaverseContext);
160
+ const { isDesignMode } = (0, import_react5.useContext)(WeaverseContext);
156
161
  let {
157
162
  timerType,
158
- startTime,
159
- endTime,
160
- periods,
163
+ startTime: startTimeProp,
164
+ endTime: endTimeProp,
165
+ periods: periodsProp,
161
166
  redirectUrl,
162
167
  openInNewTab,
163
168
  showColon,
164
169
  showLabel,
165
170
  ...rest
166
171
  } = props;
167
- const [remaining, setRemaining] = import_react4.default.useState(0);
168
- if (typeof endTime !== "number") {
169
- endTime = Number.parseInt(endTime);
170
- }
171
- (0, import_react4.useEffect)(() => {
172
- const flag = setInterval(() => {
173
- const remainingTime = Math.max(
174
- (timerType === "fixed-time" ? new Date(endTime).getTime() : new Date(startTime).getTime() + periods * 60 * 1e3) - Date.now(),
175
- 0
176
- );
177
- if (!isDesignMode && redirectUrl && remainingTime > 0 && remainingTime < 1e3) {
178
- window.open(redirectUrl, openInNewTab ? "_blank" : "_self");
179
- clearInterval(flag);
172
+ const [remaining, setRemaining] = import_react5.default.useState(0);
173
+ let periods = periodsProp * 60 * 1e3;
174
+ const handleEnd = () => {
175
+ if (!isDesignMode && redirectUrl)
176
+ window.open(redirectUrl, openInNewTab ? "_blank" : "_self");
177
+ };
178
+ const getStartTime = () => {
179
+ let startTime = startTimeProp;
180
+ if (timerType === "evergreen") {
181
+ const start = localStorage.getItem(countdownKey);
182
+ if (start) {
183
+ startTime = Number.parseInt(start);
184
+ if (startTime + periods < Date.now()) {
185
+ startTime = Date.now();
186
+ localStorage.setItem(countdownKey, startTime.toString());
187
+ }
188
+ } else {
189
+ startTime = Date.now();
190
+ localStorage.setItem(countdownKey, startTime.toString());
180
191
  }
181
- setRemaining(remainingTime);
182
- }, 1e3);
192
+ }
193
+ return startTime;
194
+ };
195
+ const checkActive = (startTime) => startTime < Date.now() && endTimeProp > Date.now();
196
+ const handleRemaining = () => {
197
+ let startTime = getStartTime();
198
+ let endTime = timerType === "fixed-time" ? endTimeProp : startTime + periods;
199
+ let isActive = checkActive(startTime);
200
+ const remainingTime = isActive ? Math.max(endTime - Date.now(), 0) : 0;
201
+ if (remainingTime > 0 && remainingTime < 1e3) {
202
+ handleEnd();
203
+ }
204
+ setRemaining(remainingTime);
205
+ };
206
+ (0, import_react5.useEffect)(() => {
207
+ let intervalFlag = setInterval(
208
+ handleRemaining,
209
+ 1e3
210
+ );
183
211
  return () => {
184
- clearInterval(flag);
212
+ clearInterval(intervalFlag);
185
213
  };
186
- }, [startTime, endTime, periods, timerType]);
214
+ }, [startTimeProp, endTimeProp, periods, timerType]);
187
215
  const timer = getTime(remaining);
188
- return /* @__PURE__ */ import_react4.default.createElement("div", {
216
+ return /* @__PURE__ */ import_react5.default.createElement("div", {
189
217
  ref,
190
218
  ...rest
191
219
  }, times.map((time) => {
192
- return /* @__PURE__ */ import_react4.default.createElement(import_react4.default.Fragment, {
220
+ return /* @__PURE__ */ import_react5.default.createElement(import_react5.default.Fragment, {
193
221
  key: time
194
- }, /* @__PURE__ */ import_react4.default.createElement(TimerBlock, {
222
+ }, /* @__PURE__ */ import_react5.default.createElement(TimerBlock, {
195
223
  label: showLabel ? time : "",
196
- value: timer[time]
197
- }), time !== "seconds" && /* @__PURE__ */ import_react4.default.createElement("div", null, /* @__PURE__ */ import_react4.default.createElement("span", {
224
+ value: remaining === 0 ? "--" : timer[time]
225
+ }), time !== "seconds" && /* @__PURE__ */ import_react5.default.createElement("div", null, /* @__PURE__ */ import_react5.default.createElement("span", {
198
226
  className: `wv-cd-number ${showColon ? "" : "hidden"}`
199
227
  }, ":")));
200
228
  }));
@@ -229,9 +257,9 @@ var css3 = {
229
257
  Countdown.defaultProps = {
230
258
  timerType: "fixed-time",
231
259
  startTime: Date.now(),
232
- endTime: 1666756528e3,
260
+ endTime: Date.now() + 1e3 * 60 * 60 * 24,
233
261
  periods: 90,
234
- redirectUrl: "https://myshop.com",
262
+ redirectUrl: "",
235
263
  openInNewTab: false,
236
264
  showLabel: true,
237
265
  showColon: true
@@ -239,8 +267,8 @@ Countdown.defaultProps = {
239
267
  var countdown_default = Countdown;
240
268
 
241
269
  // src/elements/image.tsx
242
- var import_react5 = __toESM(require("react"));
243
- var Image = import_react5.default.forwardRef(
270
+ var import_react6 = __toESM(require("react"));
271
+ var Image = import_react6.default.forwardRef(
244
272
  (props, ref) => {
245
273
  let {
246
274
  src,
@@ -256,18 +284,18 @@ var Image = import_react5.default.forwardRef(
256
284
  "--wv-img-object-fit": objectFit,
257
285
  "--wv-img-object-position": objectPosition
258
286
  };
259
- let content = /* @__PURE__ */ import_react5.default.createElement("img", {
287
+ let content = /* @__PURE__ */ import_react6.default.createElement("img", {
260
288
  alt,
261
289
  "data-blink-src": src
262
290
  });
263
291
  if (onClickAction === "open-link" && linkTo) {
264
292
  let target = openLinkInNewTab ? "_blank" : "_self";
265
- content = /* @__PURE__ */ import_react5.default.createElement("a", {
293
+ content = /* @__PURE__ */ import_react6.default.createElement("a", {
266
294
  href: linkTo,
267
295
  target
268
296
  }, content);
269
297
  }
270
- return /* @__PURE__ */ import_react5.default.createElement("div", {
298
+ return /* @__PURE__ */ import_react6.default.createElement("div", {
271
299
  ref,
272
300
  ...rest,
273
301
  style
@@ -299,8 +327,8 @@ Image.defaultProps = {
299
327
  var image_default = Image;
300
328
 
301
329
  // src/elements/layout.tsx
302
- var import_react6 = __toESM(require("react"));
303
- var Layout = (0, import_react6.forwardRef)((props, ref) => {
330
+ var import_react7 = __toESM(require("react"));
331
+ var Layout = (0, import_react7.forwardRef)((props, ref) => {
304
332
  let {
305
333
  children,
306
334
  rows,
@@ -321,15 +349,15 @@ var Layout = (0, import_react6.forwardRef)((props, ref) => {
321
349
  "--row-size": rowSize + "px",
322
350
  "--col-size": "calc((var(--grid-size) - calc(var(--columns) - 1) * var(--gap)) / var(--columns))"
323
351
  };
324
- return /* @__PURE__ */ import_react6.default.createElement("section", {
352
+ return /* @__PURE__ */ import_react7.default.createElement("section", {
325
353
  ref,
326
354
  ...rest,
327
355
  style
328
- }, /* @__PURE__ */ import_react6.default.createElement(LayoutBackground, {
356
+ }, /* @__PURE__ */ import_react7.default.createElement(LayoutBackground, {
329
357
  imgUrl: backgroundImage,
330
358
  bgColor: backgroundColor,
331
359
  objectFit
332
- }), /* @__PURE__ */ import_react6.default.createElement("div", {
360
+ }), /* @__PURE__ */ import_react7.default.createElement("div", {
333
361
  "data-layout-content": true
334
362
  }, children));
335
363
  });
@@ -339,10 +367,10 @@ var LayoutBackground = (props) => {
339
367
  ["--bg-color"]: bgColor,
340
368
  ["--object-fit"]: objectFit
341
369
  };
342
- return imgUrl || bgColor ? /* @__PURE__ */ import_react6.default.createElement("div", {
370
+ return imgUrl || bgColor ? /* @__PURE__ */ import_react7.default.createElement("div", {
343
371
  "data-wv-bg": true,
344
372
  style
345
- }, imgUrl && /* @__PURE__ */ import_react6.default.createElement("img", {
373
+ }, imgUrl && /* @__PURE__ */ import_react7.default.createElement("img", {
346
374
  width: "100%",
347
375
  height: "100%",
348
376
  "data-blink-src": imgUrl,
@@ -394,13 +422,13 @@ Layout.defaultProps = {
394
422
  var layout_default = Layout;
395
423
 
396
424
  // src/elements/map.tsx
397
- var import_react7 = __toESM(require("react"));
398
- var Map = (0, import_react7.forwardRef)((props, ref) => {
425
+ var import_react8 = __toESM(require("react"));
426
+ var Map = (0, import_react8.forwardRef)((props, ref) => {
399
427
  let { place, zoom, ...rest } = props;
400
- return /* @__PURE__ */ import_react7.default.createElement("div", {
428
+ return /* @__PURE__ */ import_react8.default.createElement("div", {
401
429
  ref,
402
430
  ...rest
403
- }, /* @__PURE__ */ import_react7.default.createElement("iframe", {
431
+ }, /* @__PURE__ */ import_react8.default.createElement("iframe", {
404
432
  loading: "lazy",
405
433
  scrolling: "no",
406
434
  width: "100%",
@@ -443,24 +471,24 @@ Text.defaultProps = {
443
471
  var text_default = Text;
444
472
 
445
473
  // src/elements/video.tsx
446
- var import_react8 = __toESM(require("react"));
447
- var Video = (0, import_react8.forwardRef)((props, ref) => {
448
- let { isDesignMode } = (0, import_react8.useContext)(WeaverseContext);
474
+ var import_react9 = __toESM(require("react"));
475
+ var Video = (0, import_react9.forwardRef)((props, ref) => {
476
+ let { isDesignMode } = (0, import_react9.useContext)(WeaverseContext);
449
477
  let { src, type, controls, poster, autoPlay, loop, muted, ...rest } = props;
450
- return /* @__PURE__ */ import_react8.default.createElement("div", {
478
+ return /* @__PURE__ */ import_react9.default.createElement("div", {
451
479
  ref,
452
480
  ...rest
453
- }, /* @__PURE__ */ import_react8.default.createElement("video", {
481
+ }, /* @__PURE__ */ import_react9.default.createElement("video", {
454
482
  controls: isDesignMode ? false : controls,
455
483
  autoPlay: isDesignMode ? false : autoPlay,
456
484
  loop,
457
485
  muted: true,
458
486
  controlsList: "nodownload",
459
487
  disablePictureInPicture: true
460
- }, /* @__PURE__ */ import_react8.default.createElement("source", {
488
+ }, /* @__PURE__ */ import_react9.default.createElement("source", {
461
489
  src,
462
490
  type: type || "video/mp4"
463
- }), /* @__PURE__ */ import_react8.default.createElement("source", {
491
+ }), /* @__PURE__ */ import_react9.default.createElement("source", {
464
492
  src,
465
493
  type: "video/ogg"
466
494
  }), "Your browser does not support the video tag."));
@@ -486,33 +514,33 @@ Video.defaultProps = {
486
514
  var video_default = Video;
487
515
 
488
516
  // src/elements/instagram.tsx
489
- var import_react10 = __toESM(require("react"));
517
+ var import_react11 = __toESM(require("react"));
490
518
 
491
519
  // src/elements/shared/Placeholder.tsx
492
- var import_react9 = __toESM(require("react"));
493
- var Placeholder = (0, import_react9.forwardRef)(
520
+ var import_react10 = __toESM(require("react"));
521
+ var Placeholder = (0, import_react10.forwardRef)(
494
522
  (props, ref) => {
495
523
  let { element, children, ...rest } = props;
496
- return /* @__PURE__ */ import_react9.default.createElement("div", {
524
+ return /* @__PURE__ */ import_react10.default.createElement("div", {
497
525
  "data-wv-placeholder": true,
498
526
  style: { display: "none" },
499
527
  ref,
500
528
  ...rest
501
- }, /* @__PURE__ */ import_react9.default.createElement("div", {
529
+ }, /* @__PURE__ */ import_react10.default.createElement("div", {
502
530
  style: { fontWeight: 600, marginBottom: "10px" }
503
- }, element), /* @__PURE__ */ import_react9.default.createElement("div", null, children));
531
+ }, element), /* @__PURE__ */ import_react10.default.createElement("div", null, children));
504
532
  }
505
533
  );
506
534
  var Placeholder_default = Placeholder;
507
535
 
508
536
  // src/elements/instagram.tsx
509
537
  var INSTAGRAM_API = "https://graph.instagram.com";
510
- var Instagram = (0, import_react10.forwardRef)(
538
+ var Instagram = (0, import_react11.forwardRef)(
511
539
  (props, ref) => {
512
540
  let { token, username, numberOfImages, imagesPerRow, gap, ...rest } = props;
513
- let [media, setMedia] = (0, import_react10.useState)([]);
514
- let [error, setError] = (0, import_react10.useState)(null);
515
- (0, import_react10.useEffect)(() => {
541
+ let [media, setMedia] = (0, import_react11.useState)([]);
542
+ let [error, setError] = (0, import_react11.useState)(null);
543
+ (0, import_react11.useEffect)(() => {
516
544
  if (token) {
517
545
  let params = new URLSearchParams({
518
546
  access_token: token,
@@ -529,10 +557,10 @@ var Instagram = (0, import_react10.forwardRef)(
529
557
  }
530
558
  }, [token]);
531
559
  if (!token || error) {
532
- return /* @__PURE__ */ import_react10.default.createElement("div", {
560
+ return /* @__PURE__ */ import_react11.default.createElement("div", {
533
561
  ref,
534
562
  ...rest
535
- }, /* @__PURE__ */ import_react10.default.createElement(Placeholder_default, {
563
+ }, /* @__PURE__ */ import_react11.default.createElement(Placeholder_default, {
536
564
  element: "Instagram"
537
565
  }, !token ? "Connect to Instagram to display photos on your site." : "Invalid or expired token!"));
538
566
  }
@@ -540,20 +568,20 @@ var Instagram = (0, import_react10.forwardRef)(
540
568
  "--wv-ig-images-per-row": imagesPerRow,
541
569
  "--wv-ig-images-gap": gap + "px"
542
570
  };
543
- return /* @__PURE__ */ import_react10.default.createElement("div", {
571
+ return /* @__PURE__ */ import_react11.default.createElement("div", {
544
572
  ref,
545
573
  ...rest,
546
574
  style
547
- }, /* @__PURE__ */ import_react10.default.createElement("div", {
575
+ }, /* @__PURE__ */ import_react11.default.createElement("div", {
548
576
  className: "wv-ig-media-container"
549
577
  }, media.slice(0, numberOfImages).map((item) => {
550
578
  let { id, permalink, caption, media_url } = item;
551
- return /* @__PURE__ */ import_react10.default.createElement("a", {
579
+ return /* @__PURE__ */ import_react11.default.createElement("a", {
552
580
  key: id,
553
581
  href: permalink,
554
582
  target: "_blank",
555
583
  rel: "noreferrer"
556
- }, /* @__PURE__ */ import_react10.default.createElement("img", {
584
+ }, /* @__PURE__ */ import_react11.default.createElement("img", {
557
585
  alt: caption,
558
586
  src: media_url
559
587
  }));
@@ -642,7 +670,7 @@ var Elements = {
642
670
 
643
671
  // src/renderer.tsx
644
672
  var import_core2 = require("@weaverse/core");
645
- var import_react11 = __toESM(require("react"));
673
+ var import_react12 = __toESM(require("react"));
646
674
 
647
675
  // src/utils/index.ts
648
676
  function shortCssObject(css10) {
@@ -682,10 +710,10 @@ function generateItemClass(instance, stitchesInstance) {
682
710
  // src/renderer.tsx
683
711
  var WeaverseRoot = ({ context }) => {
684
712
  var _a, _b;
685
- let [, setData] = (0, import_react11.useState)(context.projectData);
686
- let rootRef = (0, import_react11.useRef)();
713
+ let [, setData] = (0, import_react12.useState)(context.projectData);
714
+ let rootRef = (0, import_react12.useRef)();
687
715
  let renderRoot = () => setData({});
688
- (0, import_react11.useEffect)(() => {
716
+ (0, import_react12.useEffect)(() => {
689
717
  context.subscribe(renderRoot);
690
718
  context.contentRootElement = rootRef.current;
691
719
  return () => {
@@ -695,23 +723,23 @@ var WeaverseRoot = ({ context }) => {
695
723
  let eventHandlers = ((_a = context == null ? void 0 : context.studioBridge) == null ? void 0 : _a.eventHandlers) || {};
696
724
  let themeClass = context.stitchesInstance.theme.className;
697
725
  if ((_b = context.projectData) == null ? void 0 : _b.rootId) {
698
- return /* @__PURE__ */ import_react11.default.createElement("div", {
726
+ return /* @__PURE__ */ import_react12.default.createElement("div", {
699
727
  className: `weaverse-content-root ${themeClass}`,
700
728
  ...eventHandlers,
701
729
  ref: rootRef
702
- }, /* @__PURE__ */ import_react11.default.createElement(WeaverseContextProvider, {
730
+ }, /* @__PURE__ */ import_react12.default.createElement(WeaverseContextProvider, {
703
731
  value: context
704
- }, /* @__PURE__ */ import_react11.default.createElement(ItemInstance, {
732
+ }, /* @__PURE__ */ import_react12.default.createElement(ItemInstance, {
705
733
  id: context.projectData.rootId
706
734
  })));
707
735
  }
708
736
  return null;
709
737
  };
710
738
  var ItemComponent = ({ instance }) => {
711
- let { stitchesInstance, elementInstances } = (0, import_react11.useContext)(WeaverseContext);
712
- let [data, setData] = (0, import_react11.useState)(instance.data);
739
+ let { stitchesInstance, elementInstances } = (0, import_react12.useContext)(WeaverseContext);
740
+ let [data, setData] = (0, import_react12.useState)(instance.data);
713
741
  let { id, type, childIds = [], css: css10, className, ...rest } = data;
714
- (0, import_react11.useEffect)(() => {
742
+ (0, import_react12.useEffect)(() => {
715
743
  let render = (data2) => setData({ ...data2 });
716
744
  instance.subscribe(render);
717
745
  if (import_core2.isBrowser && !instance.ref.current) {
@@ -727,13 +755,13 @@ var ItemComponent = ({ instance }) => {
727
755
  if (Component.$$typeof === Symbol.for("react.forward_ref")) {
728
756
  rest.ref = instance.ref;
729
757
  }
730
- return /* @__PURE__ */ import_react11.default.createElement(Component, {
758
+ return /* @__PURE__ */ import_react12.default.createElement(Component, {
731
759
  key: id,
732
760
  "data-wv-type": type,
733
761
  "data-wv-id": id,
734
762
  className: generateItemClass(instance, stitchesInstance),
735
763
  ...rest
736
- }, childIds.map((id2) => /* @__PURE__ */ import_react11.default.createElement(ItemInstance, {
764
+ }, childIds.map((id2) => /* @__PURE__ */ import_react12.default.createElement(ItemInstance, {
737
765
  key: id2,
738
766
  id: id2
739
767
  })));
@@ -743,15 +771,15 @@ var ItemComponent = ({ instance }) => {
743
771
  }
744
772
  };
745
773
  var ItemInstance = ({ id }) => {
746
- let context = (0, import_react11.useContext)(WeaverseContext);
774
+ let context = (0, import_react12.useContext)(WeaverseContext);
747
775
  let { itemInstances } = context;
748
776
  let instance = itemInstances.get(id);
749
777
  if (!instance) {
750
- return /* @__PURE__ */ import_react11.default.createElement("div", {
778
+ return /* @__PURE__ */ import_react12.default.createElement("div", {
751
779
  style: { display: "none" }
752
780
  }, "Item instance ", id, " not found");
753
781
  }
754
- return /* @__PURE__ */ import_react11.default.createElement(ItemComponent, {
782
+ return /* @__PURE__ */ import_react12.default.createElement(ItemComponent, {
755
783
  key: id,
756
784
  instance
757
785
  });
package/dist/index.mjs CHANGED
@@ -1,10 +1,28 @@
1
1
  // src/elements/button.tsx
2
2
  import * as React from "react";
3
+ import { useContext } from "react";
4
+
5
+ // src/context.ts
6
+ import { Weaverse } from "@weaverse/core";
7
+ import { createContext } from "react";
8
+ var createRootContext = (configs) => {
9
+ let rootContext = new Weaverse(configs);
10
+ Object.keys(Elements).forEach((key) => {
11
+ rootContext.registerElement(Elements[key]);
12
+ });
13
+ return rootContext;
14
+ };
15
+ var WeaverseContext = createContext({});
16
+ var WeaverseContextProvider = WeaverseContext.Provider;
17
+ var WeaverseContextConsumer = WeaverseContext.Consumer;
18
+
19
+ // src/elements/button.tsx
3
20
  var Button = React.forwardRef((props, ref) => {
21
+ let { isDesignMode } = useContext(WeaverseContext);
4
22
  let { text, clickAction, linkTo, openInNewTab, ...rest } = props;
5
23
  if (clickAction && linkTo) {
6
24
  return /* @__PURE__ */ React.createElement("a", {
7
- href: linkTo,
25
+ href: !isDesignMode ? linkTo : void 0,
8
26
  target: openInNewTab ? "_blank" : "_self",
9
27
  rel: "noreferrer",
10
28
  ...rest,
@@ -65,21 +83,7 @@ Container.defaultProps = {};
65
83
  var container_default = Container;
66
84
 
67
85
  // src/elements/countdown/index.tsx
68
- import React4, { forwardRef as forwardRef3, useContext, useEffect } from "react";
69
-
70
- // src/context.ts
71
- import { Weaverse } from "@weaverse/core";
72
- import { createContext } from "react";
73
- var createRootContext = (configs) => {
74
- let rootContext = new Weaverse(configs);
75
- Object.keys(Elements).forEach((key) => {
76
- rootContext.registerElement(Elements[key]);
77
- });
78
- return rootContext;
79
- };
80
- var WeaverseContext = createContext({});
81
- var WeaverseContextProvider = WeaverseContext.Provider;
82
- var WeaverseContextConsumer = WeaverseContext.Consumer;
86
+ import React4, { forwardRef as forwardRef3, useContext as useContext2, useEffect } from "react";
83
87
 
84
88
  // src/elements/countdown/timer-block.tsx
85
89
  import React3 from "react";
@@ -88,7 +92,7 @@ function TimerBlock({ value, label }) {
88
92
  className: "wv-cd-block"
89
93
  }, /* @__PURE__ */ React3.createElement("div", {
90
94
  className: "wv-cd-number"
91
- }, value.toString().padStart(2, "0")), label && /* @__PURE__ */ React3.createElement("div", {
95
+ }, typeof value === "string" ? value : value.toString().padStart(2, "0")), label && /* @__PURE__ */ React3.createElement("div", {
92
96
  className: "wv-cd-label"
93
97
  }, label));
94
98
  }
@@ -111,14 +115,15 @@ function getTime(_seconds) {
111
115
  }
112
116
 
113
117
  // src/elements/countdown/index.tsx
118
+ var countdownKey = "wv-cd-evergreen-start";
114
119
  var Countdown = forwardRef3(
115
120
  (props, ref) => {
116
- const { isDesignMode } = useContext(WeaverseContext);
121
+ const { isDesignMode } = useContext2(WeaverseContext);
117
122
  let {
118
123
  timerType,
119
- startTime,
120
- endTime,
121
- periods,
124
+ startTime: startTimeProp,
125
+ endTime: endTimeProp,
126
+ periods: periodsProp,
122
127
  redirectUrl,
123
128
  openInNewTab,
124
129
  showColon,
@@ -126,25 +131,48 @@ var Countdown = forwardRef3(
126
131
  ...rest
127
132
  } = props;
128
133
  const [remaining, setRemaining] = React4.useState(0);
129
- if (typeof endTime !== "number") {
130
- endTime = Number.parseInt(endTime);
131
- }
132
- useEffect(() => {
133
- const flag = setInterval(() => {
134
- const remainingTime = Math.max(
135
- (timerType === "fixed-time" ? new Date(endTime).getTime() : new Date(startTime).getTime() + periods * 60 * 1e3) - Date.now(),
136
- 0
137
- );
138
- if (!isDesignMode && redirectUrl && remainingTime > 0 && remainingTime < 1e3) {
139
- window.open(redirectUrl, openInNewTab ? "_blank" : "_self");
140
- clearInterval(flag);
134
+ let periods = periodsProp * 60 * 1e3;
135
+ const handleEnd = () => {
136
+ if (!isDesignMode && redirectUrl)
137
+ window.open(redirectUrl, openInNewTab ? "_blank" : "_self");
138
+ };
139
+ const getStartTime = () => {
140
+ let startTime = startTimeProp;
141
+ if (timerType === "evergreen") {
142
+ const start = localStorage.getItem(countdownKey);
143
+ if (start) {
144
+ startTime = Number.parseInt(start);
145
+ if (startTime + periods < Date.now()) {
146
+ startTime = Date.now();
147
+ localStorage.setItem(countdownKey, startTime.toString());
148
+ }
149
+ } else {
150
+ startTime = Date.now();
151
+ localStorage.setItem(countdownKey, startTime.toString());
141
152
  }
142
- setRemaining(remainingTime);
143
- }, 1e3);
153
+ }
154
+ return startTime;
155
+ };
156
+ const checkActive = (startTime) => startTime < Date.now() && endTimeProp > Date.now();
157
+ const handleRemaining = () => {
158
+ let startTime = getStartTime();
159
+ let endTime = timerType === "fixed-time" ? endTimeProp : startTime + periods;
160
+ let isActive = checkActive(startTime);
161
+ const remainingTime = isActive ? Math.max(endTime - Date.now(), 0) : 0;
162
+ if (remainingTime > 0 && remainingTime < 1e3) {
163
+ handleEnd();
164
+ }
165
+ setRemaining(remainingTime);
166
+ };
167
+ useEffect(() => {
168
+ let intervalFlag = setInterval(
169
+ handleRemaining,
170
+ 1e3
171
+ );
144
172
  return () => {
145
- clearInterval(flag);
173
+ clearInterval(intervalFlag);
146
174
  };
147
- }, [startTime, endTime, periods, timerType]);
175
+ }, [startTimeProp, endTimeProp, periods, timerType]);
148
176
  const timer = getTime(remaining);
149
177
  return /* @__PURE__ */ React4.createElement("div", {
150
178
  ref,
@@ -154,7 +182,7 @@ var Countdown = forwardRef3(
154
182
  key: time
155
183
  }, /* @__PURE__ */ React4.createElement(TimerBlock, {
156
184
  label: showLabel ? time : "",
157
- value: timer[time]
185
+ value: remaining === 0 ? "--" : timer[time]
158
186
  }), time !== "seconds" && /* @__PURE__ */ React4.createElement("div", null, /* @__PURE__ */ React4.createElement("span", {
159
187
  className: `wv-cd-number ${showColon ? "" : "hidden"}`
160
188
  }, ":")));
@@ -190,9 +218,9 @@ var css3 = {
190
218
  Countdown.defaultProps = {
191
219
  timerType: "fixed-time",
192
220
  startTime: Date.now(),
193
- endTime: 1666756528e3,
221
+ endTime: Date.now() + 1e3 * 60 * 60 * 24,
194
222
  periods: 90,
195
- redirectUrl: "https://myshop.com",
223
+ redirectUrl: "",
196
224
  openInNewTab: false,
197
225
  showLabel: true,
198
226
  showColon: true
@@ -404,9 +432,9 @@ Text.defaultProps = {
404
432
  var text_default = Text;
405
433
 
406
434
  // src/elements/video.tsx
407
- import React9, { forwardRef as forwardRef7, useContext as useContext2 } from "react";
435
+ import React9, { forwardRef as forwardRef7, useContext as useContext3 } from "react";
408
436
  var Video = forwardRef7((props, ref) => {
409
- let { isDesignMode } = useContext2(WeaverseContext);
437
+ let { isDesignMode } = useContext3(WeaverseContext);
410
438
  let { src, type, controls, poster, autoPlay, loop, muted, ...rest } = props;
411
439
  return /* @__PURE__ */ React9.createElement("div", {
412
440
  ref,
@@ -603,7 +631,7 @@ var Elements = {
603
631
 
604
632
  // src/renderer.tsx
605
633
  import { isBrowser } from "@weaverse/core";
606
- import React12, { useContext as useContext3, useEffect as useEffect3, useRef, useState as useState2 } from "react";
634
+ import React12, { useContext as useContext4, useEffect as useEffect3, useRef, useState as useState2 } from "react";
607
635
 
608
636
  // src/utils/index.ts
609
637
  function shortCssObject(css10) {
@@ -669,7 +697,7 @@ var WeaverseRoot = ({ context }) => {
669
697
  return null;
670
698
  };
671
699
  var ItemComponent = ({ instance }) => {
672
- let { stitchesInstance, elementInstances } = useContext3(WeaverseContext);
700
+ let { stitchesInstance, elementInstances } = useContext4(WeaverseContext);
673
701
  let [data, setData] = useState2(instance.data);
674
702
  let { id, type, childIds = [], css: css10, className, ...rest } = data;
675
703
  useEffect3(() => {
@@ -704,7 +732,7 @@ var ItemComponent = ({ instance }) => {
704
732
  }
705
733
  };
706
734
  var ItemInstance = ({ id }) => {
707
- let context = useContext3(WeaverseContext);
735
+ let context = useContext4(WeaverseContext);
708
736
  let { itemInstances } = context;
709
737
  let instance = itemInstances.get(id);
710
738
  if (!instance) {
package/package.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "0.7.20",
2
+ "version": "0.7.21",
3
3
  "license": "MIT",
4
4
  "main": "dist/index.js",
5
5
  "typings": "dist/index.d.ts",
@@ -31,7 +31,7 @@
31
31
  "name": "@weaverse/react",
32
32
  "author": "Weaverse Team",
33
33
  "dependencies": {
34
- "@weaverse/core": "0.7.20",
34
+ "@weaverse/core": "0.7.21",
35
35
  "nuka-carousel": "^5.4.0"
36
36
  }
37
37
  }