Handle strict mode in provider

This commit is contained in:
Tristan Edwards 2022-12-27 21:20:52 +01:00
parent 5ccaf9672f
commit b4bab84ea2

View File

@ -4,6 +4,7 @@ import {
useCallback, useCallback,
useContext, useContext,
useEffect, useEffect,
useRef,
useState, useState,
} from "react" } from "react"
@ -54,27 +55,17 @@ export function NostrProvider({
const [isLoading, setIsLoading] = useState(true) const [isLoading, setIsLoading] = useState(true)
const [connectedRelays, setConnectedRelays] = useState<Relay[]>([]) const [connectedRelays, setConnectedRelays] = useState<Relay[]>([])
const publish = (event: NostrEvent) => {
log(debug, "info", "⬆️ nostr: Sending event:", event)
return connectedRelays.map((relay) => {
return relay.publish(event)
})
}
let onConnectCallback: null | OnConnectFunc = null let onConnectCallback: null | OnConnectFunc = null
let onDisconnectCallback: null | OnDisconnectFunc = null let onDisconnectCallback: null | OnDisconnectFunc = null
useEffect(() => { const isFirstRender = useRef(true)
let ignore = false // For React StrictMode
const connectToRelays = useCallback(() => {
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)
@ -91,12 +82,24 @@ export function NostrProvider({
log(debug, "error", `❌ nostr: Error connecting to ${relayUrl}!`) log(debug, "error", `❌ nostr: Error connecting to ${relayUrl}!`)
}) })
}) })
}, [])
return () => { useEffect(() => {
ignore = true // Make sure we only start the relays once (even in strict-mode)
if (isFirstRender.current) {
isFirstRender.current = false
connectToRelays()
} }
}, []) }, [])
const publish = (event: NostrEvent) => {
log(debug, "info", "⬆️ nostr: Sending event:", event)
return connectedRelays.map((relay) => {
return relay.publish(event)
})
}
const value: NostrContextType = { const value: NostrContextType = {
debug, debug,
isLoading, isLoading,