You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

53 lines
1.5 KiB

import { createContext, useCallback, useContext, useMemo, useState } from 'react'
type TCurrentRelaysContext = {
relayUrls: string[]
addRelayUrls: (urls: string[]) => void
removeRelayUrls: (urls: string[]) => void
}
const CurrentRelaysContext = createContext<TCurrentRelaysContext | undefined>(undefined)
export const useCurrentRelays = () => {
const context = useContext(CurrentRelaysContext)
if (!context) {
throw new Error('useCurrentRelays must be used within a CurrentRelaysProvider')
}
return context
}
export function CurrentRelaysProvider({ children }: { children: React.ReactNode }) {
const [relayRefCount, setRelayRefCount] = useState<Record<string, number>>({})
const relayUrls = useMemo(() => Object.keys(relayRefCount), [relayRefCount])
const addRelayUrls = useCallback((urls: string[]) => {
setRelayRefCount((prev) => {
const newCounts = { ...prev }
urls.forEach((url) => {
newCounts[url] = (newCounts[url] || 0) + 1
})
return newCounts
})
}, [])
const removeRelayUrls = useCallback((urls: string[]) => {
setRelayRefCount((prev) => {
const newCounts = { ...prev }
urls.forEach((url) => {
if (newCounts[url]) {
newCounts[url] -= 1
if (newCounts[url] <= 0) {
delete newCounts[url]
}
}
})
return newCounts
})
}, [])
return (
<CurrentRelaysContext.Provider value={{ relayUrls, addRelayUrls, removeRelayUrls }}>
{children}
</CurrentRelaysContext.Provider>
)
}