Aug 2, 2024

testing random resource

htyehsehfshyshf
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]
    );