2024-09-11 19:16:50 -05:00
|
|
|
import React, { createContext, useContext, useEffect, useState, useMemo } from 'react';
|
2024-08-06 19:52:06 -05:00
|
|
|
import NDK, { NDKNip07Signer } from "@nostr-dev-kit/ndk";
|
2024-08-25 18:15:45 -05:00
|
|
|
import NDKCacheAdapterDexie from "@nostr-dev-kit/ndk-cache-dexie";
|
2024-09-11 19:16:50 -05:00
|
|
|
import { useLocalStorage } from "@/hooks/useLocalStorage";
|
2024-08-04 17:02:34 -05:00
|
|
|
|
|
|
|
const NDKContext = createContext(null);
|
|
|
|
|
2024-09-11 19:16:50 -05:00
|
|
|
export const defaultRelayUrls = [
|
2024-08-13 16:28:25 -05:00
|
|
|
"wss://nos.lol/",
|
|
|
|
"wss://relay.damus.io/",
|
|
|
|
"wss://relay.snort.social/",
|
|
|
|
"wss://relay.nostr.band/",
|
|
|
|
"wss://relay.mutinywallet.com/",
|
2024-09-10 15:44:08 -05:00
|
|
|
"wss://relay.primal.net/",
|
|
|
|
"wss://nostr21.com/",
|
|
|
|
"wss://nostrue.com/",
|
|
|
|
"wss://purplerelay.com/",
|
2024-08-04 17:02:34 -05:00
|
|
|
];
|
|
|
|
|
|
|
|
export const NDKProvider = ({ children }) => {
|
2024-08-13 16:28:25 -05:00
|
|
|
const [ndk, setNdk] = useState(null);
|
2024-09-11 19:16:50 -05:00
|
|
|
const [userRelays, setUserRelays] = useLocalStorage("userRelays", defaultRelayUrls);
|
|
|
|
|
|
|
|
const createNDKInstance = (relays) => {
|
|
|
|
const allRelays = [...new Set([...defaultRelayUrls, ...relays])];
|
|
|
|
return new NDK({
|
|
|
|
explicitRelayUrls: allRelays,
|
|
|
|
enableOutboxModel: true,
|
|
|
|
outboxRelayUrls: ["wss://nos.lol/"],
|
|
|
|
cacheAdapter: new NDKCacheAdapterDexie({ dbName: 'ndk-cache' })
|
|
|
|
});
|
|
|
|
};
|
2024-08-04 17:02:34 -05:00
|
|
|
|
2024-08-13 16:28:25 -05:00
|
|
|
useEffect(() => {
|
2024-09-11 19:16:50 -05:00
|
|
|
setNdk(createNDKInstance(userRelays));
|
|
|
|
}, [userRelays]);
|
|
|
|
|
|
|
|
const reInitializeNDK = () => {
|
|
|
|
const newInstance = createNDKInstance(userRelays);
|
|
|
|
setNdk(newInstance);
|
|
|
|
};
|
2024-08-04 17:02:34 -05:00
|
|
|
|
2024-08-13 16:28:25 -05:00
|
|
|
const addSigner = async () => {
|
|
|
|
if (ndk) {
|
|
|
|
const nip07signer = new NDKNip07Signer();
|
|
|
|
await ndk.signer?.user();
|
|
|
|
ndk.signer = nip07signer;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
return (
|
2024-09-11 19:16:50 -05:00
|
|
|
<NDKContext.Provider value={{ ndk, addSigner, reInitializeNDK, userRelays, setUserRelays }}>
|
2024-08-13 16:28:25 -05:00
|
|
|
{children}
|
|
|
|
</NDKContext.Provider>
|
|
|
|
);
|
2024-08-04 17:02:34 -05:00
|
|
|
};
|
|
|
|
|
|
|
|
export const useNDKContext = () => {
|
2024-08-13 16:28:25 -05:00
|
|
|
return useContext(NDKContext);
|
|
|
|
};
|