import React, { createContext, useState, useContext } from "react"; import EntityHistory, { EntityHistoryProps } from "../components/entityHistory/EntityHistory"; import api from "../api"; import { PreloaderContext } from "./PreloaderContext"; //Тип с пропсами для взаимодействия с контекстом interface HistoryContextType { visible: boolean, //Пропс видимости компонента historyDataFields: HistoryDataFields, //Объект с названиями полей, по которым было совершено изменение. В БД они будут храниться, скорее всего, на латинице, на фронте их надо расшифровать hideHistory: () => void, //Колбек для сокрытия блока с историей content: Record | null, //Контент для отображения истории headerText: string, //Текст в заголовке окна с историей entityId: number, //Уникальный идентификатор сущности, по которой показываем историю (заявки, запрос и т.д.) showHistory: (entityId: number, content: EntityHistoryProps[], windowHeader?: string) => void, //Колбек для вызова окна с историей getHistoryFromMagic: (appname: string, subjectId: string | number, historyDataFields: HistoryDataFields, windowHeader?: string) => void //Метод получения истории из приложения Magic } type HistoryDataFields = Record; export const HistoryContext = createContext(null); export const HistoryProvider = ( {children} ) => { const [historyVisible, setHistoryVisible] = useState(false); const [historyContent, setHistoryContent] = useState( [] ); const [historyWindowHeader, setHistoryWindowHeader] = useState(''); const [historyEntityId, setHistoryEntityId] = useState(); const [historyDataFields, setHistoryDataFields] = useState( null ); /** * Сокрытие окна с историей */ function hideHistoryBlock() { setHistoryVisible(false); setHistoryWindowHeader(''); setHistoryContent( [] ); setHistoryEntityId(0); } const preloaderContext = useContext(PreloaderContext); //ГАВРИЛОВ. ПРАВИЛЬНО ЛИ В КОНТЕКСТЕ РЕАЛИЗОВЫВАТЬ ЛОГИКУ ФУНКЦИОНАЛА? ИЛИ ПРАВИЛЬНЕЕ ЕЕ РАЗМЕСТИТЬ В ФАЙЛЕ КОМПОНЕНТА? async function getHistoryFromMagic(appName: string, subjectId: number | string, historyDataFields: HistoryDataFields, windowHeader?: string){ preloaderContext.setPreloaderVisible(true) const appHistory = await api.get(`${appName}/history/${subjectId}`).then(history => history.data.data); // console.log(appHistory) if (appHistory) { appHistory.forEach( changeData => { changeData.changeDetails = JSON.parse(changeData.changeDetails) }); //appHistory.changeDetails = JSON.parse(appHistory.changeDetails) } //ГАВРИЛОВ //ПРОВЕРКА НА НАЛИЧИЕ НУЖНЫХ СВОЙСТВ. ЧТОБЫ ОБЪЕКТ СООТВЕТСТВОВАЛ ТИПУ //УБРАТЬ CHANGE. ПРОСТО AUTHOR,DETAILS и так далее // console.log(appHistory) showHistoryBlock(subjectId, appHistory, historyDataFields, windowHeader) // return appHistory; } /** * Показываем историю * @param entityId идентификатор бизнес-сущности * @param content контент для отображения * @param windowHeader заголовок для окна с историей */ //ГАВРИЛОВ. сделать пропс historyDataFields необязательным (пустой объект по умолчанию), так как details могут не передаваться, тогда и словарь не нужен (В ТОМ ЧИСЛЕ И В МЕТОДЕ getHistoryFromMagic). сделай интерфейс для аргументов идентичным function showHistoryBlock(subjectId: number | string, content: EntityHistoryProps[], historyDataFields: HistoryDataFields, windowHeader?: string){ preloaderContext.setPreloaderVisible(true) setHistoryVisible(true); setHistoryEntityId(subjectId); setHistoryContent(content); windowHeader ? setHistoryWindowHeader(windowHeader) : true; historyDataFields ? setHistoryDataFields(historyDataFields) : true; preloaderContext.setPreloaderVisible(false) } const value = { getHistoryFromMagic: getHistoryFromMagic, showHistory: showHistoryBlock, hideHistory: hideHistoryBlock, visible: historyVisible, content: historyContent, headerText: historyWindowHeader, entityId: historyEntityId, dataFields: historyDataFields }; return {children} }