import React, { useCallback, useEffect, useState } from "react"; import { Modal } from "./components/modal"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { faArrowRight } from "@fortawesome/free-solid-svg-icons"; import { getApp } from "../../olympusapp"; import { OlympusState, WarningSubstate } from "../../constants/constants"; import { FaPlus, FaTrash } from "react-icons/fa"; import { sha256 } from "js-sha256"; import { AdminPasswordChangedEvent } from "../../events"; import { OlDropdown } from "../components/oldropdown"; import { OlCheckbox } from "../components/olcheckbox"; export function AdminModal(props: { open: boolean }) { const [configs, setConfigs] = useState({} as { groups: { [key: string]: string[] }; users: { [key: string]: { password: string; roles: string[] } } }); const [newUserName, setNewUserName] = useState(""); const [newGroupName, setNewGroupName] = useState(""); const [adminPassword, setAdminPassword] = useState(""); useEffect(() => { AdminPasswordChangedEvent.on((password) => { setAdminPassword(password); var hash = sha256.create(); const requestOptions: RequestInit = { method: "GET", // Specify the request method headers: { Authorization: "Basic " + btoa(`Admin:${hash.update(password).hex()}`), }, // Specify the content type }; fetch(`./admin/config`, requestOptions) .then((response) => { if (response.status === 200) { console.log(`Admin password correct`); return response.json(); } else { throw new Error("Admin password incorrect"); } }) .then((data) => { setConfigs(data); }) .catch((error) => { console.error(`Error reading configuration: ${error}`); }); }); }, []); const uploadNewConfig = useCallback(() => { var hash = sha256.create(); const requestOptions: RequestInit = { method: "PUT", // Specify the request method headers: { Authorization: "Basic " + btoa(`Admin:${hash.update(adminPassword).hex()}`), "Content-Type": "application/json", }, // Specify the content type body: JSON.stringify(configs), }; fetch(`./admin/config`, requestOptions) .then((response) => { if (response.status === 200) { console.log(`Configuration uploaded`); } else { throw new Error("Error uploading configuration"); } }) .catch((error) => { getApp().setState(OlympusState.WARNING, WarningSubstate.ERROR_UPLOADING_CONFIG); console.error(`Error uploading configuration: ${error}`); }); }, [adminPassword, configs]); return (

User admin panel

Groups:
{configs.groups && Object.keys(configs.groups).map((group: any, idx: number) => { return (
{group}
{["Game master", "Blue commander", "Red commander"].map((role: any) => { return (
{ if (ev.target.checked) { configs["groups"][group].push(role); } else { configs["groups"][group] = configs["groups"][group].filter((r: any) => r !== role); } setConfigs({ ...configs }); }} > {role}
); })}
{ delete configs["groups"][group]; }} >
); })} {(configs.groups === undefined || Object.keys(configs.groups).length === 0) && (
No groups defined
)}
{ setNewGroupName(ev.currentTarget.value); }} className={` rounded-lg border border-gray-300 bg-gray-50 p-2.5 text-sm text-gray-900 dark:border-gray-600 dark:bg-gray-700 dark:text-white dark:placeholder-gray-400 dark:focus:border-blue-500 dark:focus:ring-blue-500 focus:border-blue-500 focus:ring-blue-500 `} placeholder="New group name" value={newGroupName} required />
{ if (newGroupName === "") return; configs["groups"][newGroupName] = []; setConfigs({ ...configs }); setNewGroupName(""); }} >
Users:
{configs.users && Object.keys(configs.users).map((user: any, idx: number) => { return (
{user}
{["Game master", "Blue commander", "Red commander"].map((role: any) => { return (
{ if (ev.target.checked) { configs["users"][user].roles.push(role); } else { configs["users"][user].roles = configs["users"][user].roles.filter((r: any) => r !== role); } setConfigs({ ...configs }); }} > {role}
); })}
{ var hash = sha256.create(); configs["users"][user].password = hash.update(ev.currentTarget.value).hex(); setConfigs({ ...configs }); }} className={` w-full rounded-lg border border-gray-300 bg-gray-50 p-2.5 text-sm text-gray-900 dark:border-gray-600 dark:bg-gray-700 dark:text-white dark:placeholder-gray-400 dark:focus:border-blue-500 dark:focus:ring-blue-500 focus:border-blue-500 focus:ring-blue-500 lg:max-w-92 `} placeholder="Change password" required />
{ delete configs["users"][user]; setConfigs({ ...configs }); }} >
); })} {(configs.users === undefined || Object.keys(configs.users).length === 0) && (
No users defined
)}
{ setNewUserName(ev.currentTarget.value); }} className={` rounded-lg border border-gray-300 bg-gray-50 p-2.5 text-sm text-gray-900 dark:border-gray-600 dark:bg-gray-700 dark:text-white dark:placeholder-gray-400 dark:focus:border-blue-500 dark:focus:ring-blue-500 focus:border-blue-500 focus:ring-blue-500 `} placeholder="New user name" value={newUserName} required />
{ if (newUserName === "") return; configs["users"][newUserName] = { password: "", roles: [] }; setConfigs({ ...configs }); setNewUserName(""); }} >
Reset all user preferences, use with caution
); }