mirror of
https://github.com/t4t5/nostr-react.git
synced 2025-05-13 23:40:01 +02:00
Better automatic unsubscription
This commit is contained in:
parent
1f5db629b8
commit
5ccaf9672f
@ -1,12 +1,13 @@
|
|||||||
import {
|
import {
|
||||||
createContext,
|
createContext,
|
||||||
ReactNode,
|
ReactNode,
|
||||||
|
useCallback,
|
||||||
useContext,
|
useContext,
|
||||||
useEffect,
|
useEffect,
|
||||||
useState,
|
useState,
|
||||||
} from "react"
|
} from "react"
|
||||||
|
|
||||||
import { Relay, Filter, Event as NostrEvent, relayInit } from "nostr-tools"
|
import { Relay, Filter, Event as NostrEvent, relayInit, Sub } from "nostr-tools"
|
||||||
|
|
||||||
import { uniqBy } from "./utils"
|
import { uniqBy } from "./utils"
|
||||||
export { dateToUnix } from "./utils"
|
export { dateToUnix } from "./utils"
|
||||||
@ -133,13 +134,17 @@ export function useNostrEvents({ filter }: { filter: Filter }) {
|
|||||||
const filterBase64 =
|
const filterBase64 =
|
||||||
typeof window !== "undefined" ? window.btoa(JSON.stringify(filter)) : null
|
typeof window !== "undefined" ? window.btoa(JSON.stringify(filter)) : null
|
||||||
|
|
||||||
const subscribe = (relay: Relay) => {
|
const _unsubscribe = (sub: Sub) => {
|
||||||
log(debug, "info", "⬆️ nostr: Subscribing to filter:", filter)
|
log(debug, "info", "🙉 nostr: Unsubscribing from filter:", filter)
|
||||||
|
return sub.unsub()
|
||||||
|
}
|
||||||
|
|
||||||
|
const subscribe = useCallback((relay: Relay) => {
|
||||||
|
log(debug, "info", "👂 nostr: Subscribing to filter:", filter)
|
||||||
const sub = relay.sub([filter])
|
const sub = relay.sub([filter])
|
||||||
|
|
||||||
const unsubscribeFunc = () => {
|
const unsubscribeFunc = () => {
|
||||||
log(debug, "info", "🚪 nostr: Unsubscribing from filter:", filter)
|
_unsubscribe(sub)
|
||||||
return sub.unsub()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
setUnsubscribe(() => unsubscribeFunc)
|
setUnsubscribe(() => unsubscribeFunc)
|
||||||
@ -151,12 +156,20 @@ export function useNostrEvents({ filter }: { filter: Filter }) {
|
|||||||
return [event, ..._events]
|
return [event, ..._events]
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
}
|
|
||||||
|
return sub
|
||||||
|
}, [])
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
connectedRelays.forEach((relay) => {
|
const subs = connectedRelays.map((relay) => {
|
||||||
subscribe(relay)
|
return subscribe(relay)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
return () => {
|
||||||
|
subs.forEach((sub) => {
|
||||||
|
_unsubscribe(sub)
|
||||||
|
})
|
||||||
|
}
|
||||||
}, [connectedRelays, filterBase64])
|
}, [connectedRelays, filterBase64])
|
||||||
|
|
||||||
const uniqEvents = events.length > 0 ? uniqBy(events, "id") : []
|
const uniqEvents = events.length > 0 ? uniqBy(events, "id") : []
|
||||||
|
Loading…
x
Reference in New Issue
Block a user