diff --git a/src/app/auth/create.tsx b/src/app/auth/create.tsx index a5e38ab4..aa8f5d40 100644 --- a/src/app/auth/create.tsx +++ b/src/app/auth/create.tsx @@ -1,7 +1,7 @@ import { NDKEvent, NDKKind, NDKPrivateKeySigner } from '@nostr-dev-kit/ndk'; import { downloadDir } from '@tauri-apps/api/path'; import { writeText } from '@tauri-apps/plugin-clipboard-manager'; -import { message, save } from '@tauri-apps/plugin-dialog'; +import { save } from '@tauri-apps/plugin-dialog'; import { writeTextFile } from '@tauri-apps/plugin-fs'; import { motion } from 'framer-motion'; import { minidenticon } from 'minidenticons'; @@ -67,7 +67,6 @@ export function CreateAccountScreen() { const event = new NDKEvent(ndk); event.content = JSON.stringify(profile); event.kind = NDKKind.Metadata; - event.created_at = Math.floor(Date.now() / 1000); event.pubkey = userPubkey; event.tags = []; @@ -76,6 +75,16 @@ export function CreateAccountScreen() { if (publish) { await db.createAccount(userNpub, userPubkey); await db.secureSave(userPubkey, userPrivkey); + + const relayListEvent = new NDKEvent(ndk); + relayListEvent.kind = NDKKind.RelayList; + relayListEvent.tags = [...ndk.pool.relays.values()].map((item) => [ + 'r', + item.url, + ]); + + await relayListEvent.publish(); + setKeys({ npub: userNpub, nsec: userNsec, @@ -88,7 +97,7 @@ export function CreateAccountScreen() { setLoading(false); } } catch (e) { - return toast(e); + return toast.error(e); } }; @@ -113,7 +122,7 @@ export function CreateAccountScreen() { setDownloaded(true); } // else { user cancel action } } catch (e) { - await message(e, { title: 'Cannot download account keys', type: 'error' }); + return toast.error(e); } }; diff --git a/src/app/auth/follow.tsx b/src/app/auth/follow.tsx index 24de8028..cf436143 100644 --- a/src/app/auth/follow.tsx +++ b/src/app/auth/follow.tsx @@ -66,7 +66,7 @@ export function FollowScreen() { const submit = async () => { try { setLoading(true); - if (!follows.length) navigate('/'); + if (!follows.length) return navigate('/auth/finish'); const event = new NDKEvent(ndk); event.kind = NDKKind.Contacts; @@ -81,7 +81,8 @@ export function FollowScreen() { if (item.startsWith('npub')) return nip19.decode(item).data as string; return item; }); - navigate('/auth/finish'); + + return navigate('/auth/finish'); } } catch (e) { setLoading(false); diff --git a/src/app/relays/components/relayForm.tsx b/src/app/relays/components/relayForm.tsx index 63115414..20d1ea50 100644 --- a/src/app/relays/components/relayForm.tsx +++ b/src/app/relays/components/relayForm.tsx @@ -1,69 +1,62 @@ -import { useQueryClient } from '@tanstack/react-query'; +import { NDKRelayUrl } from '@nostr-dev-kit/ndk'; +import { normalizeRelayUrl } from 'nostr-fetch'; import { useState } from 'react'; - -import { useStorage } from '@libs/storage/provider'; +import { toast } from 'sonner'; import { PlusIcon } from '@shared/icons'; +import { useRelay } from '@utils/hooks/useRelay'; + const domainRegex = /^([a-z0-9]+(-[a-z0-9]+)*\.)+[a-z]{2,}$/; export function RelayForm() { - const { db } = useStorage(); - const queryClient = useQueryClient(); + const { connectRelay } = useRelay(); + const [relay, setRelay] = useState<{ + url: NDKRelayUrl; + purpose: 'read' | 'write' | undefined; + }>({ url: '', purpose: undefined }); - const [url, setUrl] = useState(''); - const [error, setError] = useState(''); - - const createRelay = async () => { - if (url.length < 1) return setError('Please enter relay url'); + const create = () => { + if (relay.url.length < 1) return toast.info('Please enter relay url'); try { - const relay = new URL(url.replace(/\s/g, '')); + const relayUrl = new URL(relay.url.replace(/\s/g, '')); if ( - domainRegex.test(relay.host) && - (relay.protocol === 'wss:' || relay.protocol === 'ws:') + domainRegex.test(relayUrl.host) && + (relayUrl.protocol === 'wss:' || relayUrl.protocol === 'ws:') ) { - const res = await db.createRelay(url); - if (!res) return setError("You're already using this relay"); - - queryClient.invalidateQueries({ - queryKey: ['user-relay'], - }); - - setError(''); - setUrl(''); + connectRelay.mutate(normalizeRelayUrl(relay.url)); + setRelay({ url: '', purpose: undefined }); } else { - return setError( + return toast.error( 'URL is invalid, a relay must use websocket protocol (start with wss:// or ws://). Please check again' ); } } catch { - return setError('Relay URL is not valid. Please check again'); + return toast.error('Relay URL is not valid. Please check again'); } }; return (