mirror of
https://gitlab.com/soapbox-pub/mkstack.git
synced 2025-08-27 13:09:22 +00:00
63 lines
1.7 KiB
TypeScript
63 lines
1.7 KiB
TypeScript
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<NostrProviderProps> = (props) => {
|
|
const { children } = props;
|
|
const { config, presetRelays } = useAppContext();
|
|
|
|
const queryClient = useQueryClient();
|
|
|
|
// Create NPool instance only once
|
|
const pool = useRef<NPool | undefined>(undefined);
|
|
|
|
// Use refs so the pool always has the latest data
|
|
const relayUrl = useRef<string>(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<string>([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 (
|
|
<NostrContext.Provider value={{ nostr: pool.current }}>
|
|
{children}
|
|
</NostrContext.Provider>
|
|
);
|
|
};
|
|
|
|
export default NostrProvider; |