151 lines
6.2 KiB
JavaScript
151 lines
6.2 KiB
JavaScript
/*
|
||
Парус 8 - Панели мониторинга
|
||
Контекст: Сообщения
|
||
*/
|
||
|
||
//---------------------
|
||
//Подключение библиотек
|
||
//---------------------
|
||
|
||
import React, { useReducer, createContext, useCallback } from "react"; //ReactJS
|
||
import PropTypes from "prop-types"; //Контроль свойств компонента
|
||
import { P8PAppProgress } from "../components/p8p_app_progress"; //Индикатор процесса
|
||
import { P8PAppMessage, P8PAppInlineMessage, P8PAppInlineError, P8PAppInlineWarn, P8PAppInlineInfo } from "../components/p8p_app_message"; //Диалог сообщения
|
||
import { MSG_AT, MSG_TYPE, INITIAL_STATE, messagingReducer } from "./messaging_reducer"; //Редьюсер состояния
|
||
|
||
//---------
|
||
//Константы
|
||
//---------
|
||
|
||
//Структура объекта с описанием типовых заголовков
|
||
const MESSAGING_CONTEXT_TITLES_SHAPE = PropTypes.shape({
|
||
ERR: PropTypes.string.isRequired,
|
||
WARN: PropTypes.string.isRequired,
|
||
INFO: PropTypes.string.isRequired
|
||
});
|
||
|
||
//Структура объекта с описанием типовых текстов
|
||
const MESSAGING_CONTEXT_TEXTS_SHAPE = PropTypes.shape({
|
||
LOADING: PropTypes.string.isRequired
|
||
});
|
||
|
||
//Структура объекта с описанием типовых кнопок
|
||
const MESSAGING_CONTEXT_BUTTONS_SHAPE = PropTypes.shape({
|
||
CLOSE: PropTypes.string.isRequired,
|
||
OK: PropTypes.string.isRequired,
|
||
CANCEL: PropTypes.string.isRequired
|
||
});
|
||
|
||
//----------------
|
||
//Интерфейс модуля
|
||
//----------------
|
||
|
||
//Контекст сообщений
|
||
export const MessagingСtx = createContext();
|
||
|
||
//Провайдер контекста сообщений
|
||
export const MessagingContext = ({ titles, texts, buttons, children }) => {
|
||
//Подключим редьюсер состояния
|
||
const [state, dispatch] = useReducer(messagingReducer, INITIAL_STATE);
|
||
|
||
//Отображение загрузчика
|
||
const showLoader = useCallback(message => dispatch({ type: MSG_AT.SHOW_LOADER, payload: message }), []);
|
||
|
||
//Сокрытие загрузчика
|
||
const hideLoader = useCallback(() => dispatch({ type: MSG_AT.HIDE_LOADER }), []);
|
||
|
||
//Отображение сообщения
|
||
const showMsg = useCallback(
|
||
(type, text, msgOnOk = null, msgOnCancel = null) => dispatch({ type: MSG_AT.SHOW_MSG, payload: { type, text, msgOnOk, msgOnCancel } }),
|
||
[]
|
||
);
|
||
|
||
//Отображение сообщения - ошибка
|
||
const showMsgErr = useCallback((text, msgOnOk = null) => showMsg(MSG_TYPE.ERR, text, msgOnOk), [showMsg]);
|
||
|
||
//Отображение сообщения - информация
|
||
const showMsgInfo = useCallback((text, msgOnOk = null) => showMsg(MSG_TYPE.INFO, text, msgOnOk), [showMsg]);
|
||
|
||
//Отображение сообщения - предупреждение
|
||
const showMsgWarn = useCallback((text, msgOnOk = null, msgOnCancel = null) => showMsg(MSG_TYPE.WARN, text, msgOnOk, msgOnCancel), [showMsg]);
|
||
|
||
//Сокрытие сообщения
|
||
const hideMsg = useCallback(
|
||
(cancel = false) => {
|
||
dispatch({ type: MSG_AT.HIDE_MSG });
|
||
if (!cancel && state.msgOnOk) state.msgOnOk();
|
||
if (cancel && state.msgOnCancel) state.msgOnCancel();
|
||
},
|
||
[state]
|
||
);
|
||
|
||
//Отработка нажатия на "ОК" в сообщении
|
||
const handleMessageOkClick = () => {
|
||
hideMsg(false);
|
||
};
|
||
|
||
//Отработка нажатия на "Отмена" в сообщении
|
||
const handleMessageCancelClick = () => {
|
||
hideMsg(true);
|
||
};
|
||
|
||
//Встраиваемое сообщение
|
||
const InlineMsg = useCallback(props => P8PAppInlineMessage({ okBtn: true, okBtnCaption: buttons.OK, ...props }), [buttons.OK]);
|
||
|
||
//Встраиваемое сообщение об ошибке
|
||
const InlineMsgErr = useCallback(props => P8PAppInlineError({ okBtn: true, okBtnCaption: buttons.OK, ...props }), [buttons.OK]);
|
||
|
||
//Встраиваемое сообщение с информацией
|
||
const InlineMsgInfo = useCallback(props => P8PAppInlineInfo({ okBtn: true, okBtnCaption: buttons.OK, ...props }), [buttons.OK]);
|
||
|
||
//Встраиваемое сообщение с предупреждением
|
||
const InlineMsgWarn = useCallback(props => P8PAppInlineWarn({ okBtn: true, okBtnCaption: buttons.OK, ...props }), [buttons.OK]);
|
||
|
||
//Вернём компонент провайдера
|
||
return (
|
||
<MessagingСtx.Provider
|
||
value={{
|
||
MSG_TYPE,
|
||
showLoader,
|
||
hideLoader,
|
||
showMsg,
|
||
showMsgErr,
|
||
showMsgInfo,
|
||
showMsgWarn,
|
||
hideMsg,
|
||
InlineMsg,
|
||
InlineMsgErr,
|
||
InlineMsgInfo,
|
||
InlineMsgWarn,
|
||
msgState: state
|
||
}}
|
||
>
|
||
{state.loading ? <P8PAppProgress open={true} text={state.loadingMessage || texts.LOADING} /> : null}
|
||
{state.msg ? (
|
||
<P8PAppMessage
|
||
open={true}
|
||
variant={state.msgType}
|
||
text={state.msgText}
|
||
title
|
||
titleText={state.msgType == MSG_TYPE.ERR ? titles.ERR : state.msgType == MSG_TYPE.WARN ? titles.WARN : titles.INFO}
|
||
okBtn={true}
|
||
onOk={handleMessageOkClick}
|
||
okBtnCaption={[MSG_TYPE.ERR, MSG_TYPE.INFO].includes(state.msgType) ? buttons.CLOSE : buttons.OK}
|
||
cancelBtn={state.msgType == MSG_TYPE.WARN}
|
||
onCancel={handleMessageCancelClick}
|
||
cancelBtnCaption={buttons.CANCEL}
|
||
/>
|
||
) : null}
|
||
{children}
|
||
</MessagingСtx.Provider>
|
||
);
|
||
};
|
||
|
||
//Контроль свойств - Провайдер контекста сообщений
|
||
MessagingContext.propTypes = {
|
||
titles: MESSAGING_CONTEXT_TITLES_SHAPE,
|
||
texts: MESSAGING_CONTEXT_TEXTS_SHAPE,
|
||
buttons: MESSAGING_CONTEXT_BUTTONS_SHAPE,
|
||
children: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.node), PropTypes.node])
|
||
};
|