From dda632a5ddb79e0275e15e302245d3296081a570 Mon Sep 17 00:00:00 2001 From: Alex Kaminskii Date: Sat, 26 Nov 2022 12:31:42 +0100 Subject: [PATCH] refactor(frontend):useListFilter hooks for player panels (ConsolePanel) --- .../DevTools/ConsolePanel/ConsolePanel.tsx | 31 +++++++------------ .../shared/DevTools/useAutoscroll.ts | 1 - .../shared/DevTools/useListFilter.ts | 22 +++++++++++++ 3 files changed, 33 insertions(+), 21 deletions(-) create mode 100644 frontend/app/components/shared/DevTools/useListFilter.ts diff --git a/frontend/app/components/shared/DevTools/ConsolePanel/ConsolePanel.tsx b/frontend/app/components/shared/DevTools/ConsolePanel/ConsolePanel.tsx index 4fafc584b..039670377 100644 --- a/frontend/app/components/shared/DevTools/ConsolePanel/ConsolePanel.tsx +++ b/frontend/app/components/shared/DevTools/ConsolePanel/ConsolePanel.tsx @@ -1,4 +1,4 @@ -import React, { useEffect, useRef, useState } from 'react'; +import React, { useEffect, useRef, useState, useMemo } from 'react'; import { LogLevel, ILog } from 'Player'; import BottomBlock from '../BottomBlock'; import { Tabs, Input, Icon, NoContent } from 'UI'; @@ -13,6 +13,7 @@ import { useStore } from 'App/mstore'; import ErrorDetailsModal from 'App/components/Dashboard/components/Errors/ErrorDetailsModal'; import { useModal } from 'App/components/Modal'; import useAutoscroll from '../useAutoscroll'; +import { useRegExListFilterMemo, useTabListFilterMemo } from '../useListFilter' const ALL = 'ALL'; const INFO = 'INFO'; @@ -43,7 +44,6 @@ const getIconProps = (level: any) => { color: 'blue2', }; case LogLevel.WARN: - case LogLevel.WARNING: return { name: 'console/warning', color: 'red2', @@ -69,33 +69,23 @@ function ConsolePanel() { const activeTab = devTools[INDEX_KEY].activeTab; // Why do we need to keep index in the store? if we could get read of it it would simplify the code const activeIndex = devTools[INDEX_KEY].index; - const [isDetailsModalActive, setIsDetailsModalActive] = useState(false); - const [filteredList, setFilteredList] = useState([]); + const [ isDetailsModalActive, setIsDetailsModalActive ] = useState(false); const { showModal } = useModal(); - const [logs, setLogs] = useState([]) const { player, store } = React.useContext(PlayerContext) const jump = (t: number) => player.jump(t) const { logList, exceptionsList, logListNow, exceptionsListNow } = store.get() - useEffect(() => { - setLogs(logList.concat(exceptionsList).sort((a, b) => a.time - b.time)) - }, [logList.length, exceptionsList.length ]) - - useEffect(() => { - const filterRE = getRE(filter, 'i') - const list = logs.filter( - ({ value, level }: ILog) => - (!!filter ? filterRE.test(value) : true) && - (activeTab === ALL || activeTab === LEVEL_TAB[level]) - ) - setFilteredList(list) - }, [logs.length, filter, activeTab]) + const logs = useMemo(() => + logList.concat(exceptionsList).sort((a, b) => a.time - b.time), + [ logList.length, exceptionsList.length ], + ) as ILog[] + let filteredList = useRegExListFilterMemo(logs, l => l.value, filter) + filteredList = useTabListFilterMemo(filteredList, l => LEVEL_TAB[l.level], ALL, activeTab) const onTabClick = (activeTab: any) => devTools.update(INDEX_KEY, { activeTab }) const onFilterChange = ({ target: { value } }: any) => devTools.update(INDEX_KEY, { filter: value }) - // AutoScroll const autoScrollIndex = logListNow.length + exceptionsListNow.length const { @@ -113,11 +103,12 @@ function ConsolePanel() { timeoutStartAutoscroll() } + //Shouldn't it be declared outside the render function? const cache = new CellMeasurerCache({ fixedWidth: true, keyMapper: (index: number) => filteredList[index], }); - const _list = React.useRef(); + const _list = useRef(); useEffect(() => { if (_list.current) { // @ts-ignore diff --git a/frontend/app/components/shared/DevTools/useAutoscroll.ts b/frontend/app/components/shared/DevTools/useAutoscroll.ts index 1fcd13248..64883beec 100644 --- a/frontend/app/components/shared/DevTools/useAutoscroll.ts +++ b/frontend/app/components/shared/DevTools/useAutoscroll.ts @@ -39,5 +39,4 @@ export default function useAutoscroll( timeoutStartAutoscroll, stopAutoscroll, } - } \ No newline at end of file diff --git a/frontend/app/components/shared/DevTools/useListFilter.ts b/frontend/app/components/shared/DevTools/useListFilter.ts new file mode 100644 index 000000000..1f4c30f82 --- /dev/null +++ b/frontend/app/components/shared/DevTools/useListFilter.ts @@ -0,0 +1,22 @@ +import { useMemo } from 'react' +import { getRE } from 'App/utils' + +export function useRegExListFilterMemo(list: T[], filterBy: (item: T) => string, reText: string) { + return useMemo(() => { + if (!reText) { return list } + const re = getRE(reText, 'i') + list.filter(it => re.test(filterBy(it))) + }, [ list, list.length, reText ]) +} + +export function useTabListFilterMemo( + list: T[], + itemToTab: (item: T) => string, + commonTab: string, + currentTab: string, +) { + return useMemo(() => { + if (currentTab === commonTab) { return list } + return list.filter(it => itemToTab(it) === currentTab) + }, [ list, list.length, currentTab ]) +} \ No newline at end of file