import React from 'react'; import { observer } from 'mobx-react-lite'; import { useTranslation } from 'react-i18next'; import { Input } from 'antd'; import { VList, VListHandle } from 'virtua'; import { PlayerContext } from 'App/components/Session/playerContext'; import JumpButton from '../JumpButton'; import { useRegExListFilterMemo } from '../useListFilter'; import BottomBlock from '../BottomBlock'; import { NoContent, Icon } from 'UI'; import { InfoCircleOutlined } from '@ant-design/icons'; import { Segmented, Select, Tag } from 'antd'; import { LongAnimationTask } from './type'; 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(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(''); const { currentTab, tabStates } = store.get(); const longTasks = tabStates[currentTab]?.longTaskList || []; const filteredList = useRegExListFilterMemo( longTasks, (task: LongAnimationTask) => [ task.name, task.scripts.map((script) => script.name).join(','), task.scripts.map((script) => script.sourceURL).join(','), ], searchValue, ); const onFilterChange = (e: React.ChangeEvent) => { const value = e.target.value; setSearchValue(value); }; const onRowClick = (time: number) => { player.jump(time); }; const rows: Row[] = React.useMemo(() => { let rowMap = filteredList.map((task) => ({ ...task, time: task.time ?? task.startTime, })); if (tab === 'blocking') { 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, sortBy]); const blockingTasks = React.useMemo(() => { let blockingAmount = 0; for (const task of longTasks) { if (task.blockingDuration > 0) { blockingAmount++; } } return blockingAmount; }, [longTasks.length]); return (
{t('Long Tasks')}
{t('Blocking')} ({blockingTasks})
), value: 'blocking', }, ]} />