From ea90de62407cab611be515c144b66ae6447b3ec9 Mon Sep 17 00:00:00 2001 From: Mikhail Chechnev Date: Mon, 25 Sep 2023 14:12:22 +0300 Subject: [PATCH] =?UTF-8?q?WEB=20APP:=20ApplicationContext=20=D0=BE=D1=82?= =?UTF-8?q?=D0=B2=D1=8F=D0=B7=D0=B0=D0=BD=20=D0=BE=D1=82=20=D0=B8=D1=81?= =?UTF-8?q?=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8?= =?UTF-8?q?=D1=8F=20=D0=B3=D0=BB=D0=BE=D0=B1=D0=B0=D0=BB=D1=8C=D0=BD=D1=8B?= =?UTF-8?q?=D1=85=20=D0=BE=D0=B1=D1=8A=D0=B5=D0=BA=D1=82=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app.text.js | 4 ++-- app/app.js | 4 ++-- app/context/application.js | 41 +++++++++++++++++++------------------- app/panels/dummy/dummy.js | 4 ++-- app/root.js | 5 +++-- 5 files changed, 30 insertions(+), 28 deletions(-) diff --git a/app.text.js b/app.text.js index dfad828..4d68479 100644 --- a/app.text.js +++ b/app.text.js @@ -45,13 +45,13 @@ export const INPUTS = { }; //Типовые сообщения об ошибках -export const ERROR = { +export const ERRORS = { UNDER_CONSTRUCTION: "Панель в разработке", P8O_API_UNAVAILABLE: '"ПАРУС 8 Онлайн" недоступен', DEFAULT: "Неожиданная ошибка" }; //Типовые сообщения для ошибок HTTP -export const ERROR_HTTP = { +export const ERRORS_HTTP = { 404: "Адрес не найден" }; diff --git a/app/app.js b/app/app.js index eb25e64..87ae173 100644 --- a/app/app.js +++ b/app/app.js @@ -15,7 +15,7 @@ import { NavigationContext, NavigationCtx, getRootLocation } from "./context/nav 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"; //Текстовые ресурсы и константы +import { TITLES, BUTTONS, ERRORS, ERRORS_HTTP } from "../app.text"; //Текстовые ресурсы и константы //-------------------------- //Вспомогательные компоненты @@ -35,7 +35,7 @@ const RouterError = ({ homePath }) => { //Генерация содержимого return ( diff --git a/app/context/application.js b/app/context/application.js index 0d45ecd..8f39821 100644 --- a/app/context/application.js +++ b/app/context/application.js @@ -9,11 +9,9 @@ import React, { useReducer, createContext, useEffect, useContext, useCallback } from "react"; //ReactJS import PropTypes from "prop-types"; //Контроль свойств компонента -import { getDisplaySize } from "../core/utils"; //Вспомогательные функции import { APP_AT, INITIAL_STATE, applicationReducer } from "./application_reducer"; //Редьюсер состояния import { MessagingСtx } from "./messaging"; //Контекст отображения сообщений import { BackEndСtx } from "./backend"; //Контекст взаимодействия с сервером -import { ERROR } from "../../app.text"; //Текстовые ресурсы и константы //--------- //Константы @@ -22,9 +20,10 @@ import { ERROR } from "../../app.text"; //Текстовые ресурсы и //Клиентский API "ПАРУС 8 Онлайн" const P8O_API = window.parent?.parus?.clientApi; -//-------------------------------- -//Вспомогательные классы и функции -//-------------------------------- +//Структура объекта с описанием ошибок +const APPLICATION_CONTEXT_ERRORS_SHAPE = PropTypes.shape({ + P8O_API_UNAVAILABLE: PropTypes.string.isRequired +}); //---------------- //Интерфейс модуля @@ -34,7 +33,7 @@ const P8O_API = window.parent?.parus?.clientApi; export const ApplicationСtx = createContext(); //Провайдер контекста приложения -export const ApplicationContext = ({ guidGenerator, children }) => { +export const ApplicationContext = ({ errors, displaySizeGetter, guidGenerator, children }) => { //Подключим редьюсер состояния const [state, dispatch] = useReducer(applicationReducer, INITIAL_STATE); @@ -63,18 +62,18 @@ export const ApplicationContext = ({ guidGenerator, children }) => { const _id = id || guidGenerator(); P8O_API.ui.openTab({ id: _id, url, caption, onClose: () => (onClose ? onClose(_id) : null) }); return _id; - } else showMsgErr(ERROR.P8O_API_UNAVAILABLE); + } else showMsgErr(errors.P8O_API_UNAVAILABLE); }, - [showMsgErr, guidGenerator] + [showMsgErr, guidGenerator, errors.P8O_API_UNAVAILABLE] ); //Отображение раздела "ПАРУС 8 Онлайн" const pOnlineShowUnit = useCallback( ({ unitCode, showMethod = "main", inputParameters }) => { if (P8O_API) P8O_API.fn.openDocumentModal({ unitcode: unitCode, method: showMethod, inputParameters }); - else showMsgErr(ERROR.P8O_API_UNAVAILABLE); + else showMsgErr(errors.P8O_API_UNAVAILABLE); }, - [showMsgErr] + [showMsgErr, errors.P8O_API_UNAVAILABLE] ); //Отображение документа "ПАРУС 8 Онлайн" @@ -82,9 +81,9 @@ export const ApplicationContext = ({ guidGenerator, children }) => { ({ unitCode, document, showMethod = "main", inRnParameter = "in_RN" }) => { if (P8O_API) P8O_API.fn.openDocumentModal({ unitcode: unitCode, method: showMethod, inputParameters: [{ name: inRnParameter, value: document }] }); - else showMsgErr(ERROR.P8O_API_UNAVAILABLE); + else showMsgErr(errors.P8O_API_UNAVAILABLE); }, - [showMsgErr] + [showMsgErr, errors.P8O_API_UNAVAILABLE] ); //Отображение словаря "ПАРУС 8 Онлайн" @@ -92,27 +91,27 @@ export const ApplicationContext = ({ guidGenerator, children }) => { ({ unitCode, showMethod = "main", inputParameters, callBack }) => { if (P8O_API) P8O_API.fn.openDictionary({ unitcode: unitCode, method: showMethod, inputParameters }, res => (callBack ? callBack(res) : null)); - else showMsgErr(ERROR.P8O_API_UNAVAILABLE); + else showMsgErr(errors.P8O_API_UNAVAILABLE); }, - [showMsgErr] + [showMsgErr, errors.P8O_API_UNAVAILABLE] ); //Исполнение пользовательской процедуры "ПАРУС 8 Онлайн" const pOnlineUserProcedure = useCallback( ({ code, inputParameters, callBack }) => { if (P8O_API) P8O_API.fn.performUserProcedureSync({ code, inputParameters }, res => (callBack ? callBack(res) : null)); - else showMsgErr(ERROR.P8O_API_UNAVAILABLE); + else showMsgErr(errors.P8O_API_UNAVAILABLE); }, - [showMsgErr] + [showMsgErr, errors.P8O_API_UNAVAILABLE] ); //Исполнение пользовательского отчёта "ПАРУС 8 Онлайн" const pOnlineUserReport = useCallback( ({ code, inputParameters }) => { if (P8O_API) P8O_API.fn.performUserReport({ code, inputParameters }); - else showMsgErr(ERROR.P8O_API_UNAVAILABLE); + else showMsgErr(errors.P8O_API_UNAVAILABLE); }, - [showMsgErr] + [showMsgErr, errors.P8O_API_UNAVAILABLE] ); //Инициализация приложения @@ -130,12 +129,12 @@ export const ApplicationContext = ({ guidGenerator, children }) => { if (!state.initialized) { //Слушаем изменение размеров окна window.addEventListener("resize", () => { - setDisplaySize(getDisplaySize()); + if (displaySizeGetter) setDisplaySize(displaySizeGetter()); }); //Инициализируем приложение initApp(); } - }, [state.initialized, initApp]); + }, [state.initialized, initApp, displaySizeGetter]); //Вернём компонент провайдера return ( @@ -158,6 +157,8 @@ export const ApplicationContext = ({ guidGenerator, children }) => { //Контроль свойств - Провайдер контекста приложения ApplicationContext.propTypes = { + errors: APPLICATION_CONTEXT_ERRORS_SHAPE.isRequired, + displaySizeGetter: PropTypes.func, guidGenerator: PropTypes.func.isRequired, children: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.node), PropTypes.node]) }; diff --git a/app/panels/dummy/dummy.js b/app/panels/dummy/dummy.js index 2d29dbc..39c4083 100644 --- a/app/panels/dummy/dummy.js +++ b/app/panels/dummy/dummy.js @@ -10,7 +10,7 @@ import React, { useContext } from "react"; //Классы React import { NavigationCtx } from "../../context/navigation"; //Контекст навигации import { P8PAppErrorPage } from "../../components/p8p_app_error_page"; //Страница с ошибкой -import { BUTTONS, ERROR } from "../../../app.text"; //Текстовые ресурсы и константы +import { BUTTONS, ERRORS } from "../../../app.text"; //Текстовые ресурсы и константы //----------- //Тело модуля @@ -22,7 +22,7 @@ const Dummy = () => { const { navigateBack } = useContext(NavigationCtx); //Генерация содержимого - return navigateBack()} navigateCaption={BUTTONS.NAVIGATE_BACK} />; + return navigateBack()} navigateCaption={BUTTONS.NAVIGATE_BACK} />; }; //---------------- diff --git a/app/root.js b/app/root.js index b0ef637..eaa22d3 100644 --- a/app/root.js +++ b/app/root.js @@ -12,7 +12,8 @@ import { MessagingContext } from "./context/messaging"; //Контекст со import { BackEndContext } from "./context/backend"; //Контекст взаимодействия с сервером import { ApplicationContext } from "./context/application"; //Контекст приложения import { App } from "./app"; //Приложение -import { genGUID } from "./core/utils"; //Вспомогательные функции +import { ERRORS } from "../app.text"; //Текстовые ресурсы и константы +import { getDisplaySize, genGUID } from "./core/utils"; //Вспомогательные функции import client from "./core/client"; //Клиент для взаимодействия с сервером //----------- @@ -24,7 +25,7 @@ const Root = () => { return ( - +