import { 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 { useNavigate } from 'react-router-dom'; import { useArk, useStorage } from '@libs/ark'; import { CheckCircleIcon, LoaderIcon, PlusIcon, UnverifiedIcon } from '@shared/icons'; export function EditProfileScreen() { const [loading, setLoading] = useState(false); const [picture, setPicture] = useState(''); const [banner, setBanner] = useState(''); const [nip05, setNIP05] = useState({ verified: true, text: '' }); const ark = useArk(); const storage = useStorage(); const { register, handleSubmit, reset, setError, formState: { isValid, errors }, } = useForm({ defaultValues: async () => { const res: NDKUserProfile = queryClient.getQueryData([ 'user', storage.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 queryClient = useQueryClient(); const navigate = useNavigate(); const uploadAvatar = async () => { try { if (!ark.ndk.signer) return navigate('/new/privkey'); setLoading(true); const image = await ark.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 ark.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); let content = { ...data, username: data.name, display_name: data.name, bio: data.about, image: data.picture, }; if (data.nip05) { const verify = ark.validateNIP05({ pubkey: storage.account.pubkey, nip05: data.nip05, }); if (verify) { content = { ...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", }); } } const publish = await ark.createEvent({ kind: NDKKind.Metadata, tags: [], content: JSON.stringify(content), }); if (publish) { // invalid cache queryClient.invalidateQueries({ queryKey: ['user', storage.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()}

)}