@weaverse/react 0.6.17 → 0.6.18

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
@@ -13,11 +13,18 @@ interface WeaverseElementProps {
13
13
  declare type WeaverseRootPropsType = {
14
14
  context: Weaverse;
15
15
  };
16
- declare type CountdownTimeKey = 'days' | 'hours' | 'minutes' | 'seconds';
17
16
  declare type ItemComponentProps = {
18
17
  instance: InstanceType<typeof WeaverseItemStore>;
19
18
  };
19
+ declare type CountdownTimeKey = 'days' | 'hours' | 'minutes' | 'seconds';
20
+ declare type InstagramMedia = {
21
+ id: string;
22
+ media_type: 'IMAGE' | 'CAROUSEL_ALBUM';
23
+ media_url: string;
24
+ permalink: string;
25
+ caption: string;
26
+ };
20
27
 
21
28
  declare let WeaverseRoot: ({ context }: WeaverseRootPropsType) => JSX.Element;
22
29
 
23
- export { CountdownTimeKey, ItemComponentProps, WeaverseContext, WeaverseContextConsumer, WeaverseContextProvider, WeaverseElementProps, WeaverseRoot, WeaverseRootPropsType, createRootContext };
30
+ export { CountdownTimeKey, InstagramMedia, ItemComponentProps, WeaverseContext, WeaverseContextConsumer, WeaverseContextProvider, WeaverseElementProps, WeaverseRoot, WeaverseRootPropsType, createRootContext };
package/dist/index.js CHANGED
@@ -62,7 +62,7 @@ module.exports = __toCommonJS(src_exports);
62
62
 
63
63
  // src/context.ts
64
64
  var import_core = require("@weaverse/core");
65
- var import_react9 = require("react");
65
+ var import_react10 = require("react");
66
66
 
67
67
  // src/elements/button.tsx
68
68
  var React = __toESM(require("react"));
@@ -412,50 +412,102 @@ Video.defaultProps = {
412
412
  var video_default = Video;
413
413
 
414
414
  // src/elements/instagram.tsx
415
+ var import_react9 = __toESM(require("react"));
416
+
417
+ // src/elements/shared/Placeholder.tsx
415
418
  var import_react8 = __toESM(require("react"));
416
- var Instagram = (0, import_react8.forwardRef)((props, ref) => {
417
- const { stitchesInstance } = (0, import_react8.useContext)(WeaverseContext);
418
- const _a = props, { token, numberOfImages, imagesPerRow, className } = _a, rest = __objRest(_a, ["token", "numberOfImages", "imagesPerRow", "className"]);
419
- const [media, setMedia] = (0, import_react8.useState)([]);
420
- (0, import_react8.useEffect)(() => {
421
- const url = `https://graph.instagram.com/me/media?fields=id,media_type,caption,media_url&access_token=${token}`;
422
- fetch(url).then((res) => res.json()).then((res) => {
423
- setMedia(res.data);
424
- });
425
- }, [token]);
426
- const css = {
427
- gridTemplateColumns: `repeat(${imagesPerRow[0] || 1}, 1fr)`
419
+ var Placeholder = (0, import_react8.forwardRef)((props, ref) => {
420
+ let _a = props, { element, children } = _a, rest = __objRest(_a, ["element", "children"]);
421
+ let style = {
422
+ height: "100%",
423
+ display: "flex",
424
+ flexDirection: "column",
425
+ alignItems: "center",
426
+ justifyContent: "center",
427
+ color: "#374151"
428
428
  };
429
- const { className: instagramClass = "" } = stitchesInstance.css(css)();
430
429
  return /* @__PURE__ */ import_react8.default.createElement("div", __spreadValues({
431
- className: `${className} ${instagramClass}`,
430
+ style,
432
431
  ref
433
- }, rest), !token ? "Token is empty" : media.map((item, key) => {
434
- return /* @__PURE__ */ import_react8.default.createElement("div", {
435
- key,
436
- className: "wv-instagram-item"
437
- }, /* @__PURE__ */ import_react8.default.createElement("img", {
438
- width: "100%",
439
- height: "100%",
432
+ }, rest), /* @__PURE__ */ import_react8.default.createElement("div", {
433
+ style: { fontWeight: 600, marginBottom: "10px" }
434
+ }, element), /* @__PURE__ */ import_react8.default.createElement("div", null, children));
435
+ });
436
+ var Placeholder_default = Placeholder;
437
+
438
+ // src/elements/instagram.tsx
439
+ var INSTAGRAM_API = "https://graph.instagram.com";
440
+ var Instagram = (0, import_react9.forwardRef)((props, ref) => {
441
+ const _a = props, { token, username, numberOfImages, imagesPerRow, gap } = _a, rest = __objRest(_a, ["token", "username", "numberOfImages", "imagesPerRow", "gap"]);
442
+ const [media, setMedia] = (0, import_react9.useState)([]);
443
+ const [error, setError] = (0, import_react9.useState)(null);
444
+ let { isDesignMode } = (0, import_react9.useContext)(WeaverseContext);
445
+ (0, import_react9.useEffect)(() => {
446
+ if (token) {
447
+ let params = new URLSearchParams({
448
+ access_token: token,
449
+ fields: "id,media_type,caption,media_url,permalink"
450
+ });
451
+ fetch(`${INSTAGRAM_API}/me/media?${params.toString()}`).then((res) => res.json()).then((res) => {
452
+ if (res.error) {
453
+ setError(res);
454
+ } else {
455
+ setError(null);
456
+ setMedia([...res.data]);
457
+ }
458
+ }).catch(console.error);
459
+ }
460
+ }, [token]);
461
+ if (!token || error) {
462
+ return /* @__PURE__ */ import_react9.default.createElement("div", __spreadValues({
463
+ ref
464
+ }, rest), /* @__PURE__ */ import_react9.default.createElement(Placeholder_default, {
465
+ element: "Instagram"
466
+ }, !token ? "Connect your Instagram account to display photos on your site." : "Invalid or expired token!"));
467
+ }
468
+ let style = {
469
+ "--wv-ig-images-per-row": imagesPerRow,
470
+ "--wv-ig-images-gap": gap
471
+ };
472
+ return /* @__PURE__ */ import_react9.default.createElement("div", __spreadProps(__spreadValues({
473
+ ref
474
+ }, rest), {
475
+ style
476
+ }), /* @__PURE__ */ import_react9.default.createElement("div", {
477
+ className: "wv-ig-media-wrapper"
478
+ }, media.slice(0, numberOfImages).map((item) => {
479
+ let linkProps;
480
+ if (!isDesignMode) {
481
+ linkProps = { href: item.permalink, target: "_blank" };
482
+ }
483
+ return /* @__PURE__ */ import_react9.default.createElement("a", __spreadValues({
484
+ key: item.id
485
+ }, linkProps), /* @__PURE__ */ import_react9.default.createElement("img", {
440
486
  alt: item.caption,
441
487
  src: item.media_url
442
488
  }));
443
- }));
489
+ })));
444
490
  });
445
491
  Instagram.defaultProps = {
446
492
  token: "",
447
- numberOfImages: [12],
448
- imagesPerRow: [4],
493
+ username: "",
494
+ numberOfImages: 8,
495
+ imagesPerRow: 4,
496
+ gap: 0,
449
497
  css: {
450
498
  "@desktop": {
451
- display: "grid",
452
- gridTemplateColumns: "repeat(4, 1fr)",
453
- "& .wv-instagram-item": {
454
- width: "100%",
455
- height: "100%",
456
- backgroundColor: "red",
457
- "& img": {
458
- objectFit: "contain"
499
+ ".wv-ig-media-wrapper": {
500
+ overflow: "hidden",
501
+ maxWidth: "100%",
502
+ maxHeight: "100%",
503
+ display: "grid",
504
+ gridTemplateColumns: "repeat(var(--wv-ig-images-per-row, 4), 1fr)",
505
+ gap: "var(--wv-ig-images-gap, 0px)",
506
+ img: {
507
+ aspectRatio: "1 / 1",
508
+ width: "100%",
509
+ height: "100%",
510
+ objectFit: "cover"
459
511
  }
460
512
  }
461
513
  }
@@ -512,13 +564,13 @@ var createRootContext = (configs) => {
512
564
  });
513
565
  return rootContext;
514
566
  };
515
- var WeaverseContext = (0, import_react9.createContext)({});
567
+ var WeaverseContext = (0, import_react10.createContext)({});
516
568
  var WeaverseContextProvider = WeaverseContext.Provider;
517
569
  var WeaverseContextConsumer = WeaverseContext.Consumer;
518
570
 
519
571
  // src/renderer.tsx
520
572
  var import_core2 = require("@weaverse/core");
521
- var import_react10 = __toESM(require("react"));
573
+ var import_react11 = __toESM(require("react"));
522
574
 
523
575
  // src/utils/index.ts
524
576
  var shortCssObject = (css) => {
@@ -546,9 +598,9 @@ function generateItemClass(instance, stitchesInstance) {
546
598
  // src/renderer.tsx
547
599
  var WeaverseRoot = ({ context }) => {
548
600
  var _a;
549
- let [, setData] = (0, import_react10.useState)(context.projectData);
550
- let rootRef = (0, import_react10.useRef)();
551
- (0, import_react10.useEffect)(() => {
601
+ let [, setData] = (0, import_react11.useState)(context.projectData);
602
+ let rootRef = (0, import_react11.useRef)();
603
+ (0, import_react11.useEffect)(() => {
552
604
  let update = () => setData({});
553
605
  context.subscribe(update);
554
606
  if (context.projectData) {
@@ -561,21 +613,21 @@ var WeaverseRoot = ({ context }) => {
561
613
  }, []);
562
614
  let eventHandlers = ((_a = context == null ? void 0 : context.studioBridge) == null ? void 0 : _a.eventHandlers) || {};
563
615
  let themeClass = context.stitchesInstance.theme.className;
564
- return /* @__PURE__ */ import_react10.default.createElement("div", __spreadProps(__spreadValues({
616
+ return /* @__PURE__ */ import_react11.default.createElement("div", __spreadProps(__spreadValues({
565
617
  className: `weaverse-content-root ${themeClass}`
566
618
  }, eventHandlers), {
567
619
  ref: rootRef
568
- }), /* @__PURE__ */ import_react10.default.createElement(WeaverseContextProvider, {
620
+ }), /* @__PURE__ */ import_react11.default.createElement(WeaverseContextProvider, {
569
621
  value: context
570
- }, /* @__PURE__ */ import_react10.default.createElement(ItemInstance, {
622
+ }, /* @__PURE__ */ import_react11.default.createElement(ItemInstance, {
571
623
  id: context.projectData.rootId || 0
572
624
  })));
573
625
  };
574
626
  var ItemComponent = ({ instance }) => {
575
- let { stitchesInstance, elementInstances } = (0, import_react10.useContext)(WeaverseContext);
576
- let [data, setData] = (0, import_react10.useState)(instance.data);
627
+ let { stitchesInstance, elementInstances } = (0, import_react11.useContext)(WeaverseContext);
628
+ let [data, setData] = (0, import_react11.useState)(instance.data);
577
629
  let _a = data, { id, type, childIds = [], css, className } = _a, rest = __objRest(_a, ["id", "type", "childIds", "css", "className"]);
578
- (0, import_react10.useEffect)(() => {
630
+ (0, import_react11.useEffect)(() => {
579
631
  var _a2;
580
632
  let update = (data2) => setData(__spreadValues({}, data2));
581
633
  instance.subscribe(update);
@@ -595,12 +647,12 @@ var ItemComponent = ({ instance }) => {
595
647
  if (Component.$$typeof === Symbol.for("react.forward_ref")) {
596
648
  rest.ref = instance.ref;
597
649
  }
598
- return /* @__PURE__ */ import_react10.default.createElement(Component, __spreadValues({
650
+ return /* @__PURE__ */ import_react11.default.createElement(Component, __spreadValues({
599
651
  key: id,
600
652
  "data-wv-type": type,
601
653
  "data-wv-id": id,
602
654
  className: generateItemClass(instance, stitchesInstance)
603
- }, rest), childIds.map((id2) => /* @__PURE__ */ import_react10.default.createElement(ItemInstance, {
655
+ }, rest), childIds.map((id2) => /* @__PURE__ */ import_react11.default.createElement(ItemInstance, {
604
656
  key: id2,
605
657
  id: id2
606
658
  })));
@@ -608,15 +660,15 @@ var ItemComponent = ({ instance }) => {
608
660
  return null;
609
661
  };
610
662
  var ItemInstance = ({ id }) => {
611
- let context = (0, import_react10.useContext)(WeaverseContext);
663
+ let context = (0, import_react11.useContext)(WeaverseContext);
612
664
  let { itemInstances } = context;
613
665
  let instance = itemInstances.get(id);
614
666
  if (!instance) {
615
- return /* @__PURE__ */ import_react10.default.createElement("div", {
667
+ return /* @__PURE__ */ import_react11.default.createElement("div", {
616
668
  style: { display: "none" }
617
669
  }, "Item instance ", id, " not found");
618
670
  }
619
- return /* @__PURE__ */ import_react10.default.createElement(ItemComponent, {
671
+ return /* @__PURE__ */ import_react11.default.createElement(ItemComponent, {
620
672
  instance
621
673
  });
622
674
  };
package/dist/index.mjs CHANGED
@@ -382,50 +382,102 @@ Video.defaultProps = {
382
382
  var video_default = Video;
383
383
 
384
384
  // src/elements/instagram.tsx
385
- import React10, { forwardRef as forwardRef8, useContext as useContext3, useEffect as useEffect2, useState } from "react";
386
- var Instagram = forwardRef8((props, ref) => {
387
- const { stitchesInstance } = useContext3(WeaverseContext);
388
- const _a = props, { token, numberOfImages, imagesPerRow, className } = _a, rest = __objRest(_a, ["token", "numberOfImages", "imagesPerRow", "className"]);
385
+ import React11, { forwardRef as forwardRef9, useContext as useContext3, useEffect as useEffect2, useState } from "react";
386
+
387
+ // src/elements/shared/Placeholder.tsx
388
+ import React10, { forwardRef as forwardRef8 } from "react";
389
+ var Placeholder = forwardRef8((props, ref) => {
390
+ let _a = props, { element, children } = _a, rest = __objRest(_a, ["element", "children"]);
391
+ let style = {
392
+ height: "100%",
393
+ display: "flex",
394
+ flexDirection: "column",
395
+ alignItems: "center",
396
+ justifyContent: "center",
397
+ color: "#374151"
398
+ };
399
+ return /* @__PURE__ */ React10.createElement("div", __spreadValues({
400
+ style,
401
+ ref
402
+ }, rest), /* @__PURE__ */ React10.createElement("div", {
403
+ style: { fontWeight: 600, marginBottom: "10px" }
404
+ }, element), /* @__PURE__ */ React10.createElement("div", null, children));
405
+ });
406
+ var Placeholder_default = Placeholder;
407
+
408
+ // src/elements/instagram.tsx
409
+ var INSTAGRAM_API = "https://graph.instagram.com";
410
+ var Instagram = forwardRef9((props, ref) => {
411
+ const _a = props, { token, username, numberOfImages, imagesPerRow, gap } = _a, rest = __objRest(_a, ["token", "username", "numberOfImages", "imagesPerRow", "gap"]);
389
412
  const [media, setMedia] = useState([]);
413
+ const [error, setError] = useState(null);
414
+ let { isDesignMode } = useContext3(WeaverseContext);
390
415
  useEffect2(() => {
391
- const url = `https://graph.instagram.com/me/media?fields=id,media_type,caption,media_url&access_token=${token}`;
392
- fetch(url).then((res) => res.json()).then((res) => {
393
- setMedia(res.data);
394
- });
416
+ if (token) {
417
+ let params = new URLSearchParams({
418
+ access_token: token,
419
+ fields: "id,media_type,caption,media_url,permalink"
420
+ });
421
+ fetch(`${INSTAGRAM_API}/me/media?${params.toString()}`).then((res) => res.json()).then((res) => {
422
+ if (res.error) {
423
+ setError(res);
424
+ } else {
425
+ setError(null);
426
+ setMedia([...res.data]);
427
+ }
428
+ }).catch(console.error);
429
+ }
395
430
  }, [token]);
396
- const css = {
397
- gridTemplateColumns: `repeat(${imagesPerRow[0] || 1}, 1fr)`
431
+ if (!token || error) {
432
+ return /* @__PURE__ */ React11.createElement("div", __spreadValues({
433
+ ref
434
+ }, rest), /* @__PURE__ */ React11.createElement(Placeholder_default, {
435
+ element: "Instagram"
436
+ }, !token ? "Connect your Instagram account to display photos on your site." : "Invalid or expired token!"));
437
+ }
438
+ let style = {
439
+ "--wv-ig-images-per-row": imagesPerRow,
440
+ "--wv-ig-images-gap": gap
398
441
  };
399
- const { className: instagramClass = "" } = stitchesInstance.css(css)();
400
- return /* @__PURE__ */ React10.createElement("div", __spreadValues({
401
- className: `${className} ${instagramClass}`,
442
+ return /* @__PURE__ */ React11.createElement("div", __spreadProps(__spreadValues({
402
443
  ref
403
- }, rest), !token ? "Token is empty" : media.map((item, key) => {
404
- return /* @__PURE__ */ React10.createElement("div", {
405
- key,
406
- className: "wv-instagram-item"
407
- }, /* @__PURE__ */ React10.createElement("img", {
408
- width: "100%",
409
- height: "100%",
444
+ }, rest), {
445
+ style
446
+ }), /* @__PURE__ */ React11.createElement("div", {
447
+ className: "wv-ig-media-wrapper"
448
+ }, media.slice(0, numberOfImages).map((item) => {
449
+ let linkProps;
450
+ if (!isDesignMode) {
451
+ linkProps = { href: item.permalink, target: "_blank" };
452
+ }
453
+ return /* @__PURE__ */ React11.createElement("a", __spreadValues({
454
+ key: item.id
455
+ }, linkProps), /* @__PURE__ */ React11.createElement("img", {
410
456
  alt: item.caption,
411
457
  src: item.media_url
412
458
  }));
413
- }));
459
+ })));
414
460
  });
415
461
  Instagram.defaultProps = {
416
462
  token: "",
417
- numberOfImages: [12],
418
- imagesPerRow: [4],
463
+ username: "",
464
+ numberOfImages: 8,
465
+ imagesPerRow: 4,
466
+ gap: 0,
419
467
  css: {
420
468
  "@desktop": {
421
- display: "grid",
422
- gridTemplateColumns: "repeat(4, 1fr)",
423
- "& .wv-instagram-item": {
424
- width: "100%",
425
- height: "100%",
426
- backgroundColor: "red",
427
- "& img": {
428
- objectFit: "contain"
469
+ ".wv-ig-media-wrapper": {
470
+ overflow: "hidden",
471
+ maxWidth: "100%",
472
+ maxHeight: "100%",
473
+ display: "grid",
474
+ gridTemplateColumns: "repeat(var(--wv-ig-images-per-row, 4), 1fr)",
475
+ gap: "var(--wv-ig-images-gap, 0px)",
476
+ img: {
477
+ aspectRatio: "1 / 1",
478
+ width: "100%",
479
+ height: "100%",
480
+ objectFit: "cover"
429
481
  }
430
482
  }
431
483
  }
@@ -488,7 +540,7 @@ var WeaverseContextConsumer = WeaverseContext.Consumer;
488
540
 
489
541
  // src/renderer.tsx
490
542
  import { isBrowser } from "@weaverse/core";
491
- import React11, { useContext as useContext4, useEffect as useEffect3, useRef, useState as useState2 } from "react";
543
+ import React12, { useContext as useContext4, useEffect as useEffect3, useRef, useState as useState2 } from "react";
492
544
 
493
545
  // src/utils/index.ts
494
546
  var shortCssObject = (css) => {
@@ -531,13 +583,13 @@ var WeaverseRoot = ({ context }) => {
531
583
  }, []);
532
584
  let eventHandlers = ((_a = context == null ? void 0 : context.studioBridge) == null ? void 0 : _a.eventHandlers) || {};
533
585
  let themeClass = context.stitchesInstance.theme.className;
534
- return /* @__PURE__ */ React11.createElement("div", __spreadProps(__spreadValues({
586
+ return /* @__PURE__ */ React12.createElement("div", __spreadProps(__spreadValues({
535
587
  className: `weaverse-content-root ${themeClass}`
536
588
  }, eventHandlers), {
537
589
  ref: rootRef
538
- }), /* @__PURE__ */ React11.createElement(WeaverseContextProvider, {
590
+ }), /* @__PURE__ */ React12.createElement(WeaverseContextProvider, {
539
591
  value: context
540
- }, /* @__PURE__ */ React11.createElement(ItemInstance, {
592
+ }, /* @__PURE__ */ React12.createElement(ItemInstance, {
541
593
  id: context.projectData.rootId || 0
542
594
  })));
543
595
  };
@@ -565,12 +617,12 @@ var ItemComponent = ({ instance }) => {
565
617
  if (Component.$$typeof === Symbol.for("react.forward_ref")) {
566
618
  rest.ref = instance.ref;
567
619
  }
568
- return /* @__PURE__ */ React11.createElement(Component, __spreadValues({
620
+ return /* @__PURE__ */ React12.createElement(Component, __spreadValues({
569
621
  key: id,
570
622
  "data-wv-type": type,
571
623
  "data-wv-id": id,
572
624
  className: generateItemClass(instance, stitchesInstance)
573
- }, rest), childIds.map((id2) => /* @__PURE__ */ React11.createElement(ItemInstance, {
625
+ }, rest), childIds.map((id2) => /* @__PURE__ */ React12.createElement(ItemInstance, {
574
626
  key: id2,
575
627
  id: id2
576
628
  })));
@@ -582,11 +634,11 @@ var ItemInstance = ({ id }) => {
582
634
  let { itemInstances } = context;
583
635
  let instance = itemInstances.get(id);
584
636
  if (!instance) {
585
- return /* @__PURE__ */ React11.createElement("div", {
637
+ return /* @__PURE__ */ React12.createElement("div", {
586
638
  style: { display: "none" }
587
639
  }, "Item instance ", id, " not found");
588
640
  }
589
- return /* @__PURE__ */ React11.createElement(ItemComponent, {
641
+ return /* @__PURE__ */ React12.createElement(ItemComponent, {
590
642
  instance
591
643
  });
592
644
  };
package/package.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "0.6.17",
2
+ "version": "0.6.18",
3
3
  "license": "MIT",
4
4
  "main": "dist/index.js",
5
5
  "typings": "dist/index.d.ts",
@@ -31,6 +31,6 @@
31
31
  "name": "@weaverse/react",
32
32
  "author": "Weaverse Team",
33
33
  "dependencies": {
34
- "@weaverse/core": "0.6.17"
34
+ "@weaverse/core": "0.6.18"
35
35
  }
36
36
  }