import { NDKEvent, NDKKind, NDKUserProfile } from '@nostr-dev-kit/ndk'; import { useQueryClient } from '@tanstack/react-query'; import { message } from '@tauri-apps/plugin-dialog'; import { useState } from 'react'; import { useForm } from 'react-hook-form'; import { useNDK } from '@libs/ndk/provider'; import { useStorage } from '@libs/storage/provider'; import { CheckCircleIcon, LoaderIcon, PlusIcon, UnverifiedIcon } from '@shared/icons'; import { useNostr } from '@utils/hooks/useNostr'; export function EditProfileScreen() { const queryClient = useQueryClient(); const [loading, setLoading] = useState(false); const [picture, setPicture] = useState(''); const [banner, setBanner] = useState(''); const [nip05, setNIP05] = useState({ verified: true, text: '' }); const { db } = useStorage(); const { ndk } = useNDK(); const { upload } = useNostr(); const { register, handleSubmit, reset, setError, formState: { isValid, errors }, } = useForm({ defaultValues: async () => { const res: NDKUserProfile = queryClient.getQueryData(['user', db.account.pubkey]); if (res.image) { setPicture(res.image); } if (res.banner) { setBanner(res.banner); } if (res.nip05) { setNIP05((prev) => ({ ...prev, text: res.nip05 })); } return res; }, }); const uploadAvatar = async () => { try { setLoading(true); const image = await upload(); if (image) { setPicture(image); setLoading(false); } } catch (e) { setLoading(false); await message(`Upload failed, error: ${e}`, { title: 'Lume', type: 'error' }); } }; const uploadBanner = async () => { try { setLoading(true); const image = await upload(); if (image) { setBanner(image); setLoading(false); } } catch (e) { setLoading(false); await message(`Upload failed, error: ${e}`, { title: 'Lume', type: 'error' }); } }; const onSubmit = async (data: NDKUserProfile) => { // start loading setLoading(true); const content = { ...data, username: data.name, display_name: data.name, bio: data.about, image: data.picture, }; const event = new NDKEvent(ndk); event.kind = NDKKind.Metadata; event.tags = []; if (data.nip05) { const user = ndk.getUser({ pubkey: db.account.pubkey }); const verify = await user.validateNip05(data.nip05); if (verify) { event.content = JSON.stringify({ ...content, nip05: data.nip05 }); } else { setNIP05((prev) => ({ ...prev, verified: false })); setError('nip05', { type: 'manual', message: "Can't verify your Lume ID / NIP-05, please check again", }); } } else { event.content = JSON.stringify(content); } const publishedRelays = await event.publish(); if (publishedRelays) { // invalid cache queryClient.invalidateQueries({ queryKey: ['user', db.account.pubkey], }); // reset form reset(); // reset state setLoading(false); setPicture(null); setBanner(null); } else { setLoading(false); } }; return (
{banner ? ( user's banner ) : (
)}
user's avatar
{nip05.verified ? ( Verified ) : ( Unverified )}
{errors.nip05 && (

{errors.nip05.message.toString()}

)}