/*
Парус 8 - Панели мониторинга
Приложение
*/
//---------------------
//Подключение библиотек
//---------------------
import React, { useState, useContext, useEffect } from "react"; //Классы React
import PropTypes from "prop-types"; //Контроль свойств компонента
import { createHashRouter, RouterProvider, useRouteError } from "react-router-dom"; //Роутер
import { ApplicationСtx } from "./context/application"; //Контекст приложения
import { NavigationContext, NavigationCtx, getRootLocation } from "./context/navigation"; //Контекст навигации
import { P8PAppErrorPage } from "./components/p8p_app_error_page"; //Страница с ошибкой
import { P8PAppWorkspace } from "./components/p8p_app_workspace"; //Рабочее пространство панели
import { P8PPanelsMenuGrid, PANEL_SHAPE } from "./components/p8p_panels_menu"; //Меню панелей
import { TITLES, BUTTONS, ERROR, ERROR_HTTP } from "../app.text"; //Текстовые ресурсы и константы
//--------------------------
//Вспомогательные компоненты
//--------------------------
//Обработка ошибок роутинга
const RouterError = ({ homePath }) => {
//Подключение к контексту навигации
const { navigateTo } = useContext(NavigationCtx);
//Извлечем ошибку роутинга
const routeError = useRouteError();
//Отработка нажатия на кнопку навигации
const handleNavigate = () => navigateTo({ path: `${homePath.startsWith("/") ? "" : "/"}${homePath}` });
//Генерация содержимого
return (
);
};
//Контроль свойств - обработка ошибок роутинга
RouterError.propTypes = {
homePath: PropTypes.string.isRequired
};
//Главное меню приложения
const MainMenu = ({ panels = [] } = {}) => {
//Подключение к контексту навигации
const { navigatePanel } = useContext(NavigationCtx);
//Отработка действия навигации элемента меню
const handleItemNavigate = panel => navigatePanel(panel);
//Генерация содержимого
return (
);
};
//Контроль свойств - главное меню приложения
MainMenu.propTypes = {
panels: PropTypes.arrayOf(PANEL_SHAPE).isRequired
};
//Рабочее пространство панели
const Workspace = ({ panels = [], selectedPanel, children } = {}) => {
//Подключение к контексту навигации
const { navigateRoot, navigatePanel } = useContext(NavigationCtx);
//Отработка действия навигации домой
const handleHomeNavigate = () => navigateRoot();
//Отработка действия навигации элемента меню
const handleItemNavigate = panel => navigatePanel(panel);
//Генерация содержимого
return (
{children}
);
};
//Контроль свойств - главное меню приложения
Workspace.propTypes = {
panels: PropTypes.arrayOf(PANEL_SHAPE).isRequired,
selectedPanel: PANEL_SHAPE,
children: PropTypes.element
};
//Обёртывание элемента в контекст навигации
const wrapNavigationContext = children => {children};
//-----------
//Тело модуля
//-----------
//Приложение
const App = () => {
//Собственное состояние
const [routes, setRoutes] = useState([]);
//Подключение к контексту приложения
const { appState } = useContext(ApplicationСtx);
//Инициализация роутера
const content = routes.length > 0 ? : null;
//При изменении состояния загрузки панелей
useEffect(() => {
if (appState.panelsLoaded) {
//Сборка "веток" для панелей
let routes = [
{
path: getRootLocation(),
element: wrapNavigationContext(),
errorElement: wrapNavigationContext()
}
];
for (const panel of appState.panels) {
// eslint-disable-next-line no-undef
const p = require(`./panels/${panel.path}`);
routes.push({
path: `${panel.url}/*`,
element: wrapNavigationContext(
),
errorElement: wrapNavigationContext()
});
}
setRoutes(routes);
}
}, [appState.panels, appState.panelsLoaded]);
//Генерация содержимого
return content;
};
//----------------
//Интерфейс модуля
//----------------
export { App };