useFetchRelayInfos.tsx raw

   1  import { checkAlgoRelay } from '@/lib/relay'
   2  import relayInfoService from '@/services/relay-info.service'
   3  import { TRelayInfo } from '@/types'
   4  import { useEffect, useState } from 'react'
   5  
   6  export function useFetchRelayInfos(urls: string[]) {
   7    const [isFetching, setIsFetching] = useState(true)
   8    const [relayInfos, setRelayInfos] = useState<(TRelayInfo | undefined)[]>([])
   9    const [areAlgoRelays, setAreAlgoRelays] = useState(false)
  10    const [searchableRelayUrls, setSearchableRelayUrls] = useState<string[]>([])
  11    const urlsString = JSON.stringify(urls)
  12  
  13    useEffect(() => {
  14      const fetchRelayInfos = async () => {
  15        setIsFetching(true)
  16        if (urls.length === 0) {
  17          return setIsFetching(false)
  18        }
  19        const timer = setTimeout(() => {
  20          setIsFetching(false)
  21        }, 5000)
  22        try {
  23          const relayInfos = await relayInfoService.getRelayInfos(urls)
  24          setRelayInfos(relayInfos)
  25          setAreAlgoRelays(relayInfos.every((relayInfo) => checkAlgoRelay(relayInfo)))
  26          setSearchableRelayUrls(
  27            relayInfos
  28              .map((relayInfo, index) => ({
  29                url: urls[index],
  30                searchable: relayInfo?.supported_nips?.includes(50)
  31              }))
  32              .filter((relayInfo) => relayInfo.searchable)
  33              .map((relayInfo) => relayInfo.url)
  34          )
  35        } catch (err) {
  36          console.error(err)
  37        } finally {
  38          clearTimeout(timer)
  39          setIsFetching(false)
  40        }
  41      }
  42  
  43      fetchRelayInfos()
  44    }, [urlsString])
  45  
  46    return { relayInfos, isFetching, areAlgoRelays, searchableRelayUrls }
  47  }
  48