import React, { useState, useEffect } from "react"; import { Trans, useTranslation } from "react-i18next"; import classnames from "classnames"; import { getHttpUserClient, HttpUser, kUserPermissionList } from "@/http/user"; import OperationDialog, { OperationDialogBoolInput, } from "../common/dailog/OperationDialog"; import Button from "../common/button/Button"; import Spinner from "../common/Spinner"; import FlatButton from "../common/button/FlatButton"; const CreateUserDialog: React.FC<{ open: boolean; close: () => void; onSuccess: (user: HttpUser) => void; }> = ({ open, close, onSuccess }) => { return ( getHttpUserClient().post({ username, password, }) } onClose={close} open={open} onSuccessAndClose={onSuccess} /> ); }; const UsernameLabel: React.FC<{ children: React.ReactNode }> = (props) => { return {props.children}; }; const UserDeleteDialog: React.FC<{ open: boolean; close: () => void; user: HttpUser; onSuccess: () => void; }> = ({ open, close, user, onSuccess }) => { return ( ( 0{user.username}2 )} onProcess={() => getHttpUserClient().delete(user.username)} onSuccessAndClose={onSuccess} /> ); }; const UserModifyDialog: React.FC<{ open: boolean; close: () => void; user: HttpUser; onSuccess: () => void; }> = ({ open, close, user, onSuccess }) => { return ( ( 0{user.username}2 )} inputScheme={ [ { type: "text", label: "admin:user.username", initValue: user.username, }, { type: "text", label: "admin:user.password" }, { type: "text", label: "admin:user.nickname", initValue: user.nickname, }, ] as const } onProcess={([username, password, nickname]) => getHttpUserClient().patch(user.username, { username: username !== user.username ? username : undefined, password: password !== "" ? password : undefined, nickname: nickname !== user.nickname ? nickname : undefined, }) } onSuccessAndClose={onSuccess} /> ); }; const UserPermissionModifyDialog: React.FC<{ open: boolean; close: () => void; user: HttpUser; onSuccess: () => void; }> = ({ open, close, user, onSuccess }) => { const oldPermissionBoolList: boolean[] = kUserPermissionList.map( (permission) => user.permissions.includes(permission) ); return ( ( 0{user.username}2 )} inputScheme={kUserPermissionList.map( (permission, index) => ({ type: "bool", label: permission, initValue: oldPermissionBoolList[index], }) )} onProcess={async (newPermissionBoolList): Promise => { for (let index = 0; index < kUserPermissionList.length; index++) { const oldValue = oldPermissionBoolList[index]; const newValue = newPermissionBoolList[index]; const permission = kUserPermissionList[index]; if (oldValue === newValue) continue; if (newValue) { await getHttpUserClient().putUserPermission( user.username, permission ); } else { await getHttpUserClient().deleteUserPermission( user.username, permission ); } } return newPermissionBoolList; }} onSuccessAndClose={onSuccess} /> ); }; interface UserItemProps { user: HttpUser; onChange: () => void; } const UserItem: React.FC = ({ user, onChange }) => { const { t } = useTranslation(); const [dialog, setDialog] = useState< "delete" | "modify" | "permission" | null >(null); const [editMaskVisible, setEditMaskVisible] = React.useState(false); return ( <>
setEditMaskVisible(true)} />
{user.username}
{t("admin:user.nickname")} {user.nickname} {t("admin:user.uniqueId")} {user.uniqueId} {t("admin:user.permissions")} {user.permissions.map((permission) => { return ( {permission}{" "} ); })}
setEditMaskVisible(false)} > setDialog("modify")} /> setDialog("permission")} /> setDialog("delete")} />
setDialog(null)} user={user} onSuccess={onChange} /> setDialog(null)} user={user} onSuccess={onChange} /> setDialog(null)} user={user} onSuccess={onChange} /> ); }; const UserAdmin: React.FC = () => { const [users, setUsers] = useState(null); const [dialog, setDialog] = useState<"create" | null>(null); const [usersVersion, setUsersVersion] = useState(0); const updateUsers = (): void => { setUsersVersion(usersVersion + 1); }; useEffect(() => { let subscribe = true; void getHttpUserClient() .list() .then((us) => { if (subscribe) { setUsers(us); } }); return () => { subscribe = false; }; }, [usersVersion]); if (users) { const userComponents = users.map((user) => { return ( ); }); return ( <>
{userComponents} setDialog(null)} onSuccess={updateUsers} /> ); } else { return ; } }; export default UserAdmin;