import { useMemo, useRef, useState } from "react" import { useVirtualizer } from "@tanstack/react-virtual" import { Lightning, MagnifyingGlass } from "@phosphor-icons/react" import type { ActivityRecord } from "@shared/types" import { useT } from "../../i18n" import { formatTime } from "../../lib/formatters" import { useRovingTabIndex } from "../../lib/keyboard" import { EmptyState, Select } from "../ui" import { ENTITY_ICONS, ENTITY_TYPE_OPTIONS } from "./execution-utils" export function ActivityList({ activity }: { activity: ActivityRecord[] }) { const t = useT() const [search, setSearch] = useState("") const [entityFilter, setEntityFilter] = useState("all") const parentRef = useRef(null) const filtered = useMemo(() => { let result = activity if (entityFilter !== "all") result = result.filter((e) => e.entityType === entityFilter) if (search.trim()) { const q = search.toLowerCase() result = result.filter((e) => e.action.toLowerCase().includes(q) || e.actor.toLowerCase().includes(q) || e.detail.toLowerCase().includes(q) || e.entityType.toLowerCase().includes(q), ) } return result }, [activity, entityFilter, search]) const { handleKeyDown, getTabIndex, focusedIndex } = useRovingTabIndex(filtered.length) const virtualizer = useVirtualizer({ count: filtered.length, getScrollElement: () => parentRef.current, estimateSize: () => 48, overscan: 15, }) if (activity.length === 0) return return (
setSearch(e.target.value)} placeholder={t("exec.searchActivity")} />