import { useQuery } from '@tanstack/react-query'; import { useEffect, useState } from 'react'; import { useNavigate } from 'react-router-dom'; import { UserRelay } from '@app/auth/components/userRelay'; import { useNDK } from '@libs/ndk/provider'; import { useStorage } from '@libs/storage/provider'; import { ArrowRightCircleIcon, CheckCircleIcon, LoaderIcon } from '@shared/icons'; import { FULL_RELAYS } from '@stores/constants'; import { useOnboarding } from '@stores/onboarding'; import { useNostr } from '@utils/hooks/useNostr'; export function OnboardStep3Screen() { const navigate = useNavigate(); const [setStep, clearStep] = useOnboarding((state) => [state.setStep, state.clearStep]); const [loading, setLoading] = useState(false); const [relays, setRelays] = useState(new Set()); const { publish } = useNostr(); const { db } = useStorage(); const { ndk } = useNDK(); const { status, data } = useQuery( ['relays'], async () => { const tmp = new Map(); const events = await ndk.fetchEvents({ kinds: [10002], authors: db.account.follows, }); if (events) { events.forEach((event) => { event.tags.forEach((tag) => { tmp.set(tag[1], event.pubkey); }); }); } return tmp; }, { enabled: db.account ? true : false, refetchOnWindowFocus: false, } ); const relaysAsArray = Array.from(data?.keys() || []); const toggleRelay = (relay: string) => { if (relays.has(relay)) { setRelays((prev) => { prev.delete(relay); return new Set(prev); }); } else { setRelays((prev) => new Set(prev.add(relay))); } }; const submit = async (skip?: boolean) => { try { setLoading(true); if (!skip) { for (const relay of relays) { await db.createRelay(relay); } const tags = Array.from(relays).map((relay) => ['r', relay.replace(/\/+$/, '')]); await publish({ content: '', kind: 10002, tags: tags }); } else { for (const relay of FULL_RELAYS) { await db.createRelay(relay); } } // update last login await db.updateLastLogin(); clearStep(); navigate('/', { replace: true }); } catch (e) { setLoading(false); console.log('error: ', e); } }; useEffect(() => { // save current step, if user close app and reopen it setStep('/auth/onboarding/step-3'); }, []); return (

Relay discovery

You can add relay which is using by who you're following to easier reach their content. Learn more about relay{' '} here (nostr.com)

{status === 'loading' ? (
) : relaysAsArray.length === 0 ? (

Lume couldn't find any relays from your follows.
You can skip this step and use default relays instead.

) : ( relaysAsArray.map((item, index) => ( )) )} {relays.size > 5 && (

Using too much relay can cause high resource usage

)}
); }