"use client"; /* People & sign-in: your account, password, two-factor, users, deactivated users, single sign-on, * and deleting your own account. Sign out lives in the rail, and in the More sheet on a phone. */ import { useState } from "react"; import { useRouter } from "next/navigation"; import { useSnap } from "@/lib/client"; import { Field } from "@/components/ui"; import { Tag } from "@/components/portal"; import TwoFactor from "@/components/TwoFactor"; import SsoSettings from "@/components/SsoSettings"; import type { UserRec } from "@/lib/compute"; import { Msg, SectionHead, useSaver } from "./common"; import { useBackupExport } from "./backup"; import UserDialog from "./UserDialog"; const row: React.CSSProperties = { display: "flex", alignItems: "center", gap: 14, padding: "11px 16px", borderTop: "1px solid #cfcccb", fontSize: 14, flexWrap: "wrap" }; export default function PeopleSignIn() { const { s, isAdmin, mutate } = useSnap(); const router = useRouter(); const { msg, say } = useSaver(); const { bkBusy, exportBackup } = useBackupExport(say); const [me, setMe] = useState({ first: s.session.first, last: s.session.last, title: s.session.title }); const meDirty = me.first !== s.session.first || me.last !== s.session.last || me.title !== s.session.title; const [pw, setPw] = useState({ current: "", next: "", again: "" }); const [userDlg, setUserDlg] = useState(false); const [del, setDel] = useState({ open: false, password: "", confirm: "", busy: false, err: "" }); const activeUsers = s.users.filter((u) => !u.inactive); const inactiveUsers = s.users.filter((u) => u.inactive); // The user list reaches admins only, and there is always an active admin, so an issuer is never last. const othersLeft = s.users.filter((u) => !u.inactive && u.id !== s.session.userId).length; const last = isAdmin && othersLeft === 0; return ( <> Your account
Signed in as {s.session.name} · {s.session.role} · {s.session.email}
{(c) => setMe({ ...me, first: e.target.value })} disabled={!!s.demo} />} {(c) => setMe({ ...me, last: e.target.value })} disabled={!!s.demo} />} {(c) => setMe({ ...me, title: e.target.value })} placeholder="e.g. Uniform Coordinator" disabled={!!s.demo} />}
Password
{(c) => setPw({ ...pw, current: e.target.value })} />} {(c) => setPw({ ...pw, next: e.target.value })} />} {(c) => setPw({ ...pw, again: e.target.value })} />}
Two-factor {isAdmin && ( <> {activeUsers.length} can sign in} right={}>Users
{activeUsers.map((u, i) => (
{u.first} {u.last} {u.title}
{u.email}
{u.role === "ADMIN" ? "Admin" : "Issuer"}
))}
{inactiveUsers.length > 0 && ( <> Deactivated users
{inactiveUsers.map((u, i) => (
{u.first} {u.last} {u.title}
{u.email}
{u.role === "ADMIN" ? "Admin" : "Issuer"}
))}
)} )} Single sign-on router.refresh()} mutate={mutate} /> Delete my account {last && (
)} {!del.open ? (
) : (
{(c) => setDel({ ...del, password: e.target.value, err: "" })} />} {last && {(c) => setDel({ ...del, confirm: e.target.value, err: "" })} />}}
)} {userDlg !== false && setUserDlg(false)} />} ); }