From 212a92f735d54f5f2980a477cdeed16e767ffc13 Mon Sep 17 00:00:00 2001 From: nick-delirium Date: Fri, 4 Apr 2025 10:31:03 +0200 Subject: [PATCH] ui: refine LAT design --- .../DevTools/LongTaskPanel/LongTaskPanel.tsx | 143 +++++++++++++----- .../shared/DevTools/LongTaskPanel/Script.tsx | 37 +++-- .../DevTools/LongTaskPanel/TaskTimeline.tsx | 30 ++-- 3 files changed, 146 insertions(+), 64 deletions(-) diff --git a/frontend/app/components/shared/DevTools/LongTaskPanel/LongTaskPanel.tsx b/frontend/app/components/shared/DevTools/LongTaskPanel/LongTaskPanel.tsx index 5c0a0dab6..c021afdef 100644 --- a/frontend/app/components/shared/DevTools/LongTaskPanel/LongTaskPanel.tsx +++ b/frontend/app/components/shared/DevTools/LongTaskPanel/LongTaskPanel.tsx @@ -9,19 +9,31 @@ import { useRegExListFilterMemo } from '../useListFilter'; import BottomBlock from '../BottomBlock'; import { NoContent, Icon } from 'UI'; import { InfoCircleOutlined } from '@ant-design/icons'; -import { mockData } from './__mock'; -import { Segmented } from 'antd'; +import { Segmented, Select, Tag } from 'antd'; import { LongAnimationTask } from './type'; -import Script from './Script' -import TaskTimeline from "./TaskTimeline"; +import Script from './Script'; +import TaskTimeline from './TaskTimeline'; +import { Hourglass } from 'lucide-react'; interface Row extends LongAnimationTask { time: number; } +const TABS = { + all: 'all', + blocking: 'blocking', +}; + +const SORT_BY = { + timeAsc: 'timeAsc', + blocking: 'blockingDesc', + duration: 'durationDesc', +}; + function LongTaskPanel() { const { t } = useTranslation(); - const [tab, setTab] = React.useState('all'); + const [tab, setTab] = React.useState(TABS.all); + const [sortBy, setSortBy] = React.useState(SORT_BY.timeAsc); const _list = React.useRef(null); const { player, store } = React.useContext(PlayerContext); const [searchValue, setSearchValue] = React.useState(''); @@ -29,7 +41,6 @@ function LongTaskPanel() { const { currentTab, tabStates } = store.get(); const longTasks = tabStates[currentTab]?.longTaskList || []; - console.log('list', longTasks) const filteredList = useRegExListFilterMemo( longTasks, (task: LongAnimationTask) => [ @@ -38,7 +49,7 @@ function LongTaskPanel() { task.scripts.map((script) => script.sourceURL).join(','), ], searchValue, - ) + ); const onFilterChange = (e: React.ChangeEvent) => { const value = e.target.value; @@ -50,17 +61,35 @@ function LongTaskPanel() { }; const rows: Row[] = React.useMemo(() => { - const rowMap = filteredList.map((task) => ({ + let rowMap = filteredList.map((task) => ({ ...task, time: task.time ?? task.startTime, - })) + })); if (tab === 'blocking') { - return rowMap.filter((task) => task.blockingDuration > 0); + rowMap = rowMap.filter((task) => task.blockingDuration > 0); + } + switch (sortBy) { + case SORT_BY.blocking: + rowMap = rowMap.sort((a, b) => b.blockingDuration - a.blockingDuration); + break; + case SORT_BY.duration: + rowMap = rowMap.sort((a, b) => b.duration - a.duration); + break; + default: + rowMap = rowMap.sort((a, b) => a.time - b.time); } return rowMap; - }, [filteredList.length, tab]); + }, [filteredList.length, tab, sortBy]); - const blockingTasks = rows.filter((task) => task.blockingDuration > 0); + const blockingTasks = React.useMemo(() => { + let blockingAmount = 0; + for (const task of longTasks) { + if (task.blockingDuration > 0) { + blockingAmount++; + } + } + return blockingAmount; + }, [longTasks.length]); return ( @@ -80,13 +109,26 @@ function LongTaskPanel() { { label: (
- {t('Blocking')} ({blockingTasks.length}) + {t('Blocking')} ({blockingTasks})
), value: 'blocking', }, ]} /> +