добавляю все изменения проекта на текущий момент
This commit is contained in:
@@ -0,0 +1,97 @@
|
||||
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<string, string> | 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<string, string>;
|
||||
|
||||
export const HistoryContext = createContext<HistoryContextType | null>(null);
|
||||
|
||||
export const HistoryProvider = ( {children} ) => {
|
||||
const [historyVisible, setHistoryVisible] = useState<boolean>(false);
|
||||
const [historyContent, setHistoryContent] = useState<EntityHistoryProps[] | []>( [] );
|
||||
const [historyWindowHeader, setHistoryWindowHeader] = useState<string>('');
|
||||
const [historyEntityId, setHistoryEntityId] = useState<number>();
|
||||
const [historyDataFields, setHistoryDataFields] = useState<HistoryDataFields | null>( 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 <HistoryContext.Provider value={value}>
|
||||
{children}
|
||||
<EntityHistory/>
|
||||
</HistoryContext.Provider>
|
||||
}
|
||||
@@ -0,0 +1,41 @@
|
||||
import React, { createContext, useState } from "react";
|
||||
import { MagicPopupType } from "../components/MagicPopupContainer";
|
||||
import MagicPopupContainer from "../components/MagicPopupContainer";
|
||||
|
||||
//гаврилов. передай значением по умолчанию null и спроси у ChatGPT (deepseek не справляется) почему при указании null возникает ошибка в аргументе value
|
||||
export const PopupContext = createContext('');
|
||||
|
||||
/**
|
||||
* Контекст для компонента всплывающих окон
|
||||
*/
|
||||
export const PopupProvider = ({ children }) => {
|
||||
const [popupArrTestVar, setPopupArrTestVar] = useState<MagicPopupType[] | []>( [] );
|
||||
|
||||
function addPopupTest (newPopupArrData: MagicPopupType[]) {
|
||||
setPopupArrTestVar(prev => {
|
||||
//Конкатенируем предыдущее состояние набора попапов и новые попапы, присваивая новому попапу параметр id с уникальным рандомным значением
|
||||
return [...prev, ...newPopupArrData].map(popup => popup.id ? popup : {...popup, id: getRandomId()})
|
||||
});
|
||||
};
|
||||
|
||||
//Колбэк для удаления попапа из набора
|
||||
function delPopupTest (popupDelKey: number) {
|
||||
setPopupArrTestVar(prev => {
|
||||
return prev.filter(popup => popup.id !== popupDelKey);
|
||||
});
|
||||
};
|
||||
|
||||
function getRandomId(): number { return Date.now() - Math.random() };
|
||||
|
||||
const value = {
|
||||
popupArrTest: popupArrTestVar,
|
||||
//ГАВРИЛОВ. переименуй
|
||||
addPopupArrTest: addPopupTest,
|
||||
delPopupArrTest: delPopupTest,
|
||||
};
|
||||
|
||||
return <PopupContext.Provider value={value}>
|
||||
{children}
|
||||
<MagicPopupContainer />
|
||||
</PopupContext.Provider>
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
import React, { createContext, useState } from "react";
|
||||
import Preloader from "../components/preloader/Preloader";
|
||||
|
||||
interface PreloaderProps{
|
||||
setPreloaderVisible: (preloaderVisible: boolean) => void;
|
||||
setPreloaderText: (preloaderText: string) => void;
|
||||
}
|
||||
|
||||
export const PreloaderContext = createContext<PreloaderProps>({
|
||||
setPreloaderVisible: () => {},
|
||||
setPreloaderText: () => {},
|
||||
});
|
||||
|
||||
export function PreloaderProvider({ children }){
|
||||
const [visible, setVisible] = useState<boolean>(true);
|
||||
const [text, setText] = useState<string>('Страница загружается');
|
||||
|
||||
function setPreloaderVisible(preloaderVisible: boolean){
|
||||
setVisible(preloaderVisible);
|
||||
}
|
||||
|
||||
function setPreloaderText(preloaderText: string){
|
||||
setText(preloaderText);
|
||||
}
|
||||
|
||||
let value = {
|
||||
setPreloaderVisible: setPreloaderVisible,
|
||||
setPreloaderText: setPreloaderText
|
||||
}
|
||||
|
||||
return (
|
||||
<PreloaderContext.Provider value={value}>
|
||||
<Preloader
|
||||
visible={visible}
|
||||
text={text}
|
||||
/>
|
||||
{children}
|
||||
</PreloaderContext.Provider>
|
||||
)
|
||||
}
|
||||
Reference in New Issue
Block a user