Update src/hooks/useRelayStatus.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
This commit is contained in:
mroxso
2025-11-26 10:25:10 +01:00
committed by GitHub
parent 98ac9241e5
commit 3bba617cf0

View File

@@ -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<RelayStatus>('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';
}