@decentnetwork/beagle-ui 0.2.33 → 0.2.35

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.
Files changed (2) hide show
  1. package/dist/beagle-ui.js +61 -2
  2. package/package.json +1 -1
package/dist/beagle-ui.js CHANGED
@@ -1,4 +1,4 @@
1
- export const BEAGLE_UI_VERSION = "0.2.33";
1
+ export const BEAGLE_UI_VERSION = "0.2.35";
2
2
  // src/icons.jsx
3
3
  var ICON_PATHS = {
4
4
  // ---- tab bar (the four must feel like one set) ----
@@ -1712,6 +1712,39 @@ ${lines}`, { assistant: { kind: "adopt", rows: fresh } }));
1712
1712
  return { thread, handle, removeFriends, adoptServicePeers };
1713
1713
  }
1714
1714
 
1715
+ // src/request-avatar.js
1716
+ var REQUEST_AVATAR_HOST = "ens-gateway.beaglechat.workers.dev";
1717
+ var MAX_URL = 2048;
1718
+ function requestAvatarUrl(r) {
1719
+ const u = r && r.avatarUrl;
1720
+ if (typeof u !== "string" || !u || u.length > MAX_URL)
1721
+ return null;
1722
+ let parsed;
1723
+ try {
1724
+ parsed = new URL(u);
1725
+ } catch {
1726
+ return null;
1727
+ }
1728
+ if (parsed.protocol !== "https:" || parsed.host !== REQUEST_AVATAR_HOST)
1729
+ return null;
1730
+ if (parsed.username || parsed.password)
1731
+ return null;
1732
+ return parsed.href;
1733
+ }
1734
+ function requestPunkId(r) {
1735
+ const p = r && r.punkId;
1736
+ return typeof p === "number" && Number.isInteger(p) && p >= 0 ? p : null;
1737
+ }
1738
+ function requestAvatarSource(r, skipUrl = false) {
1739
+ const url = skipUrl ? null : requestAvatarUrl(r);
1740
+ if (url)
1741
+ return { kind: "url", url };
1742
+ const id = requestPunkId(r);
1743
+ if (id != null)
1744
+ return { kind: "punk", id };
1745
+ return { kind: "ens" };
1746
+ }
1747
+
1715
1748
  // src/chat.jsx
1716
1749
  var DK_CMD_HIST_KEY = "beagle.assistant.history";
1717
1750
  var DK_CMD_HIST_MAX = 50;
@@ -1756,7 +1789,7 @@ function RequestsBlock({ T, requests, onAct }) {
1756
1789
  display: "flex",
1757
1790
  flexDirection: "column",
1758
1791
  gap: 8
1759
- } }, /* @__PURE__ */ React.createElement("div", { style: { display: "flex", alignItems: "center", gap: 8 } }, /* @__PURE__ */ React.createElement(DkEnsAvatar, { userid: r.userid || r.id, name: r.name, fallbackSeed: r.carrier, size: 30, radius: 7 }), /* @__PURE__ */ React.createElement("div", { style: { minWidth: 0, flex: 1 } }, r.name ? /* @__PURE__ */ React.createElement("div", { style: {
1792
+ } }, /* @__PURE__ */ React.createElement("div", { style: { display: "flex", alignItems: "center", gap: 8 } }, /* @__PURE__ */ React.createElement(DkRequestAvatar, { r, size: 30, radius: 7 }), /* @__PURE__ */ React.createElement("div", { style: { minWidth: 0, flex: 1 } }, r.name ? /* @__PURE__ */ React.createElement("div", { style: {
1760
1793
  fontFamily: "var(--ui)",
1761
1794
  fontSize: 13,
1762
1795
  fontWeight: 600,
@@ -1773,6 +1806,32 @@ function RequestsBlock({ T, requests, onAct }) {
1773
1806
  paddingLeft: 8
1774
1807
  } }, r.descr), failed[r.id] && /* @__PURE__ */ React.createElement("div", { style: { fontFamily: "var(--ui)", fontSize: 11, color: "var(--danger)" } }, failed[r.id]), /* @__PURE__ */ React.createElement("div", { style: { display: "flex", gap: 6 } }, /* @__PURE__ */ React.createElement(Btn, { tone: "ok", icon: "check", size: "sm", onClick: () => act(r, "accept"), style: { flex: 1 } }, T.accept), /* @__PURE__ */ React.createElement(Btn, { tone: "danger", icon: "x", size: "sm", onClick: () => act(r, "reject"), style: { flex: 1 } }, T.reject))))));
1775
1808
  }
1809
+ function DkRequestAvatar({ r, size, radius }) {
1810
+ const [urlBroken, setUrlBroken] = React.useState(false);
1811
+ const url = requestAvatarUrl(r);
1812
+ React.useEffect(() => {
1813
+ setUrlBroken(false);
1814
+ }, [url]);
1815
+ const src = requestAvatarSource(r, urlBroken);
1816
+ const seed = r.carrier || r.userid || r.id;
1817
+ if (src.kind === "url") {
1818
+ return /* @__PURE__ */ React.createElement(
1819
+ "img",
1820
+ {
1821
+ src: src.url,
1822
+ alt: "",
1823
+ width: size,
1824
+ height: size,
1825
+ referrerPolicy: "no-referrer",
1826
+ onError: () => setUrlBroken(true),
1827
+ style: { width: size, height: size, borderRadius: radius, objectFit: "cover", flexShrink: 0, background: "var(--panel-2)" }
1828
+ }
1829
+ );
1830
+ }
1831
+ if (src.kind === "punk")
1832
+ return /* @__PURE__ */ React.createElement(DkPunkAvatar, { id: src.id, size, radius, fallbackSeed: seed });
1833
+ return /* @__PURE__ */ React.createElement(DkEnsAvatar, { userid: r.userid || r.id, name: r.name, fallbackSeed: r.carrier, size, radius });
1834
+ }
1776
1835
  function PeerRow({ peer, T, active, onClick, muted, isProtocol, fix }) {
1777
1836
  const name = peer.alias || peer.userId;
1778
1837
  const row = rosterRow(peer, isProtocol || (() => false), fix);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@decentnetwork/beagle-ui",
3
- "version": "0.2.33",
3
+ "version": "0.2.35",
4
4
  "description": "The Beagle chat UI, minus the machine it runs on — shared by the desktop install and the browser build.",
5
5
  "license": "MIT",
6
6
  "type": "module",