feat: add option for relay hint

This commit is contained in:
reya 2024-05-26 08:23:29 +07:00
parent b90ad1421f
commit 4dc13385a5
6 changed files with 56 additions and 20 deletions

View File

@ -3,15 +3,21 @@ import type { NostrEvent } from "@lume/types";
import { Note } from "@/components/note"; import { Note } from "@/components/note";
import { cn } from "@lume/utils"; import { cn } from "@lume/utils";
import { LumeEvent } from "@lume/system"; import { LumeEvent } from "@lume/system";
import { useMemo } from "react";
export function Conversation({ export function Conversation({
event, event,
gossip,
className, className,
}: { }: {
event: NostrEvent; event: NostrEvent;
gossip?: boolean;
className?: string; className?: string;
}) { }) {
const thread = LumeEvent.getEventThread(event.tags); const thread = useMemo(
() => LumeEvent.getEventThread(event.tags, gossip),
[event],
);
return ( return (
<Note.Provider event={event}> <Note.Provider event={event}>

View File

@ -132,11 +132,10 @@ function Screen() {
horizontal horizontal
tabIndex={-1} tabIndex={-1}
itemSize={440} itemSize={440}
overscan={3} overscan={5}
onScroll={() => setIsScroll(true)} onScroll={() => setIsScroll(true)}
onScrollEnd={() => setIsScroll(false)} onScrollEnd={() => setIsScroll(false)}
className="scrollbar-none h-full w-full overflow-x-auto focus:outline-none" className="scrollbar-none h-full w-full overflow-x-auto focus:outline-none"
cache={null}
> >
{columns.map((column) => ( {columns.map((column) => (
<Column <Column

View File

@ -40,7 +40,7 @@ export const Route = createFileRoute("/newsfeed")({
export function Screen() { export function Screen() {
const { label, account } = Route.useSearch(); const { label, account } = Route.useSearch();
const { contacts } = Route.useRouteContext(); const { contacts, settings } = Route.useRouteContext();
const { const {
data, data,
isLoading, isLoading,
@ -72,7 +72,14 @@ export function Screen() {
const isQuote = event.tags.filter((tag) => tag[0] === "q").length > 0; const isQuote = event.tags.filter((tag) => tag[0] === "q").length > 0;
if (isConversation) { if (isConversation) {
return <Conversation key={event.id} event={event} className="mb-3" />; return (
<Conversation
key={event.id}
className="mb-3"
event={event}
gossip={settings?.gossip}
/>
);
} }
if (isQuote) { if (isQuote) {

View File

@ -9,10 +9,7 @@ import { useDebouncedCallback } from "use-debounce";
export const Route = createFileRoute("/settings/general")({ export const Route = createFileRoute("/settings/general")({
beforeLoad: async () => { beforeLoad: async () => {
const settings = await NostrQuery.getSettings(); const settings = await NostrQuery.getSettings();
return { settings };
return {
settings,
};
}, },
component: Screen, component: Screen,
}); });
@ -29,6 +26,13 @@ function Screen() {
})); }));
}; };
const toggleGossip = async () => {
setNewSettings((prev) => ({
...prev,
gossip: !newSettings.gossip,
}));
};
const toggleAutoUpdate = () => { const toggleAutoUpdate = () => {
setNewSettings((prev) => ({ setNewSettings((prev) => ({
...prev, ...prev,
@ -91,6 +95,24 @@ function Screen() {
</Switch.Root> </Switch.Root>
</div> </div>
</div> </div>
<div className="flex w-full items-start justify-between gap-4 py-3">
<div className="flex-1">
<h3 className="font-medium">Relay Hint</h3>
<p className="text-sm text-neutral-700 dark:text-neutral-300">
Automatically connect to the necessary relay suggested by
Relay Hint when fetching a new event.
</p>
</div>
<div className="w-36 flex justify-end shrink-0">
<Switch.Root
checked={newSettings.gossip}
onClick={() => 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"
>
<Switch.Thumb className="block size-6 translate-x-0.5 rounded-full bg-white transition-transform duration-100 will-change-transform data-[state=checked]:translate-x-[19px]" />
</Switch.Root>
</div>
</div>
<div className="flex w-full items-start justify-between gap-4 py-3"> <div className="flex w-full items-start justify-between gap-4 py-3">
<div className="flex-1"> <div className="flex-1">
<h3 className="font-medium">Enhanced Privacy</h3> <h3 className="font-medium">Enhanced Privacy</h3>

View File

@ -22,24 +22,25 @@ export class LumeEvent {
return this.tags.filter((tag) => tag[0] === "p").map((tag) => tag[1]); 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 root: string = null;
let reply: string = null; let reply: string = null;
// Get all event references from tags, ignore mention // Get all event references from tags, ignore mention
const events = tags.filter((el) => el[0] === "e" && el[3] !== "mention"); const events = tags.filter((el) => el[0] === "e" && el[3] !== "mention");
/* if (gossip) {
if (gossip) { const relays = tags.filter((el) => el[0] === "e" && el[2]?.length);
const relays = tags.filter((el) => el[0] === "e" && el[2]?.length);
if (relays.length >= 1) { if (relays.length >= 1) {
for (const relay of relays) { for (const relay of relays) {
if (relay[2]?.length) this.add_relay(relay[2]); if (relay[2]?.length)
} commands
} .connectRelay(relay[2])
} .then(() => console.log("[gossip]: ", relay[2]));
*/ }
}
}
if (events.length === 1) { if (events.length === 1) {
root = events[0][1]; root = events[0][1];

View File

@ -4,6 +4,7 @@ export interface Settings {
autoUpdate: boolean; autoUpdate: boolean;
zap: boolean; zap: boolean;
nsfw: boolean; nsfw: boolean;
gossip: boolean;
[key: string]: string | number | boolean; [key: string]: string | number | boolean;
} }