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 { useAppConfig } from './AppProvider'; interface NostrProviderProps { children: React.ReactNode; } const NostrProvider: React.FC = (props) => { const { children } = props; const { config, availableRelays } = useAppConfig(); 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); const available = useRef(availableRelays); // Update refs when config changes useEffect(() => { relayUrl.current = config.relayUrl; available.current = availableRelays; queryClient.resetQueries(); }, [config.relayUrl, availableRelays, 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) { return available.current.map((info) => info.url); }, }); } return ( {children} ); }; export default NostrProvider;