forked from CITKParus/P8-Panels
69 lines
2.2 KiB
JavaScript
69 lines
2.2 KiB
JavaScript
/*
|
||
Парус 8 - Панели мониторинга
|
||
Контекст: Приложение - редьюсер состояния
|
||
*/
|
||
|
||
//---------------------
|
||
//Подключение библиотек
|
||
//---------------------
|
||
|
||
import { getDisplaySize } from "../core/utils"; //Вспомогательные функции
|
||
|
||
//---------
|
||
//Константы
|
||
//---------
|
||
|
||
//Типы действий
|
||
const APP_AT = {
|
||
LOAD_PANELS: "LOAD_PANELS", //Загрузка списка панелей
|
||
SET_INITIALIZED: "SET_INITIALIZED", //Установка флага инициализированности приложения
|
||
SET_DISPLAY_SIZE: "SET_DISPLAY_SIZE" //Установка текущего типового размера экрана
|
||
};
|
||
|
||
//Состояние приложения по умолчанию
|
||
const INITIAL_STATE = {
|
||
displaySize: getDisplaySize(),
|
||
panels: [],
|
||
panelsLoaded: false,
|
||
initialized: false
|
||
};
|
||
|
||
//-----------
|
||
//Тело модуля
|
||
//-----------
|
||
|
||
//Обработчики действий
|
||
const handlers = {
|
||
//Загрузка списка панелей
|
||
[APP_AT.LOAD_PANELS]: (state, { payload }) => {
|
||
let panels = [];
|
||
if (payload && Array.isArray(payload)) for (let p of payload) panels.push({ ...p });
|
||
return {
|
||
...state,
|
||
panels,
|
||
panelsLoaded: true
|
||
};
|
||
},
|
||
//Установка текущего типового размера экрана
|
||
[APP_AT.SET_INITIALIZED]: state => ({ ...state, initialized: true }),
|
||
//Установка текущего типового размера экрана
|
||
[APP_AT.SET_DISPLAY_SIZE]: (state, { payload }) => ({ ...state, displaySize: payload }),
|
||
//Обработчик по умолчанию
|
||
DEFAULT: state => state
|
||
};
|
||
|
||
//----------------
|
||
//Интерфейс модуля
|
||
//----------------
|
||
|
||
//Константы
|
||
export { APP_AT, INITIAL_STATE };
|
||
|
||
//Редьюсер состояния
|
||
export const applicationReducer = (state, action) => {
|
||
//Подберём обработчик
|
||
const handle = handlers[action.type] || handlers.DEFAULT;
|
||
//Исполним его
|
||
return handle(state, action);
|
||
};
|