You've already forked factorio-server-manager
mirror of
https://github.com/OpenFactorioServerManager/factorio-server-manager.git
synced 2025-12-26 00:42:03 +02:00
106 lines
4.5 KiB
JavaScript
106 lines
4.5 KiB
JavaScript
import React, {useEffect, useState} from "react";
|
|
import {NavLink, Outlet} from "react-router-dom";
|
|
import Button from "./Button";
|
|
import {FontAwesomeIcon} from "@fortawesome/react-fontawesome";
|
|
import {faBars} from "@fortawesome/free-solid-svg-icons";
|
|
import {Flash} from "./Flash";
|
|
|
|
const Layout = ({handleLogout, serverStatus}) => {
|
|
|
|
const [isNavCollapsed, setIsNavCollapsed] = useState(true);
|
|
|
|
const Status = ({info}) => {
|
|
|
|
let text = 'Unknown';
|
|
let color = 'gray-light';
|
|
|
|
if (info && info.running) {
|
|
text = 'Running';
|
|
color = 'green';
|
|
} else if (info && !info.running) {
|
|
text = 'Stopped';
|
|
color = 'red';
|
|
}
|
|
|
|
return (
|
|
<div className={`bg-${color} accentuated rounded px-2 py-1 text-black`}>{text}</div>
|
|
)
|
|
}
|
|
|
|
const Link = ({children, to, last}) => {
|
|
return (
|
|
<NavLink
|
|
onClick={() => setIsNavCollapsed(true)}
|
|
end
|
|
to={to}
|
|
className={({isActive}) => {
|
|
return [
|
|
isActive ? "bg-orange" : "",
|
|
`hover:glow-orange accentuated bg-gray-light hover:bg-orange text-black font-bold py-2 px-4 w-full block${last ? '' : ' mb-1'}`,
|
|
].join(" ")
|
|
}}
|
|
>{children}</NavLink>)
|
|
}
|
|
|
|
return (
|
|
<>
|
|
{/*Sidebar*/}
|
|
<div className="w-full md:w-88 md:fixed md:top-0 md:left-0 bg-gray-dark md:h-screen overflow-y-auto">
|
|
<div className="py-4 px-2 accentuated">
|
|
<div className="mx-4 justify-between flex text-center">
|
|
<span className="text-dirty-white text-xl">Factorio Server Manager</span>
|
|
<button
|
|
className="md:hidden cursor-pointer text-white hover:text-dirty-white"
|
|
onClick={() => setIsNavCollapsed(!isNavCollapsed)}
|
|
>
|
|
<FontAwesomeIcon icon={faBars}/>
|
|
</button>
|
|
</div>
|
|
</div>
|
|
<div className={isNavCollapsed ? "hidden md:block" : "block"}>
|
|
<div className="py-4 px-2 accentuated">
|
|
<h1 className="text-dirty-white text-lg mb-2 mx-4">Server Status</h1>
|
|
<div className="mx-4 mb-4 text-center">
|
|
<Status info={serverStatus}/>
|
|
</div>
|
|
</div>
|
|
<div className="py-4 px-2 accentuated">
|
|
<h1 className="text-dirty-white text-lg mb-2 mx-4">Server Management</h1>
|
|
<div className="text-white text-center rounded-sm bg-black shadow-inner mx-4 p-1">
|
|
<Link to="/">Controls</Link>
|
|
<Link to="/saves">Saves</Link>
|
|
<Link to="/mods">Mods</Link>
|
|
<Link to="/server-settings">Server Settings</Link>
|
|
<Link to="/game-settings">Game Settings</Link>
|
|
<Link to="/console">Console</Link>
|
|
<Link to="/logs" last={true}>Logs</Link>
|
|
</div>
|
|
</div>
|
|
<div className="py-4 px-2 accentuated">
|
|
<h1 className="text-dirty-white text-lg mb-2 mx-4">FSM Administration</h1>
|
|
<div className="text-white text-center rounded-sm bg-black shadow-inner mx-4 p-1">
|
|
<Link to="/user-management">Users</Link>
|
|
<Link to="/help" last={true}>Help</Link>
|
|
</div>
|
|
</div>
|
|
<div className="py-4 px-2 accentuated">
|
|
<div className="text-white text-center rounded-sm bg-black shadow-inner mx-4 p-1">
|
|
<Button type="danger" className="w-full" onClick={handleLogout}>Logout</Button>
|
|
</div>
|
|
</div>
|
|
<div className="accentuated-t accentuated-x md:block hidden"/>
|
|
</div>
|
|
</div>
|
|
|
|
{/*Main*/}
|
|
<div className="md:ml-88 min-h-screen">
|
|
<div className="container md:mx-auto pt-16 md:px-6">
|
|
<Outlet />
|
|
<Flash/>
|
|
</div>
|
|
</div>
|
|
</>
|
|
);
|
|
}
|
|
|
|
export default Layout; |