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 { writeTextFile } from '@tauri-apps/plugin-fs'; import { motion } from 'framer-motion'; import { minidenticon } from 'minidenticons'; import { generatePrivateKey, getPublicKey, nip19 } from 'nostr-tools'; import { useState } from 'react'; import { useForm } from 'react-hook-form'; import { useNavigate } from 'react-router-dom'; import { toast } from 'sonner'; import { useNDK } from '@libs/ndk/provider'; import { useStorage } from '@libs/storage/provider'; import { AvatarUploader } from '@shared/avatarUploader'; import { ArrowLeftIcon, LoaderIcon } from '@shared/icons'; import { User } from '@shared/user'; export function CreateAccountScreen() { const [picture, setPicture] = useState(''); const [downloaded, setDownloaded] = useState(false); const [loading, setLoading] = useState(false); const [keys, setKeys] = useState(null); const { register, handleSubmit, formState: { isDirty, isValid }, } = useForm(); const { db } = useStorage(); const { ndk } = useNDK(); const navigate = useNavigate(); const svgURI = 'data:image/svg+xml;utf8,' + encodeURIComponent(minidenticon('lume new account', 90, 50)); const onSubmit = async (data: { name: string; about: string }) => { try { if (!ndk.signer) return navigate('/new/privkey'); setLoading(true); const profile = { ...data, name: data.name, display_name: data.name, bio: data.about, picture: picture, avatar: picture, }; const userPrivkey = generatePrivateKey(); const userPubkey = getPublicKey(userPrivkey); const userNpub = nip19.npubEncode(userPubkey); const userNsec = nip19.nsecEncode(userPrivkey); const signer = new NDKPrivateKeySigner(userPrivkey); ndk.signer = signer; 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 = []; const publish = await event.publish(); if (publish) { await db.createAccount(userNpub, userPubkey); await db.secureSave(userPubkey, userPrivkey); setKeys({ npub: userNpub, nsec: userNsec, pubkey: userPubkey, privkey: userPrivkey, }); setLoading(false); } else { toast('Create account failed'); setLoading(false); } } catch (e) { return toast(e); } }; const copyNsec = async () => { await writeText(keys.nsec); }; const download = async () => { try { const downloadPath = await downloadDir(); const fileName = `nostr_keys_${new Date().toISOString()}.txt`; const filePath = await save({ defaultPath: downloadPath + '/' + fileName, }); if (filePath) { await writeTextFile( filePath, `Nostr account, generated by Lume (lume.nu)\nPublic key: ${keys.npub}\nPrivate key: ${keys.nsec}` ); setDownloaded(true); } // else { user cancel action } } catch (e) { await message(e, { title: 'Cannot download account keys', type: 'error' }); } }; return (
{!keys ? ( ) : null}

Let's set up your account.

{!keys ? (
Avatar
{picture.length > 0 ? ( user's avatar ) : ( user's avatar )}