@clusterio/web_ui
Version:
Clusterio web interface implementation
85 lines (77 loc) • 2.09 kB
text/typescript
import { useContext, useEffect, useState } from "react";
import { UserAccount } from "../BaseWebPlugin";
import * as lib from "@clusterio/lib";
import { notifyErrorHandler } from "../util/notify";
import ControlContext from "../components/ControlContext";
export function useAccount(): UserAccount {
let control = useContext(ControlContext);
let [name, setName] = useState<string>(control.accountName || "");
let [roles, setRoles] = useState<any[]>(control.accountRoles || []);
useEffect(() => {
function onAccountUpdate(account: lib.AccountDetails) {
setName(account.name);
setRoles(account.roles);
}
control.onAccountUpdate(onAccountUpdate);
return () => {
control.offAccountUpdate(onAccountUpdate);
};
}, [control]);
function checkPermissionExists(permission: string) {
if (!lib.permissions.has(permission)) {
throw new Error(`permission ${permission} does not exist`);
}
}
function hasPermission(permission: string): boolean {
for (let role of roles) {
if (role.permissions.includes("core.admin") || role.permissions.includes(permission)) {
return true;
}
}
return false;
}
return {
name,
roles,
hasPermission(permission: string): boolean | null {
if (!roles) {
return null;
}
checkPermissionExists(permission);
return hasPermission(permission);
},
hasAnyPermission(...permissions: string[]): boolean | null {
if (!roles) {
return null;
}
for (let permission of permissions) {
checkPermissionExists(permission);
}
for (let permission of permissions) {
if (hasPermission(permission)) {
return true;
}
}
return false;
},
hasAllPermission(...permissions: string[]): boolean | null {
if (!roles) {
return null;
}
for (let permission of permissions) {
checkPermissionExists(permission);
}
for (let permission of permissions) {
if (!hasPermission(permission)) {
return false;
}
}
return true;
},
logOut() {
control.loggingOut = true;
notifyErrorHandler("Error logging out");
control.shutdown();
},
};
}