fix ndk
This commit is contained in:
@@ -1,9 +1,5 @@
|
||||
import { RelayContext } from "@shared/relayProvider";
|
||||
|
||||
import { READONLY_RELAYS } from "@stores/constants";
|
||||
|
||||
import { getChannel, updateChannelMetadata } from "@utils/storage";
|
||||
|
||||
import { useContext } from "react";
|
||||
import useSWR, { useSWRConfig } from "swr";
|
||||
import useSWRSubscription from "swr/subscription";
|
||||
@@ -18,7 +14,7 @@ const fetcher = async ([, id]) => {
|
||||
};
|
||||
|
||||
export function useChannelProfile(id: string, channelPubkey: string) {
|
||||
const pool: any = useContext(RelayContext);
|
||||
const ndk = useContext(RelayContext);
|
||||
|
||||
const { mutate } = useSWRConfig();
|
||||
const { data, isLoading } = useSWR(["channel-metadata", id], fetcher);
|
||||
@@ -27,30 +23,26 @@ export function useChannelProfile(id: string, channelPubkey: string) {
|
||||
!isLoading && data ? ["channel-metadata", id] : null,
|
||||
([, key]) => {
|
||||
// subscribe to channel
|
||||
const unsubscribe = pool.subscribe(
|
||||
[
|
||||
{
|
||||
"#e": [key],
|
||||
authors: [channelPubkey],
|
||||
kinds: [41],
|
||||
},
|
||||
],
|
||||
READONLY_RELAYS,
|
||||
(event: { content: string }) => {
|
||||
// update in local database
|
||||
updateChannelMetadata(key, event.content);
|
||||
// revaildate
|
||||
mutate(["channel-metadata", key]);
|
||||
},
|
||||
undefined,
|
||||
undefined,
|
||||
const sub = ndk.subscribe(
|
||||
{
|
||||
unsubscribeOnEose: true,
|
||||
"#e": [key],
|
||||
authors: [channelPubkey],
|
||||
kinds: [41],
|
||||
},
|
||||
{
|
||||
closeOnEose: true,
|
||||
},
|
||||
);
|
||||
|
||||
sub.addListener("event", (event: { content: string }) => {
|
||||
// update in local database
|
||||
updateChannelMetadata(key, event.content);
|
||||
// revaildate
|
||||
mutate(["channel-metadata", key]);
|
||||
});
|
||||
|
||||
return () => {
|
||||
unsubscribe();
|
||||
sub.stop();
|
||||
};
|
||||
},
|
||||
);
|
||||
|
||||
@@ -8,7 +8,7 @@ export function LinkPreview({ urls }: { urls: string[] }) {
|
||||
return (
|
||||
<div className="mt-3 overflow-hidden rounded-lg bg-zinc-800">
|
||||
{error && <p>failed to load</p>}
|
||||
{isLoading && !data ? (
|
||||
{isLoading || !data ? (
|
||||
<p>Loading...</p>
|
||||
) : (
|
||||
<a
|
||||
|
||||
@@ -1,14 +1,10 @@
|
||||
import { prefetchEvents } from "@libs/ndk";
|
||||
import { NDKFilter } from "@nostr-dev-kit/ndk";
|
||||
import { LumeIcon } from "@shared/icons";
|
||||
import { RelayContext } from "@shared/relayProvider";
|
||||
import { useActiveAccount } from "@stores/accounts";
|
||||
import { dateToUnix, getHourAgo } from "@utils/date";
|
||||
import {
|
||||
addToBlacklist,
|
||||
countTotalNotes,
|
||||
createChat,
|
||||
createNote,
|
||||
} from "@utils/storage";
|
||||
import { countTotalNotes, createNote } from "@utils/storage";
|
||||
import { useContext, useEffect, useRef } from "react";
|
||||
import { navigate } from "vite-plugin-ssr/client/router";
|
||||
|
||||
@@ -48,7 +44,7 @@ export function Page() {
|
||||
since: queryNoteSince,
|
||||
};
|
||||
|
||||
const events = await ndk.fetchEvents(filter);
|
||||
const events = await prefetchEvents(ndk, filter);
|
||||
events.forEach((event) => {
|
||||
createNote(
|
||||
event.id,
|
||||
@@ -66,91 +62,6 @@ export function Page() {
|
||||
}
|
||||
}
|
||||
|
||||
async function fetchChannelBlacklist() {
|
||||
try {
|
||||
const filter: NDKFilter = {
|
||||
authors: [account.pubkey],
|
||||
kinds: [43, 44],
|
||||
since: lastLogin,
|
||||
};
|
||||
|
||||
const events = await ndk.fetchEvents(filter);
|
||||
events.forEach((event) => {
|
||||
switch (event.kind) {
|
||||
case 43:
|
||||
if (event.tags[0][0] === "e") {
|
||||
addToBlacklist(account.id, event.tags[0][1], 43, 1);
|
||||
}
|
||||
break;
|
||||
case 44:
|
||||
if (event.tags[0][0] === "p") {
|
||||
addToBlacklist(account.id, event.tags[0][1], 44, 1);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
});
|
||||
|
||||
return true;
|
||||
} catch (e) {
|
||||
console.log("error: ", e);
|
||||
}
|
||||
}
|
||||
|
||||
async function fetchReceiveMessages() {
|
||||
try {
|
||||
const filter: NDKFilter = {
|
||||
kinds: [4],
|
||||
"#p": [account.pubkey],
|
||||
since: lastLogin,
|
||||
};
|
||||
|
||||
const events = await ndk.fetchEvents(filter);
|
||||
events.forEach((event) => {
|
||||
createChat(
|
||||
event.id,
|
||||
account.pubkey,
|
||||
event.pubkey,
|
||||
event.content,
|
||||
event.tags,
|
||||
event.created_at,
|
||||
);
|
||||
});
|
||||
|
||||
return true;
|
||||
} catch (e) {
|
||||
console.log("error: ", e);
|
||||
}
|
||||
}
|
||||
|
||||
async function fetchSendMessages() {
|
||||
try {
|
||||
const filter: NDKFilter = {
|
||||
kinds: [4],
|
||||
authors: [account.pubkey],
|
||||
since: lastLogin,
|
||||
};
|
||||
|
||||
const events = await ndk.fetchEvents(filter);
|
||||
events.forEach((event) => {
|
||||
const receiver = event.tags.find((t) => t[0] === "p")[1];
|
||||
createChat(
|
||||
event.id,
|
||||
receiver,
|
||||
account.pubkey,
|
||||
event.content,
|
||||
event.tags,
|
||||
event.created_at,
|
||||
);
|
||||
});
|
||||
|
||||
return true;
|
||||
} catch (e) {
|
||||
console.log("error: ", e);
|
||||
}
|
||||
}
|
||||
|
||||
useEffect(() => {
|
||||
async function prefetch() {
|
||||
const notes = await fetchNotes();
|
||||
@@ -158,7 +69,6 @@ export function Page() {
|
||||
navigate("/app/space", { overwriteLastHistoryEntry: true });
|
||||
}
|
||||
}
|
||||
|
||||
prefetch();
|
||||
}, []);
|
||||
|
||||
|
||||
@@ -1,4 +1,10 @@
|
||||
import NDK, { NDKConstructorParams } from "@nostr-dev-kit/ndk";
|
||||
import NDK, {
|
||||
NDKConstructorParams,
|
||||
NDKEvent,
|
||||
NDKFilter,
|
||||
NDKFilterOptions,
|
||||
NDKRelaySet,
|
||||
} from "@nostr-dev-kit/ndk";
|
||||
import { FULL_RELAYS } from "@stores/constants";
|
||||
|
||||
export async function initNDK(
|
||||
@@ -13,3 +19,25 @@ export async function initNDK(
|
||||
|
||||
return ndk;
|
||||
}
|
||||
|
||||
export async function prefetchEvents(
|
||||
ndk: NDK,
|
||||
filter: NDKFilter,
|
||||
): Promise<Set<NDKEvent>> {
|
||||
return new Promise((resolve) => {
|
||||
const events: Map<string, NDKEvent> = new Map();
|
||||
|
||||
const relaySetSubscription = ndk.subscribe(filter, {
|
||||
closeOnEose: true,
|
||||
});
|
||||
|
||||
relaySetSubscription.on("event", (event: NDKEvent) => {
|
||||
event.ndk = ndk;
|
||||
events.set(event.tagId(), event);
|
||||
});
|
||||
|
||||
relaySetSubscription.on("eose", () => {
|
||||
setTimeout(() => resolve(new Set(events.values())), 2000);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
@@ -7,28 +7,10 @@ export const DEFAULT_CHANNEL_BANNER =
|
||||
|
||||
export const OPENGRAPH_KEY = "9EJG4SY-19Q4M5J-H8R29C9-091XPCC";
|
||||
|
||||
// read-only relay list
|
||||
export const READONLY_RELAYS = [
|
||||
"wss://welcome.nostr.wine",
|
||||
"wss://relay.nostr.band",
|
||||
"wss://relay.damus.io",
|
||||
];
|
||||
|
||||
// write-only relay list
|
||||
export const WRITEONLY_RELAYS = [
|
||||
"wss://relay.damus.io",
|
||||
"wss://relay.nostr.band",
|
||||
];
|
||||
|
||||
// metadata relay
|
||||
export const METADATA_RELAY = ["wss://relay.nostr.band"];
|
||||
|
||||
// full-relay list
|
||||
export const FULL_RELAYS = [
|
||||
"wss://welcome.nostr.wine",
|
||||
"wss://relay.nostr.band",
|
||||
"wss://relay.damus.io",
|
||||
"wss://relay.snort.social",
|
||||
"wss://relayable.org",
|
||||
"wss://nostr.mutinywallet.com",
|
||||
];
|
||||
|
||||
Reference in New Issue
Block a user