diff --git a/apps/admin-ui/src/app/viewers/page.tsx b/apps/admin-ui/src/app/viewers/page.tsx index 0a7d89a..cf51d02 100644 --- a/apps/admin-ui/src/app/viewers/page.tsx +++ b/apps/admin-ui/src/app/viewers/page.tsx @@ -167,6 +167,7 @@ export default function ViewersPage() { const [addonInstallUrls, setAddonInstallUrls] = useState>({}); const [claimCodes, setClaimCodes] = useState>({}); const [newPasswords, setNewPasswords] = useState>({}); + const [editEmails, setEditEmails] = useState>({}); const load = useCallback(() => { fetch("/api/v1/admin/viewers", { credentials: "include" }) @@ -633,6 +634,39 @@ export default function ViewersPage() { } } + async function changeViewerEmail(v: Viewer) { + const next = (editEmails[v.id] ?? v.email).trim().toLowerCase(); + if (!next || !next.includes("@")) { + setErr("Ongeldig e-mailadres"); + return; + } + if (next === v.email.toLowerCase()) { + setMsg("E-mailadres is ongewijzigd"); + return; + } + setActionId(`email-${v.id}`); + setMsg(null); + setErr(null); + try { + const res = await fetch(`/api/v1/admin/viewers/${v.id}`, { + method: "PATCH", + credentials: "include", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ email: next }), + }); + const data = await res.json().catch(() => ({})); + if (!res.ok) { + setErr(data.error?.message ?? "E-mail wijzigen mislukt"); + return; + } + setEditEmails((prev) => ({ ...prev, [v.id]: next })); + setMsg(`E-mail gewijzigd naar ${next}`); + load(); + } finally { + setActionId(null); + } + } + async function deleteViewer(v: Viewer) { const label = v.name || v.email; if ( @@ -979,6 +1013,41 @@ export default function ViewersPage() {
+ +