diff --git a/apps/desktop2/src/components/conversation.tsx b/apps/desktop2/src/components/conversation.tsx index a3dd9974..a00bf0b1 100644 --- a/apps/desktop2/src/components/conversation.tsx +++ b/apps/desktop2/src/components/conversation.tsx @@ -3,15 +3,21 @@ import type { NostrEvent } from "@lume/types"; import { Note } from "@/components/note"; import { cn } from "@lume/utils"; import { LumeEvent } from "@lume/system"; +import { useMemo } from "react"; export function Conversation({ event, + gossip, className, }: { event: NostrEvent; + gossip?: boolean; className?: string; }) { - const thread = LumeEvent.getEventThread(event.tags); + const thread = useMemo( + () => LumeEvent.getEventThread(event.tags, gossip), + [event], + ); return ( diff --git a/apps/desktop2/src/routes/$account.home.tsx b/apps/desktop2/src/routes/$account.home.tsx index 50d34a5b..3b4d5174 100644 --- a/apps/desktop2/src/routes/$account.home.tsx +++ b/apps/desktop2/src/routes/$account.home.tsx @@ -132,11 +132,10 @@ function Screen() { horizontal tabIndex={-1} itemSize={440} - overscan={3} + overscan={5} onScroll={() => setIsScroll(true)} onScrollEnd={() => setIsScroll(false)} className="scrollbar-none h-full w-full overflow-x-auto focus:outline-none" - cache={null} > {columns.map((column) => ( tag[0] === "q").length > 0; if (isConversation) { - return ; + return ( + + ); } if (isQuote) { diff --git a/apps/desktop2/src/routes/settings/general.tsx b/apps/desktop2/src/routes/settings/general.tsx index f193e34a..cc512d4e 100644 --- a/apps/desktop2/src/routes/settings/general.tsx +++ b/apps/desktop2/src/routes/settings/general.tsx @@ -9,10 +9,7 @@ import { useDebouncedCallback } from "use-debounce"; export const Route = createFileRoute("/settings/general")({ beforeLoad: async () => { const settings = await NostrQuery.getSettings(); - - return { - settings, - }; + return { settings }; }, component: Screen, }); @@ -29,6 +26,13 @@ function Screen() { })); }; + const toggleGossip = async () => { + setNewSettings((prev) => ({ + ...prev, + gossip: !newSettings.gossip, + })); + }; + const toggleAutoUpdate = () => { setNewSettings((prev) => ({ ...prev, @@ -91,6 +95,24 @@ function Screen() { +
+
+

Relay Hint

+

+ Automatically connect to the necessary relay suggested by + Relay Hint when fetching a new event. +

+
+
+ toggleGossip()} + className="relative h-7 w-12 shrink-0 cursor-default rounded-full bg-black/10 outline-none data-[state=checked]:bg-blue-500 dark:bg-white/10" + > + + +
+

Enhanced Privacy

diff --git a/packages/system/src/event.ts b/packages/system/src/event.ts index 1148d6ea..6e2d32ca 100644 --- a/packages/system/src/event.ts +++ b/packages/system/src/event.ts @@ -22,24 +22,25 @@ export class LumeEvent { return this.tags.filter((tag) => tag[0] === "p").map((tag) => tag[1]); } - static getEventThread(tags: string[][]) { + static getEventThread(tags: string[][], gossip?: boolean) { let root: string = null; let reply: string = null; // Get all event references from tags, ignore mention const events = tags.filter((el) => el[0] === "e" && el[3] !== "mention"); - /* - if (gossip) { - const relays = tags.filter((el) => el[0] === "e" && el[2]?.length); + if (gossip) { + const relays = tags.filter((el) => el[0] === "e" && el[2]?.length); - if (relays.length >= 1) { - for (const relay of relays) { - if (relay[2]?.length) this.add_relay(relay[2]); - } - } - } - */ + if (relays.length >= 1) { + for (const relay of relays) { + if (relay[2]?.length) + commands + .connectRelay(relay[2]) + .then(() => console.log("[gossip]: ", relay[2])); + } + } + } if (events.length === 1) { root = events[0][1]; diff --git a/packages/types/index.d.ts b/packages/types/index.d.ts index c8eccbcf..19a35988 100644 --- a/packages/types/index.d.ts +++ b/packages/types/index.d.ts @@ -4,6 +4,7 @@ export interface Settings { autoUpdate: boolean; zap: boolean; nsfw: boolean; + gossip: boolean; [key: string]: string | number | boolean; }