diff --git a/src/hooks/useRelayStatus.ts b/src/hooks/useRelayStatus.ts index d2c9b20..0b75d78 100644 --- a/src/hooks/useRelayStatus.ts +++ b/src/hooks/useRelayStatus.ts @@ -1,49 +1,26 @@ -import { useState, useEffect } from 'react'; +import { useQuery } from '@tanstack/react-query'; import { useNostr } from '@nostrify/react'; export type RelayStatus = 'connected' | 'disconnected' | 'connecting'; export function useRelayStatus(relayUrl: string): RelayStatus { const { nostr } = useNostr(); - const [status, setStatus] = useState('connecting'); - useEffect(() => { - let mounted = true; - let ws: WebSocket | undefined; + const { status, isFetching, isError } = useQuery<"connected">({ + queryKey: ['relayStatus', relayUrl], + queryFn: async ({ signal }) => { + const relay = nostr.relay(relayUrl); + const timeout = AbortSignal.timeout(3000); + await relay.query([{ kinds: [0], limit: 1 }], { signal: AbortSignal.any([signal, timeout]) }); + return 'connected' as const; + }, + refetchInterval: 30000, + retry: false, + // initialData: 'connecting', // Not needed, handled below + }); - const checkConnection = async () => { - try { - // Get the relay instance - const relay = nostr.relay(relayUrl); - - // Try to establish a connection by making a simple query - const signal = AbortSignal.timeout(3000); - await relay.query([{ kinds: [0], limit: 1 }], { signal }); - - if (mounted) { - setStatus('connected'); - } - } catch { - if (mounted) { - setStatus('disconnected'); - } - } - }; - - // Initial connection check - checkConnection(); - - // Set up periodic connection checks every 30 seconds - const interval = setInterval(checkConnection, 30000); - - return () => { - mounted = false; - clearInterval(interval); - if (ws) { - ws.close(); - } - }; - }, [relayUrl, nostr]); - - return status; + if (isFetching) return 'connecting'; + if (isError) return 'disconnected'; + if (status === 'success') return 'connected'; + return 'connecting'; }