import React, { useEffect, useContext, useState } from "react"; import { useHistory, useParams } from "react-router-dom"; import { Button, Col, Form, Input, PageHeader, Popconfirm, Popover, Row, Tag, Select, Space, Spin, Switch } from "antd"; import DeleteOutlined from "@ant-design/icons/DeleteOutlined"; import { libLink } from "@clusterio/lib"; import { useAccount } from "../model/account"; import ControlContext from "./ControlContext"; import PageLayout from "./PageLayout"; import { notifyErrorHandler } from "../util/notify"; function useUser(name) { let control = useContext(ControlContext); let [user, setUser] = useState({ loading: true }); function updateUser() { // XXX optimize by requesting only the user in question libLink.messages.listUsers.send(control).then(result => { let match = result.list.find(u => u.name === name); if (!match) { setUser({ missing: true }); } else { setUser({ ...match, present: true }); } }); } useEffect(() => { updateUser(); }, [name]); return [user, updateUser]; } export default function UserViewPage() { let params = useParams(); let userName = params.name; let history = useHistory(); let account = useAccount(); let control = useContext(ControlContext); let [user, updateUser] = useUser(userName); let [roles, setRoles] = useState(null); let [form] = Form.useForm(); let [rolesDirty, setRolesDirty] = useState(false); let [applyingRoles, setApplyingRoles] = useState(false); let [rolesError, setRolesError] = useState(); let [banUserPopover, setBanUserPopover] = useState(false); useEffect(() => { libLink.messages.listRoles.send(control).then(result => { setRoles(new Map(result["list"].map(role => [role["id"], role]))); }).catch(() => { setRoles(new Map()); }); }, []); let nav = [{ name: "Users", path: "/users" }, { name: userName }]; if (user.loading) { return ; } if (user.missing) { return

User with name {userName} was not found on the master server.

; } let roleSelector = (rolesError ? Promise.reject(rolesError) : Promise.resolve()) }, ]} > ; return Delete user account and all data associated with it? {(user["is_banned"] && <>
This will remove the user ban!)} } placement="bottomRight" okText="Delete" okButtonProps={{ danger: true }} onConfirm={() => { libLink.messages.deleteUser.send( control, { name: userName } ).then(() => { history.push("/users"); }).catch(notifyErrorHandler("Error deleting user")); }} > } />
{account.hasPermission("core.user.update_roles") ? roleSelector : [...user["roles"]].map(id => { roles ? (roles.get(id) || { name: id })["name"] : id }) } {account.hasPermission("core.user.update_roles") && } { libLink.messages.setUserAdmin.send(control, { name: userName, admin: !user["is_admin"], create: false, }).then(() => { updateUser(); }).catch(notifyErrorHandler("Error toggling user admin status")); }} /> { libLink.messages.setUserWhitelisted.send(control, { name: userName, whitelisted: !user["is_whitelisted"], create: false, }).then(() => { updateUser(); }).catch(notifyErrorHandler("Error toggling user whitelisted status")); }} /> {user["is_banned"] ? "Yes" : "No"} {account.hasPermission("core.user.set_banned") && { if (!user["is_banned"]) { setBanUserPopover(!banUserPopover); } }} content={ } > }
; }