mirror of
https://github.com/mroxso/zelo-news.git
synced 2026-06-04 17:41:10 +02:00
Update src/hooks/useRelayStatus.ts
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
This commit is contained in:
@@ -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';
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user