"use client"; import { useState } from "react"; import { useRouter } from "next/navigation"; import { UserRound, LockKeyhole, Mail } from "lucide-react"; import { api } from "./StartGame"; import { PasswordForm } from "./PasswordForm"; import { displayNameSchema } from "@/shared/account"; export function AccountSettings({ email, displayName, passwordUpdated = false, }: { email: string; displayName: string; passwordUpdated?: boolean; }) { const [name, setName] = useState(displayName), [message, setMessage] = useState(""), [error, setError] = useState(""), [busy, setBusy] = useState(false); const [recoveryMessage, setRecoveryMessage] = useState(""), [recoveryError, setRecoveryError] = useState(""), [sending, setSending] = useState(false); const router = useRouter(); async function save(event: React.FormEvent) { event.preventDefault(); setError(""); setMessage(""); const valid = displayNameSchema.safeParse(name); if (!valid.success) { setError(valid.error.issues[0].message); return; } setBusy(true); try { const data = await api<{ profile: { display_name: string } }>( "profile", { displayName: valid.data }, "PATCH", ); setName(data.profile.display_name); setMessage("Display name saved."); router.refresh(); } catch (e) { setError((e as Error).message); } finally { setBusy(false); } } async function recover() { setSending(true); setRecoveryError(""); try { const data = await api<{ message: string }>("auth", { action: "recover", email, }); setRecoveryMessage(data.message); } catch (e) { setRecoveryError((e as Error).message); } finally { setSending(false); } } return (

Your public profile.

A name for the maps and places you share.

Email address {email} Used for sign-in and recovery. Only you can see it.
{error && (

{error}

)} {message && (

{message}

)}

Password & security.

Keep your account yours.

{passwordUpdated && (

Your password has been updated.

)}

Signed up with an email link?

Set your first password, or recover a forgotten one, using a link sent to your account email.

{recoveryMessage && (

{recoveryMessage}

)} {recoveryError && (

{recoveryError}

)}
); }