-
@ Doop
2024-08-02 21:48:50```js import { useState, useEffect, useCallback, useContext, useRef } from 'react'; import axios from 'axios'; import { nip57, nip19 } from 'nostr-tools'; import { NostrContext } from '@/context/NostrContext'; import { lnurlEncode } from '@/utils/lnurl'; import { parseEvent } from '@/utils/nostr'; import { v4 as uuidv4 } from 'uuid';
const defaultRelays = [ "wss://nos.lol/", "wss://relay.damus.io/", "wss://relay.snort.social/", "wss://relay.nostr.band/", "wss://nostr.mutinywallet.com/", "wss://relay.mutinywallet.com/", "wss://relay.primal.net/" ];
const AUTHOR_PUBKEY = process.env.NEXT_PUBLIC_AUTHOR_PUBKEY;
export function useNostr() { const pool = useContext(NostrContext); const subscriptionQueue = useRef([]); const lastSubscriptionTime = useRef(0); const throttleDelay = 2000;
const processSubscriptionQueue = useCallback(() => { if (subscriptionQueue.current.length === 0) return; const currentTime = Date.now(); if (currentTime - lastSubscriptionTime.current < throttleDelay) { setTimeout(processSubscriptionQueue, throttleDelay); return; } const subscription = subscriptionQueue.current.shift(); subscription(); lastSubscriptionTime.current = currentTime; setTimeout(processSubscriptionQueue, throttleDelay); }, [throttleDelay]); const subscribe = useCallback( (filters, opts) => { if (!pool) return; const subscriptionFn = () => { return pool.subscribeMany(defaultRelays, filters, opts); }; subscriptionQueue.current.push(subscriptionFn); processSubscriptionQueue(); }, [pool, processSubscriptionQueue] ); const publish = useCallback( async (event) => { if (!pool) return; try { console.log('publishing event', event) const result = await Promise.any(pool.publish(defaultRelays, event)); console.log('result', result) console.log('Published event to at least one relay'); return true; } catch (error) { console.error('Failed to publish event:', error); return false; } }, [pool] );
```