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.
47 lines
1.5 KiB
47 lines
1.5 KiB
import { checkAlgoRelay } from '@/lib/relay' |
|
import client from '@/services/client.service' |
|
import { TRelayInfo } from '@/types' |
|
import { useEffect, useState } from 'react' |
|
|
|
export function useFetchRelayInfos(urls: string[]) { |
|
const [isFetching, setIsFetching] = useState(true) |
|
const [relayInfos, setRelayInfos] = useState<(TRelayInfo | undefined)[]>([]) |
|
const [areAlgoRelays, setAreAlgoRelays] = useState(false) |
|
const [searchableRelayUrls, setSearchableRelayUrls] = useState<string[]>([]) |
|
const urlsString = JSON.stringify(urls) |
|
|
|
useEffect(() => { |
|
const fetchRelayInfos = async () => { |
|
setIsFetching(true) |
|
if (urls.length === 0) { |
|
return setIsFetching(false) |
|
} |
|
const timer = setTimeout(() => { |
|
setIsFetching(false) |
|
}, 5000) |
|
try { |
|
const relayInfos = await client.fetchRelayInfos(urls) |
|
setRelayInfos(relayInfos) |
|
setAreAlgoRelays(relayInfos.every((relayInfo) => checkAlgoRelay(relayInfo))) |
|
setSearchableRelayUrls( |
|
relayInfos |
|
.map((relayInfo, index) => ({ |
|
url: urls[index], |
|
searchable: relayInfo?.supported_nips?.includes(50) |
|
})) |
|
.filter((relayInfo) => relayInfo.searchable) |
|
.map((relayInfo) => relayInfo.url) |
|
) |
|
} catch (err) { |
|
console.error(err) |
|
} finally { |
|
clearTimeout(timer) |
|
setIsFetching(false) |
|
} |
|
} |
|
|
|
fetchRelayInfos() |
|
}, [urlsString]) |
|
|
|
return { relayInfos, isFetching, areAlgoRelays, searchableRelayUrls } |
|
}
|
|
|