From 6162722c875d0c07813fdc62dc1fb3023fb65dc4 Mon Sep 17 00:00:00 2001 From: makearmy Date: Tue, 30 Sep 2025 13:12:17 -0400 Subject: [PATCH] account page render fix --- app/portal/account/AccountPanel.tsx | 99 +++++++++++++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 app/portal/account/AccountPanel.tsx diff --git a/app/portal/account/AccountPanel.tsx b/app/portal/account/AccountPanel.tsx new file mode 100644 index 00000000..2d566c10 --- /dev/null +++ b/app/portal/account/AccountPanel.tsx @@ -0,0 +1,99 @@ +// app/portal/account/AccountPanel.tsx +"use client"; + +import { useEffect, useState } from "react"; + +type Me = { + id: string; + username: string; + first_name?: string | null; + last_name?: string | null; + email?: string | null; + location?: string | null; + avatar?: { id: string; filename_download: string } | null; +}; + +export default function AccountPanel() { + const [me, setMe] = useState(null); + const [err, setErr] = useState(null); + const [loading, setLoading] = useState(true); + + useEffect(() => { + let alive = true; + (async () => { + try { + setErr(null); + const r = await fetch("/api/account", { + credentials: "include", + cache: "no-store", + }); + if (!r.ok) throw new Error(`Load failed (${r.status})`); + const j = await r.json(); + if (alive) setMe(j); + } catch (e: any) { + if (alive) setErr(e?.message || "Failed to load account"); + } finally { + if (alive) setLoading(false); + } + })(); + return () => { + alive = false; + }; + }, []); + + if (loading) return
Loading…
; + if (err) return
Error: {err}
; + if (!me) return null; + + const avatarUrl = + me.avatar?.id + ? `${process.env.NEXT_PUBLIC_API_BASE_URL?.replace(/\/$/, "")}/assets/${me.avatar.id}` + : null; + + return ( +
+
+

Account

+ +
+
+ {avatarUrl ? ( + // eslint-disable-next-line @next/next/no-img-element + Avatar + ) : ( + No Avatar + )} +
+
+ Usernames can’t be changed. +
+
+ +
+
+
Username
+
{me.username}
+
+
+
First Name
+
{me.first_name || "—"}
+
+
+
Last Name
+
{me.last_name || "—"}
+
+
+
Email
+
{me.email || "—"}
+
+
+
Location
+
{me.location || "—"}
+
+
+
+ + {/* Add your edit forms/buttons below; they should only trigger reauth on submit */} +
+ ); +}