import * as ed from "@noble/ed25519"; import { base58 } from "@scure/base"; import { useState } from "react"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Button } from "@/components/ui/button"; import { saveAccounts } from "@/lib/accounts"; import Enclave from "@/app/app"; import { Avatar, AvatarFallback, AvatarImage } from "../ui/avatar"; function readFileAsDataUrl(file: File): Promise { return new Promise((resolve, reject) => { const reader = new FileReader(); reader.onload = () => resolve(reader.result as string); reader.onerror = () => reject(new Error("Failed to read image")); reader.readAsDataURL(file); }); } export function NewProfilePage({ appRef, }: { appRef: React.RefObject; }) { const [displayName, setDisplayName] = useState(""); const [avatar, setAvatar] = useState(null); const [error, setError] = useState(null); const [submitting, setSubmitting] = useState(false); async function handleAvatarChange(e: React.ChangeEvent) { const file = e.target.files?.[0]; if (!file) return; if (!file.type.startsWith("image/")) { setError("Please select an image file"); return; } try { const dataUrl = await readFileAsDataUrl(file); setAvatar(dataUrl); setError(null); } catch { setError("Failed to load image"); } } async function handleCreate() { const name = displayName.trim(); if (!name) { setError("Display name is required"); return; } setSubmitting(true); setError(null); try { if (!appRef.current) { console.error("AppRef is not initialized yet"); return; } if (!appRef.current.accounts) { appRef.current.accounts = { activeAccount: 0, accounts: [] }; } const { secretKey } = ed.keygen(); const newAccount = { displayName: name, privateKey: base58.encode(secretKey), avatar: avatar ?? undefined, }; appRef.current.accounts.activeAccount = appRef.current.accounts.accounts.length; appRef.current.accounts.accounts.push(newAccount); saveAccounts(appRef.current.accounts); } catch (e) { setError(e instanceof Error ? e.message : "Failed to create profile"); } finally { setSubmitting(false); window.location.reload(); } } return (

Create your profile

Enclave generates a keypair for your identity — no email or password required.

setDisplayName(e.target.value)} onKeyDown={(e) => e.key === "Enter" && handleCreate()} /> {error &&

{error}

}
); }