import React from 'react'; import { observer } from 'mobx-react-lite'; import { useTranslation } from 'react-i18next'; import { Input, Tag, Select, Segmented } from 'antd'; import { LongAnimationTask } from './type'; 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, TagBadge } from 'UI'; import { Hourglass } from 'lucide-react'; import { InfoCircleOutlined } from '@ant-design/icons'; import { mockData } from './__mock'; import Script from './Script' import TaskTimeline from "./TaskTimeline"; interface Row extends LongAnimationTask { time: number; } function LongTaskPanel() { const { t } = useTranslation(); const [tab, setTab] = React.useState('all'); const [sortBy, setSortBy] = React.useState('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 || []; console.log('list', longTasks) 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(() => { // First map and filter by tab let rowMap = filteredList.map((task) => ({ ...task, time: task.time ?? task.startTime, })); if (tab === 'blocking') { rowMap = rowMap.filter((task) => task.blockingDuration > 0); } // Then sort based on selected sort option if (sortBy === 'blockingDesc') { return [...rowMap].sort((a, b) => (b.blockingDuration || 0) - (a.blockingDuration || 0)); } else if (sortBy === 'durationDesc') { return [...rowMap].sort((a, b) => b.duration - a.duration); } else if (sortBy === 'timeAsc') { return [...rowMap].sort((a, b) => a.time - b.time); } // Default sorting (by time) return rowMap; }, [filteredList.length, tab, sortBy]); const blockingTasks = filteredList.filter((task) => task.blockingDuration > 0); return (
{t('Long Tasks')}
{t('Blocking')} ({blockingTasks.length})
), value: 'blocking', }, ]} />