import React, { useEffect, useRef } from 'react'; import { NostrEvent, NPool, NRelay1 } from '@nostrify/nostrify'; import { NostrContext } from '@nostrify/react'; import { useQueryClient } from '@tanstack/react-query'; import { useAppContext } from '@/hooks/useAppContext'; interface NostrProviderProps { children: React.ReactNode; } const NostrProvider: React.FC = (props) => { const { children } = props; const { config, presetRelays } = useAppContext(); const queryClient = useQueryClient(); // Create NPool instance only once const pool = useRef(undefined); // Use refs so the pool always has the latest data const relayUrl = useRef(config.relayUrl); // Update refs when config changes useEffect(() => { relayUrl.current = config.relayUrl; queryClient.resetQueries(); }, [config.relayUrl, queryClient]); // Initialize NPool only once if (!pool.current) { pool.current = new NPool({ open(url: string) { return new NRelay1(url); }, reqRouter(filters) { return new Map([[relayUrl.current, filters]]); }, eventRouter(_event: NostrEvent) { // Publish to the selected relay const allRelays = new Set([relayUrl.current]); // Also publish to the preset relays, capped to 5 for (const { url } of (presetRelays ?? [])) { allRelays.add(url); if (allRelays.size >= 5) { break; } } return [...allRelays]; }, }); } return ( {children} ); }; export default NostrProvider;