@decentnetwork/beagle-ui 0.2.37 → 0.2.39
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/beagle-ui.js +67 -13
- package/package.json +1 -1
package/dist/beagle-ui.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export const BEAGLE_UI_VERSION = "0.2.
|
|
1
|
+
export const BEAGLE_UI_VERSION = "0.2.39";
|
|
2
2
|
// src/icons.jsx
|
|
3
3
|
var ICON_PATHS = {
|
|
4
4
|
// ---- tab bar (the four must feel like one set) ----
|
|
@@ -306,6 +306,33 @@ function protocolSummary(text, max = 72) {
|
|
|
306
306
|
return s.length > max ? s.slice(0, max - 1) + "\u2026" : s;
|
|
307
307
|
}
|
|
308
308
|
|
|
309
|
+
// src/exit-host.js
|
|
310
|
+
function hostHasExits(d) {
|
|
311
|
+
if (!d || typeof d !== "object")
|
|
312
|
+
return false;
|
|
313
|
+
if (d.exitsSupported === false)
|
|
314
|
+
return false;
|
|
315
|
+
return !!d.exitFeature && typeof d.exitFeature === "object";
|
|
316
|
+
}
|
|
317
|
+
function desktopPollPath({ wantExits, opened, supported }) {
|
|
318
|
+
if (!wantExits || supported !== true)
|
|
319
|
+
return "/api/desktop";
|
|
320
|
+
return opened ? "/api/desktop?exits=1&open=1" : "/api/desktop?exits=1";
|
|
321
|
+
}
|
|
322
|
+
function exitControls({ exitFeature, routeFallback, exits }) {
|
|
323
|
+
const has = hostHasExits({ exitFeature });
|
|
324
|
+
const list = Array.isArray(exits) ? exits : [];
|
|
325
|
+
const anyFailed = list.some((r) => (r.nodes || []).some((n) => n.status === "failed"));
|
|
326
|
+
return {
|
|
327
|
+
refresh: has && list.length > 0,
|
|
328
|
+
reconnect: has,
|
|
329
|
+
reconnectAll: has && anyFailed,
|
|
330
|
+
noExitNotice: has && exitFeature.available === false,
|
|
331
|
+
fallbackNotice: has && !!(routeFallback && routeFallback.from),
|
|
332
|
+
anyFailed: has && anyFailed
|
|
333
|
+
};
|
|
334
|
+
}
|
|
335
|
+
|
|
309
336
|
// src/data-ipc.jsx
|
|
310
337
|
function dkHash(s) {
|
|
311
338
|
let h = 2166136261;
|
|
@@ -452,6 +479,8 @@ var dkApi = {
|
|
|
452
479
|
// that failed three times in a row are never probed again on their own.
|
|
453
480
|
reconnectExit: (ip) => dkPost("/api/exits/reconnect", { ip }),
|
|
454
481
|
reconnectAllExits: () => dkPost("/api/exits/reconnect", { all: true }),
|
|
482
|
+
// Every exit once, now, failed ones included.
|
|
483
|
+
refreshExits: () => dkPost("/api/exits/refresh", {}),
|
|
455
484
|
// Used by the browser's welcome flow, which also picks an avatar and marks
|
|
456
485
|
// first run done. Harmless where there is no welcome flow: nothing calls it.
|
|
457
486
|
setProfileFull: (p) => dkPost("/api/set-profile", p),
|
|
@@ -591,6 +620,8 @@ function useDaemonData(opts) {
|
|
|
591
620
|
const wantExits = !!(opts && opts.exits);
|
|
592
621
|
const wantExitsRef = React.useRef(wantExits);
|
|
593
622
|
wantExitsRef.current = wantExits;
|
|
623
|
+
const exitsOpenedRef = React.useRef(false);
|
|
624
|
+
const exitsSupportedRef = React.useRef(null);
|
|
594
625
|
const [snap, setSnap] = React.useState({
|
|
595
626
|
me: DK_ME_FALLBACK,
|
|
596
627
|
peers: [],
|
|
@@ -607,7 +638,14 @@ function useDaemonData(opts) {
|
|
|
607
638
|
const refresh = React.useCallback(async () => {
|
|
608
639
|
var _a, _b, _c;
|
|
609
640
|
try {
|
|
610
|
-
const
|
|
641
|
+
const path = desktopPollPath({
|
|
642
|
+
wantExits: wantExitsRef.current,
|
|
643
|
+
opened: exitsOpenedRef.current,
|
|
644
|
+
supported: exitsSupportedRef.current
|
|
645
|
+
});
|
|
646
|
+
if (path.includes("open=1"))
|
|
647
|
+
exitsOpenedRef.current = false;
|
|
648
|
+
const d = await dkGet(path);
|
|
611
649
|
if (d && d.locked) {
|
|
612
650
|
setSnap((s) => ({ ...s, locked: true, loaded: true }));
|
|
613
651
|
return;
|
|
@@ -618,6 +656,13 @@ function useDaemonData(opts) {
|
|
|
618
656
|
}, 300);
|
|
619
657
|
return;
|
|
620
658
|
}
|
|
659
|
+
const had = exitsSupportedRef.current;
|
|
660
|
+
exitsSupportedRef.current = hostHasExits(d);
|
|
661
|
+
if (had !== true && exitsSupportedRef.current && wantExitsRef.current && exitsOpenedRef.current) {
|
|
662
|
+
setTimeout(() => {
|
|
663
|
+
refreshRef.current && refreshRef.current();
|
|
664
|
+
}, 0);
|
|
665
|
+
}
|
|
621
666
|
setSnap({
|
|
622
667
|
locked: false,
|
|
623
668
|
me: d.me || DK_ME_FALLBACK,
|
|
@@ -639,8 +684,10 @@ function useDaemonData(opts) {
|
|
|
639
684
|
return () => clearInterval(t);
|
|
640
685
|
}, [refresh]);
|
|
641
686
|
React.useEffect(() => {
|
|
642
|
-
if (wantExits)
|
|
687
|
+
if (wantExits) {
|
|
688
|
+
exitsOpenedRef.current = true;
|
|
643
689
|
refresh();
|
|
690
|
+
}
|
|
644
691
|
}, [wantExits, refresh]);
|
|
645
692
|
const inFlight = React.useRef(/* @__PURE__ */ new Set());
|
|
646
693
|
const cache = React.useRef({});
|
|
@@ -6209,7 +6256,7 @@ function ExitCard({ T, region, activeExit, onSetExit, onReconnect, featureOn })
|
|
|
6209
6256
|
const stuck = n.online && !n.reachable;
|
|
6210
6257
|
const failed = n.status === "failed";
|
|
6211
6258
|
const usable = n.reachable && featureOn !== false;
|
|
6212
|
-
return /* @__PURE__ */ React.createElement("div", { key: n.ip, className: "dk-wrap", style: { display: "flex", alignItems: "center", gap: 12, rowGap: 6, padding: "10px 14px", borderBottom: i < region.nodes.length - 1 ? "1px solid var(--line)" : "none", background: active ? "color-mix(in oklab, var(--accent), transparent 92%)" : "transparent" } }, /* @__PURE__ */ React.createElement(StatusDot, { online: n.reachable }), /* @__PURE__ */ React.createElement(Mono, { size: 13, copy: n.ip }, n.ip), /* @__PURE__ */ React.createElement("span", { style: { fontFamily: "var(--mono)", fontSize: 11, color: "var(--faint)" } }, n.host), /* @__PURE__ */ React.createElement("div", { style: { flex: 1 } }), n.reachable ? /* @__PURE__ */ React.createElement("span", { style: { fontFamily: "var(--mono)", fontSize: 11.5, color: n.ping > 200 ? "var(--warn)" : "var(--dim)" } }, n.ping, "ms") : failed ? /* @__PURE__ */ React.createElement(Tag, { tone: "danger", title: "Failed 3 checks in a row \u2014 no longer checked
|
|
6259
|
+
return /* @__PURE__ */ React.createElement("div", { key: n.ip, className: "dk-wrap", style: { display: "flex", alignItems: "center", gap: 12, rowGap: 6, padding: "10px 14px", borderBottom: i < region.nodes.length - 1 ? "1px solid var(--line)" : "none", background: active ? "color-mix(in oklab, var(--accent), transparent 92%)" : "transparent" } }, /* @__PURE__ */ React.createElement(StatusDot, { online: n.reachable }), /* @__PURE__ */ React.createElement(Mono, { size: 13, copy: n.ip }, n.ip), /* @__PURE__ */ React.createElement("span", { style: { fontFamily: "var(--mono)", fontSize: 11, color: "var(--faint)" } }, n.host), /* @__PURE__ */ React.createElement("div", { style: { flex: 1 } }), n.reachable ? /* @__PURE__ */ React.createElement("span", { style: { fontFamily: "var(--mono)", fontSize: 11.5, color: n.ping > 200 ? "var(--warn)" : "var(--dim)" } }, n.ping, "ms") : failed ? /* @__PURE__ */ React.createElement(Tag, { tone: "danger", title: "Failed 3 checks in a row \u2014 no longer checked; Reconnect to try again" }, T.exitFailed || "failed") : n.status === "unknown" ? /* @__PURE__ */ React.createElement(Tag, { tone: "off" }, T.exitNotChecked || "not checked") : stuck ? /* @__PURE__ */ React.createElement(Tag, { tone: "warn", title: "Announces online but IP won't pass \u2014 session desync or NAT-blocked" }, "online \xB7 no route") : n.status === "down" ? /* @__PURE__ */ React.createElement(Tag, { tone: "warn", title: "No answer \u2014 checked again only when you open this panel or press Refresh; 3 in a row and it is no longer checked" }, T.exitDown || "down", " \xB7 ", n.fails, "/3") : /* @__PURE__ */ React.createElement(Tag, { tone: "off" }, "offline"), failed && onReconnect ? /* @__PURE__ */ React.createElement(ReconnectBtn, { T, ip: n.ip, onReconnect }) : active ? /* @__PURE__ */ React.createElement(Btn, { tone: "ok", icon: "check", size: "sm", onClick: () => onSetExit(null) }, T.routing) : /* @__PURE__ */ React.createElement(Btn, { size: "sm", icon: "route", disabled: !usable, onClick: () => usable && onSetExit(n.ip), style: { opacity: usable ? 1 : 0.4 } }, T.routeThru));
|
|
6213
6260
|
})));
|
|
6214
6261
|
}
|
|
6215
6262
|
function LanEnableCard({ backend, onArm, onCancel }) {
|
|
@@ -6313,14 +6360,15 @@ function LanEnableCard({ backend, onArm, onCancel }) {
|
|
|
6313
6360
|
"\u53D6\u6D88,\u6062\u590D\u6D88\u606F"
|
|
6314
6361
|
)));
|
|
6315
6362
|
}
|
|
6316
|
-
function NetworkTab({ T, me, peers, exits, activeExit, exitFeature, routeFallback, onReconnectExit, reqCount, onSetExit, onOpenChat, backend, onArmLan, onCancelLan }) {
|
|
6317
|
-
const
|
|
6318
|
-
const
|
|
6363
|
+
function NetworkTab({ T, me, peers, exits, activeExit, exitFeature, routeFallback, onReconnectExit, onRefreshExits, reqCount, onSetExit, onOpenChat, backend, onArmLan, onCancelLan }) {
|
|
6364
|
+
const ctl = exitControls({ exitFeature, routeFallback, exits });
|
|
6365
|
+
const featureOn = !ctl.noExitNotice;
|
|
6366
|
+
const anyFailed = ctl.anyFailed;
|
|
6319
6367
|
if (backend && backend.switchable && !backend.hasVirtualLan) {
|
|
6320
6368
|
return /* @__PURE__ */ React.createElement("div", { style: { flex: 1, overflow: "auto", background: "var(--bg)" } }, /* @__PURE__ */ React.createElement("div", { className: "dk-page", style: { maxWidth: 1040, margin: "0 auto", padding: "24px 28px 60px", display: "flex", flexDirection: "column", gap: 26 } }, /* @__PURE__ */ React.createElement(MyNode, { T, me, activeExit, peers, reqCount }), /* @__PURE__ */ React.createElement(LanEnableCard, { backend, onArm: onArmLan, onCancel: onCancelLan })));
|
|
6321
6369
|
}
|
|
6322
6370
|
const lanless = !!backend && backend.hasVirtualLan === false;
|
|
6323
|
-
return /* @__PURE__ */ React.createElement("div", { style: { flex: 1, overflow: "auto", background: "var(--bg)" } }, /* @__PURE__ */ React.createElement("div", { className: "dk-page", style: { maxWidth: 1040, margin: "0 auto", padding: "24px 28px 60px", display: "flex", flexDirection: "column", gap: 26 } }, /* @__PURE__ */ React.createElement(MyNode, { T, me, activeExit, peers, reqCount }), /* @__PURE__ */ React.createElement("div", { style: { display: "flex", flexDirection: "column", gap: 12 } }, /* @__PURE__ */ React.createElement(Section, { label: T.peerRouting, count: peers.length }), /* @__PURE__ */ React.createElement(PeerTable, { T, peers, onOpenChat }), !peers.length && /* @__PURE__ */ React.createElement("div", { style: { padding: "14px 16px", borderRadius: 11, border: "1px dashed var(--line)", fontFamily: "var(--ui)", fontSize: 12.5, color: "var(--faint)" } }, T.noPeersYet || "No friends yet \u2014 add one from Chat and it shows up here with its route.")), lanless ? null : /* @__PURE__ */ React.createElement("div", { style: { display: "flex", flexDirection: "column", gap: 12 } }, /* @__PURE__ */ React.createElement(Section, { label: T.exitNodes, trailing: /* @__PURE__ */ React.createElement("div", { style: { display: "flex", gap: 6 } },
|
|
6371
|
+
return /* @__PURE__ */ React.createElement("div", { style: { flex: 1, overflow: "auto", background: "var(--bg)" } }, /* @__PURE__ */ React.createElement("div", { className: "dk-page", style: { maxWidth: 1040, margin: "0 auto", padding: "24px 28px 60px", display: "flex", flexDirection: "column", gap: 26 } }, /* @__PURE__ */ React.createElement(MyNode, { T, me, activeExit, peers, reqCount }), /* @__PURE__ */ React.createElement("div", { style: { display: "flex", flexDirection: "column", gap: 12 } }, /* @__PURE__ */ React.createElement(Section, { label: T.peerRouting, count: peers.length }), /* @__PURE__ */ React.createElement(PeerTable, { T, peers, onOpenChat }), !peers.length && /* @__PURE__ */ React.createElement("div", { style: { padding: "14px 16px", borderRadius: 11, border: "1px dashed var(--line)", fontFamily: "var(--ui)", fontSize: 12.5, color: "var(--faint)" } }, T.noPeersYet || "No friends yet \u2014 add one from Chat and it shows up here with its route.")), lanless ? null : /* @__PURE__ */ React.createElement("div", { style: { display: "flex", flexDirection: "column", gap: 12 } }, /* @__PURE__ */ React.createElement(Section, { label: T.exitNodes, trailing: /* @__PURE__ */ React.createElement("div", { style: { display: "flex", gap: 6 } }, ctl.refresh && onRefreshExits && /* @__PURE__ */ React.createElement(ReconnectBtn, { T, ip: null, onReconnect: () => onRefreshExits(), label: T.exitRefresh || "Refresh" }), ctl.reconnectAll && onReconnectExit && /* @__PURE__ */ React.createElement(ReconnectBtn, { T, ip: null, onReconnect: onReconnectExit, label: T.exitReconnectAll || "Reconnect all" }), /* @__PURE__ */ React.createElement(Btn, { icon: "plus", size: "sm" }, T.addExit)) }), ctl.noExitNotice && /* @__PURE__ */ React.createElement("div", { style: { display: "flex", flexDirection: "column", gap: 4, padding: "11px 14px", borderRadius: 10, background: "var(--panel-2)", border: "1px dashed var(--line)" } }, /* @__PURE__ */ React.createElement("span", { style: { fontFamily: "var(--mono)", fontSize: 12.5, fontWeight: 700, color: "var(--text)" } }, T.noExitAvailable || "No exit available \u2014 routing and proxy are off."), anyFailed && /* @__PURE__ */ React.createElement("span", { style: { fontFamily: "var(--ui)", fontSize: 12, color: "var(--dim)" } }, T.noExitHint || "Every exit failed 3 times and is no longer checked automatically. Press Reconnect to try one again.")), ctl.fallbackNotice && /* @__PURE__ */ React.createElement("div", { style: { display: "flex", alignItems: "center", gap: 10, padding: "11px 14px", borderRadius: 10, background: "color-mix(in oklab, var(--warn), transparent 90%)", border: "1px solid color-mix(in oklab, var(--warn), transparent 70%)" } }, /* @__PURE__ */ React.createElement(Icon, { name: "route", size: 17, color: "var(--warn)", stroke: 2 }), /* @__PURE__ */ React.createElement("span", { style: { fontFamily: "var(--mono)", fontSize: 12.5, color: "var(--text)" } }, T.routeFellBack || "Routing fell back to direct: every exit it used failed. Reconnect one to route through it again.")), activeExit && /* @__PURE__ */ React.createElement("div", { style: { display: "flex", alignItems: "center", gap: 10, padding: "11px 14px", borderRadius: 10, background: "color-mix(in oklab, var(--warn), transparent 90%)", border: "1px solid color-mix(in oklab, var(--warn), transparent 70%)" } }, /* @__PURE__ */ React.createElement(Icon, { name: "route", size: 17, color: "var(--warn)", stroke: 2 }), /* @__PURE__ */ React.createElement("span", { style: { fontFamily: "var(--mono)", fontSize: 12.5, color: "var(--text)" } }, T.egressVia), /* @__PURE__ */ React.createElement(Mono, { size: 13, copy: activeExit }, activeExit), /* @__PURE__ */ React.createElement("div", { style: { flex: 1 } }), /* @__PURE__ */ React.createElement(Btn, { tone: "danger", icon: "unlink", size: "sm", onClick: () => onSetExit(null) }, T.stopRouting)), /* @__PURE__ */ React.createElement("div", { className: "dk-grid1", style: { display: "grid", gridTemplateColumns: "1fr 1fr", gap: 12 } }, exits.map((r) => /* @__PURE__ */ React.createElement(ExitCard, { key: r.region, T, region: r, activeExit, onSetExit, onReconnect: ctl.reconnect ? onReconnectExit : null, featureOn }))))));
|
|
6324
6372
|
}
|
|
6325
6373
|
Object.assign(window, { NetworkTab });
|
|
6326
6374
|
|
|
@@ -6743,9 +6791,10 @@ var STR = {
|
|
|
6743
6791
|
exitReconnectAll: "Reconnect all",
|
|
6744
6792
|
exitChecking: "checking\u2026",
|
|
6745
6793
|
exitNotChecked: "not checked",
|
|
6746
|
-
|
|
6794
|
+
exitDown: "down",
|
|
6795
|
+
exitRefresh: "Refresh",
|
|
6747
6796
|
noExitAvailable: "No exit available \u2014 routing and proxy are off.",
|
|
6748
|
-
noExitHint: "Every exit failed 3
|
|
6797
|
+
noExitHint: "Every exit failed 3 checks in a row and is no longer checked. Press Reconnect to try one again.",
|
|
6749
6798
|
routeFellBack: "Routing fell back to direct: every exit it used failed. Reconnect one to route through it again.",
|
|
6750
6799
|
identity: "Identity",
|
|
6751
6800
|
userId: "user id",
|
|
@@ -6954,9 +7003,10 @@ var STR = {
|
|
|
6954
7003
|
exitReconnectAll: "\u5168\u90E8\u91CD\u8FDE",
|
|
6955
7004
|
exitChecking: "\u68C0\u6D4B\u4E2D\u2026",
|
|
6956
7005
|
exitNotChecked: "\u672A\u68C0\u6D4B",
|
|
6957
|
-
|
|
7006
|
+
exitDown: "\u4E0D\u901A",
|
|
7007
|
+
exitRefresh: "\u5237\u65B0",
|
|
6958
7008
|
noExitAvailable: "\u6CA1\u6709\u53EF\u7528\u7684\u51FA\u53E3 \u2014\u2014 \u8DEF\u7531\u548C\u4EE3\u7406\u5DF2\u5173\u95ED\u3002",
|
|
6959
|
-
noExitHint: "\u6240\u6709\u51FA\u53E3\u90FD\u8FDE\u7EED
|
|
7009
|
+
noExitHint: "\u6240\u6709\u51FA\u53E3\u90FD\u8FDE\u7EED 3 \u6B21\u68C0\u6D4B\u5931\u8D25,\u5DF2\u4E0D\u518D\u68C0\u6D4B\u3002\u70B9\u300C\u91CD\u65B0\u8FDE\u63A5\u300D\u518D\u8BD5\u4E00\u6B21\u3002",
|
|
6960
7010
|
routeFellBack: "\u8DEF\u7531\u5DF2\u6539\u56DE\u76F4\u8FDE:\u5B83\u4F7F\u7528\u7684\u51FA\u53E3\u5168\u90E8\u5931\u8D25\u3002\u91CD\u65B0\u8FDE\u63A5\u5176\u4E2D\u4E00\u4E2A\u5373\u53EF\u6062\u590D\u3002",
|
|
6961
7011
|
identity: "\u8EAB\u4EFD",
|
|
6962
7012
|
userId: "\u7528\u6237 ID",
|
|
@@ -7619,6 +7669,10 @@ function DkApp() {
|
|
|
7619
7669
|
data.refresh();
|
|
7620
7670
|
return r;
|
|
7621
7671
|
});
|
|
7672
|
+
const onRefreshExits = () => dkApi.refreshExits().then((r) => {
|
|
7673
|
+
data.refresh();
|
|
7674
|
+
return r;
|
|
7675
|
+
});
|
|
7622
7676
|
const onOpenChat = (id) => {
|
|
7623
7677
|
setTab("chat");
|
|
7624
7678
|
openConversation(id);
|
|
@@ -7698,7 +7752,7 @@ function DkApp() {
|
|
|
7698
7752
|
fontWeight: 600,
|
|
7699
7753
|
background: tab === n.id ? "var(--accent)" : "transparent",
|
|
7700
7754
|
color: tab === n.id ? "#fff" : "var(--dim)"
|
|
7701
|
-
} }, /* @__PURE__ */ React.createElement(Icon, { name: n.icon, size: 14, stroke: 2, color: tab === n.id ? "#fff" : "var(--dim)" }), n.label))), tab === "chat" && /* @__PURE__ */ React.createElement(ChatTab, { T, lang: t.lang, phone, isProtocol, protocolFix, onBack: closeConversation, peers, requests, activeId, thread: activeId === ASSISTANT_ID ? assistant.thread : data.threads[activeId], onSelect, onAct, onAdd, onSend, onSendFile, onSendRtcFile, onAlias, onRemove, onOpenNet, onCall, onReloadThread: () => activeId && data.loadThread(activeId), hasEarlier: !!(activeId && activeId !== ASSISTANT_ID && data.earlier[activeId]), onAssistantRemove: activeId === ASSISTANT_ID ? assistant.removeFriends : null, onAssistantAdopt: activeId === ASSISTANT_ID ? assistant.adoptServicePeers : null, onLoadEarlier: () => activeId && data.loadEarlier(activeId), prefillAddr: pendingAddr, onPrefillConsumed: () => setPendingAddr(""), muted: mutedIds, onToggleMute }), tab === "here" && /* @__PURE__ */ React.createElement(DiscoverTab, { T, kind: "bridge", peers, meId: me.userId, onAdd, onOpenChat }), tab === "recommended" && /* @__PURE__ */ React.createElement(DiscoverTab, { T, kind: "recommended", peers, meId: me.userId, onAdd, onOpenChat }), tab === "registered" && /* @__PURE__ */ React.createElement(DiscoverTab, { T, kind: "registered", peers, meId: me.userId, onAdd, onOpenChat }), tab === "network" && /* @__PURE__ */ React.createElement(NetworkTab, { T, me, peers, exits, activeExit, exitFeature: data.exitFeature, routeFallback: data.routeFallback, onReconnectExit, reqCount: requests.length, onSetExit, onOpenChat, backend, onArmLan: armLan, onCancelLan: cancelLan }), tab === "apps" && /* @__PURE__ */ React.createElement(AppsTab, { T, t, me, peers, phone, setTab }), tabs.map((x) => x.kind === "host" && tab === x.id ? /* @__PURE__ */ React.createElement(HostTabPane, { key: x.id, tab: x, props: { T, t, me, peers, phone, setTab }, lang: t.lang }) : null), tab === "profile" && /* @__PURE__ */ React.createElement(
|
|
7755
|
+
} }, /* @__PURE__ */ React.createElement(Icon, { name: n.icon, size: 14, stroke: 2, color: tab === n.id ? "#fff" : "var(--dim)" }), n.label))), tab === "chat" && /* @__PURE__ */ React.createElement(ChatTab, { T, lang: t.lang, phone, isProtocol, protocolFix, onBack: closeConversation, peers, requests, activeId, thread: activeId === ASSISTANT_ID ? assistant.thread : data.threads[activeId], onSelect, onAct, onAdd, onSend, onSendFile, onSendRtcFile, onAlias, onRemove, onOpenNet, onCall, onReloadThread: () => activeId && data.loadThread(activeId), hasEarlier: !!(activeId && activeId !== ASSISTANT_ID && data.earlier[activeId]), onAssistantRemove: activeId === ASSISTANT_ID ? assistant.removeFriends : null, onAssistantAdopt: activeId === ASSISTANT_ID ? assistant.adoptServicePeers : null, onLoadEarlier: () => activeId && data.loadEarlier(activeId), prefillAddr: pendingAddr, onPrefillConsumed: () => setPendingAddr(""), muted: mutedIds, onToggleMute }), tab === "here" && /* @__PURE__ */ React.createElement(DiscoverTab, { T, kind: "bridge", peers, meId: me.userId, onAdd, onOpenChat }), tab === "recommended" && /* @__PURE__ */ React.createElement(DiscoverTab, { T, kind: "recommended", peers, meId: me.userId, onAdd, onOpenChat }), tab === "registered" && /* @__PURE__ */ React.createElement(DiscoverTab, { T, kind: "registered", peers, meId: me.userId, onAdd, onOpenChat }), tab === "network" && /* @__PURE__ */ React.createElement(NetworkTab, { T, me, peers, exits, activeExit, exitFeature: data.exitFeature, routeFallback: data.routeFallback, onReconnectExit, onRefreshExits, reqCount: requests.length, onSetExit, onOpenChat, backend, onArmLan: armLan, onCancelLan: cancelLan }), tab === "apps" && /* @__PURE__ */ React.createElement(AppsTab, { T, t, me, peers, phone, setTab }), tabs.map((x) => x.kind === "host" && tab === x.id ? /* @__PURE__ */ React.createElement(HostTabPane, { key: x.id, tab: x, props: { T, t, me, peers, phone, setTab }, lang: t.lang }) : null), tab === "profile" && /* @__PURE__ */ React.createElement(
|
|
7702
7756
|
ProfileTab,
|
|
7703
7757
|
{
|
|
7704
7758
|
T,
|
package/package.json
CHANGED