2022-09-01 19:27:41 +02:00
|
|
|
import React, {useEffect} from "react";
|
2022-05-23 17:58:06 +02:00
|
|
|
import Sidebar from "../../components/navigation/Sidebar";
|
2022-04-06 16:37:23 +02:00
|
|
|
import {Outlet, useOutletContext, useParams} from "react-router-dom";
|
2022-05-23 17:58:06 +02:00
|
|
|
import ColorSelectorModal from "../../components/modal/ColorSelectorModal";
|
|
|
|
import {fetchPlayer} from "../../service/playerService";
|
2022-04-06 16:37:23 +02:00
|
|
|
import {faCampground, faCubes, faInfoCircle, faNetworkWired} from "@fortawesome/free-solid-svg-icons";
|
2022-05-23 17:58:06 +02:00
|
|
|
import Header from "../../components/navigation/Header";
|
|
|
|
import {useNavigation} from "../../hooks/navigationHook";
|
2022-04-06 16:37:23 +02:00
|
|
|
import {useTranslation} from "react-i18next";
|
|
|
|
import {faCalendarCheck} from "@fortawesome/free-regular-svg-icons";
|
2022-05-23 17:58:06 +02:00
|
|
|
import {useDataRequest} from "../../hooks/dataFetchHook";
|
2022-06-08 17:24:38 +02:00
|
|
|
import ErrorPage from "./ErrorPage";
|
2022-04-06 16:37:23 +02:00
|
|
|
|
|
|
|
|
|
|
|
const PlayerPage = () => {
|
|
|
|
const {t, i18n} = useTranslation();
|
|
|
|
|
2022-09-01 19:27:41 +02:00
|
|
|
const {sidebarItems, setSidebarItems} = useNavigation();
|
2022-04-06 16:37:23 +02:00
|
|
|
|
|
|
|
const {identifier} = useParams();
|
2022-09-04 08:40:17 +02:00
|
|
|
const {currentTab, finishUpdate} = useNavigation();
|
2022-04-06 16:37:23 +02:00
|
|
|
|
2022-09-04 08:40:17 +02:00
|
|
|
const {data: player, loadingError} = useDataRequest(fetchPlayer, [identifier])
|
2022-04-06 16:37:23 +02:00
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
if (!player) return;
|
|
|
|
|
|
|
|
const items = [
|
|
|
|
{name: 'html.label.playerOverview', icon: faInfoCircle, href: "overview"},
|
|
|
|
{name: 'html.label.sessions', icon: faCalendarCheck, href: "sessions"},
|
|
|
|
{name: 'html.label.pvpPve', icon: faCampground, href: "pvppve"},
|
|
|
|
{name: 'html.label.servers', icon: faNetworkWired, href: "servers"}
|
|
|
|
]
|
|
|
|
|
|
|
|
player.extensions.map(extension => {
|
|
|
|
return {
|
|
|
|
name: `${t('html.label.plugins')} (${extension.serverName})`,
|
|
|
|
icon: faCubes,
|
|
|
|
href: `plugins/${encodeURIComponent(extension.serverName)}`
|
|
|
|
}
|
|
|
|
}).forEach(item => items.push(item));
|
|
|
|
|
|
|
|
setSidebarItems(items);
|
|
|
|
window.document.title = `Plan | ${player.info.name}`;
|
|
|
|
|
|
|
|
finishUpdate(player.timestamp, player.timestamp_f);
|
2022-09-01 19:27:41 +02:00
|
|
|
}, [player, t, i18n, finishUpdate, setSidebarItems])
|
2022-04-06 16:37:23 +02:00
|
|
|
|
2022-06-08 17:24:38 +02:00
|
|
|
if (loadingError) return <ErrorPage error={loadingError}/>;
|
2022-04-06 16:37:23 +02:00
|
|
|
|
|
|
|
return player ? (
|
|
|
|
<>
|
2023-01-26 13:18:51 +01:00
|
|
|
<Sidebar page={player.info.name} items={sidebarItems}/>
|
2022-04-06 16:37:23 +02:00
|
|
|
<div className="d-flex flex-column" id="content-wrapper">
|
|
|
|
<Header page={player.info.name} tab={currentTab}/>
|
|
|
|
<div id="content" style={{display: 'flex'}}>
|
|
|
|
<main className="container-fluid mt-4">
|
|
|
|
<Outlet context={{player: player}}/>
|
|
|
|
</main>
|
|
|
|
<aside>
|
|
|
|
<ColorSelectorModal/>
|
|
|
|
</aside>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</>
|
|
|
|
) : <>
|
|
|
|
<div className="page-loader">
|
|
|
|
<div className="loader-container">
|
|
|
|
<span className="loader"/>
|
|
|
|
<p className="loader-text">Please wait..</p>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</>
|
|
|
|
}
|
|
|
|
|
|
|
|
export const usePlayer = () => {
|
|
|
|
return useOutletContext();
|
|
|
|
}
|
|
|
|
|
|
|
|
export default PlayerPage;
|