Use base64 to detect filter changes

This commit is contained in:
Tristan Edwards
2022-12-26 13:40:56 +01:00
parent bef73edf3c
commit 54e611e362

View File

@@ -65,11 +65,15 @@ export function NostrProvider({
let onDisconnectCallback: null | OnDisconnectFunc = null let onDisconnectCallback: null | OnDisconnectFunc = null
useEffect(() => { useEffect(() => {
let ignore = false // For React StrictMode
relayUrls.forEach(async (relayUrl) => { relayUrls.forEach(async (relayUrl) => {
const relay = relayInit(relayUrl) const relay = relayInit(relayUrl)
relay.connect() relay.connect()
relay.on("connect", () => { relay.on("connect", () => {
if (ignore) return
log(debug, "info", `✅ nostr: Connected to ${relayUrl}`) log(debug, "info", `✅ nostr: Connected to ${relayUrl}`)
setIsLoading(false) setIsLoading(false)
onConnectCallback?.(relay) onConnectCallback?.(relay)
@@ -77,7 +81,7 @@ export function NostrProvider({
}) })
relay.on("disconnect", () => { relay.on("disconnect", () => {
log(debug, "warn", `👋 nostr: Connection closed for ${relayUrl}`) log(debug, "warn", `🚪 nostr: Connection closed for ${relayUrl}`)
onDisconnectCallback?.(relay) onDisconnectCallback?.(relay)
setConnectedRelays((prev) => prev.filter((r) => r.url !== relayUrl)) setConnectedRelays((prev) => prev.filter((r) => r.url !== relayUrl))
}) })
@@ -86,7 +90,11 @@ export function NostrProvider({
log(debug, "error", `❌ nostr: Error connecting to ${relayUrl}!`) log(debug, "error", `❌ nostr: Error connecting to ${relayUrl}!`)
}) })
}) })
}, [onConnectCallback, relayUrls])
return () => {
ignore = true
}
}, [])
const value: NostrContextType = { const value: NostrContextType = {
debug, debug,
@@ -118,15 +126,22 @@ export function useNostrEvents({ filter }: { filter: Filter }) {
let onEventCallback: null | OnEventFunc = null let onEventCallback: null | OnEventFunc = null
// Lets us set filterBase64 as a useEffect dependency
const filterBase64 =
typeof window !== "undefined" ? window.btoa(JSON.stringify(filter)) : null
let unsubscribe = () => { let unsubscribe = () => {
return return
} }
const subscribe = (relay: Relay) => { const subscribe = (relay: Relay) => {
log(debug, "info", "⬆️ nostr: Sending event filter:", filter) log(debug, "info", "⬆️ nostr: Subscribing to filter:", filter)
const sub = relay.sub([filter]) const sub = relay.sub([filter])
unsubscribe = sub.unsub unsubscribe = () => {
log(debug, "info", "✌️ nostr: Unsubscribing from filter:", filter)
return sub.unsub()
}
sub.on("event", (event: NostrEvent) => { sub.on("event", (event: NostrEvent) => {
log(debug, "info", "⬇️ nostr: Received event:", event) log(debug, "info", "⬇️ nostr: Received event:", event)
@@ -141,11 +156,7 @@ export function useNostrEvents({ filter }: { filter: Filter }) {
connectedRelays.forEach((relay) => { connectedRelays.forEach((relay) => {
subscribe(relay) subscribe(relay)
}) })
}, [connectedRelays.length]) }, [connectedRelays, filterBase64])
onConnect((relay: Relay) => {
subscribe(relay)
})
const uniqEvents = events.length > 0 ? uniqBy(events, "id") : [] const uniqEvents = events.length > 0 ? uniqBy(events, "id") : []
const sortedEvents = uniqEvents.sort((a, b) => b.created_at - a.created_at) const sortedEvents = uniqEvents.sort((a, b) => b.created_at - a.created_at)