import { useState } from "react"; import { del, patch, post } from "../../api"; import { useFetch } from "../../hooks"; import { fmtDate, useT } from "../../i18n"; import { useStore } from "../../store"; import type { User } from "../../types"; import { confirmDialog, promptDialog, toast } from "../../dialogs"; export function Users() { const t = useT(); const me = useStore((s) => s.me); const { data: users, reload } = useFetch("/users"); const [form, setForm] = useState({ username: "", display_name: "", password: "", role: "user" }); const [notice, setNotice] = useState<{ ok: boolean; text: string }>(); const run = async (fn: () => Promise, ok = t("settings.saved")) => { try { await fn(); setNotice({ ok: true, text: ok }); reload(); } catch (e: any) { setNotice({ ok: false, text: e.message }); } }; const resetPassword = async (u: User) => { const pw = await promptDialog({ message: t("users.newPasswordFor", { name: u.username }), password: true }); if (pw) void run(() => patch(`/users/${u.id}`, { password: pw })); }; return ( <>
{t("users.intro")}
{notice &&
{notice.text}
}
{users?.map((u) => ( ))}
{t("users.username")} {t("users.displayName")} {t("users.role")} {t("users.login")} {t("users.quota")} {t("users.created")}
{u.username} {u.id === me?.id && {t("users.you")}} {u.display_name} {u.has_password && {t("users.password")}} {u.oidc && SSO} {fmtDate(u.created_at, false)}
{u.id !== me?.id && ( )}

{t("users.add")}

setForm({ ...form, username: e.target.value })} autoCapitalize="none" />
{t("users.usernameHint")}
setForm({ ...form, display_name: e.target.value })} /> setForm({ ...form, password: e.target.value })} autoComplete="new-password" />
{t("users.passwordHint")}
); }