Fix message sidebar when webworker are not supported

This commit is contained in:
Eric NGUYEN 2022-09-21 16:12:51 +02:00
parent 1af5b45dbb
commit 0ca3b734d6

View file

@ -1,20 +1,23 @@
import { TrashIcon } from '@heroicons/react/outline'; import { TrashIcon } from '@heroicons/react/outline';
import * as React from 'react'; import * as React from 'react';
import { FixedSizeList as List } from 'react-window'; import { FixedSizeList as List } from 'react-window';
import { IGetFeedbackRequest } from '../../dts/dist/Interfaces/IGetFeedbackRequest';
import { MessageType } from '../../Enums/MessageType'; import { MessageType } from '../../Enums/MessageType';
import { IGetFeedbackResponse } from '../../Interfaces/IGetFeedbackResponse';
import { IHistoryState } from '../../Interfaces/IHistoryState'; import { IHistoryState } from '../../Interfaces/IHistoryState';
import { IMessage } from '../../Interfaces/IMessage'; import { IMessage } from '../../Interfaces/IMessage';
import { GetCircularReplacerKeepDataStructure } from '../../utils/saveload';
interface IMessagesSidebarProps { interface IMessagesSidebarProps {
historyState: IHistoryState historyState: IHistoryState
isOpen: boolean isOpen: boolean
} }
const myWorker = new Worker('workers/message_worker.js'); // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions
const myWorker = window.Worker && new Worker('workers/message_worker.js');
function UseWorker( function UseWorker(
state: IHistoryState, state: IHistoryState,
messages: IMessage[],
setMessages: React.Dispatch<React.SetStateAction<IMessage[]>> setMessages: React.Dispatch<React.SetStateAction<IMessage[]>>
): void { ): void {
React.useEffect(() => { React.useEffect(() => {
@ -32,17 +35,50 @@ function UseWorker(
myWorker.onmessage = (event) => { myWorker.onmessage = (event) => {
setMessages(event.data as IMessage[]); setMessages(event.data as IMessage[]);
}; };
}, [messages, setMessages]); }, [setMessages]);
}
function UseAsync(
state: IHistoryState,
setMessages: React.Dispatch<React.SetStateAction<IMessage[]>>
): void {
React.useEffect(() => {
const request: IGetFeedbackRequest = {
ApplicationState: state
};
const dataParsed = JSON.stringify(request, GetCircularReplacerKeepDataStructure());
fetch(import.meta.env.VITE_API_GET_FEEDBACK_URL, {
method: 'POST',
headers: new Headers({
// eslint-disable-next-line @typescript-eslint/naming-convention
'Content-Type': 'application/json'
}),
body: dataParsed
})
.then(async(response) =>
await response.json()
)
.then(async(json: IGetFeedbackResponse) => {
setMessages(json.messages);
});
}, [state]);
} }
export function MessagesSidebar(props: IMessagesSidebarProps): JSX.Element { export function MessagesSidebar(props: IMessagesSidebarProps): JSX.Element {
const [messages, setMessages] = React.useState<IMessage[]>([]); const [messages, setMessages] = React.useState<IMessage[]>([]);
UseWorker( // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions
props.historyState, if (window.Worker) {
messages, UseWorker(
setMessages props.historyState,
); setMessages
);
} else {
UseAsync(
props.historyState,
setMessages
);
}
function Row({ index, style }: {index: number, style: React.CSSProperties}): JSX.Element { function Row({ index, style }: {index: number, style: React.CSSProperties}): JSX.Element {
const reversedIndex = (messages.length - 1) - index; const reversedIndex = (messages.length - 1) - index;