import { VSCodeButton, VSCodeTextField } from "@vscode/webview-ui-toolkit/react" import { useExtensionState } from "../context/ExtensionStateContext" import { vscode } from "../utils/vscode" import { Virtuoso } from "react-virtuoso" import { memo, useMemo, useState } from "react" type HistoryViewProps = { onDone: () => void } const HistoryView = ({ onDone }: HistoryViewProps) => { const { taskHistory } = useExtensionState() const [searchQuery, setSearchQuery] = useState("") const handleHistorySelect = (id: string) => { vscode.postMessage({ type: "showTaskWithId", text: id }) } const handleDeleteHistoryItem = (id: string) => { vscode.postMessage({ type: "deleteTaskWithId", text: id }) } const formatDate = (timestamp: number) => { const date = new Date(timestamp) return date ?.toLocaleString("en-US", { month: "long", day: "numeric", hour: "numeric", minute: "2-digit", hour12: true, }) .replace(", ", " ") .replace(" at", ",") .toUpperCase() } const presentableTasks = useMemo(() => { return taskHistory.filter((item) => item.ts && item.task) }, [taskHistory]) const taskHistorySearchResults = useMemo(() => { return presentableTasks.filter((item) => item.task.toLowerCase().includes(searchQuery.toLowerCase())) }, [presentableTasks, searchQuery]) const highlightText = (text: string, query: string) => { if (!query) return text const parts = text.split(new RegExp(`(${query})`, "gi")) return parts.map((part, index) => part.toLowerCase() === query.toLowerCase() ? ( {part} ) : ( part ) ) } return ( <>

History

Done
setSearchQuery((e.target as HTMLInputElement)?.value)}>
{searchQuery && ( setSearchQuery("")} slot="end"> )}
{presentableTasks.length === 0 && (
No history found,
start a new task to see it here...
)} (
handleHistorySelect(item.id)}>
{formatDate(item.ts)} { e.stopPropagation() handleDeleteHistoryItem(item.id) }} className="delete-button">
{highlightText(item.task, searchQuery)}
Tokens: {item.tokensIn?.toLocaleString()} {item.tokensOut?.toLocaleString()}
{!item.totalCost && }
{!!item.cacheWrites && (
Cache: +{item.cacheWrites?.toLocaleString()} {(item.cacheReads || 0).toLocaleString()}
)} {!!item.totalCost && (
API Cost: ${item.totalCost?.toFixed(4)}
)}
)} />
) } const ExportButton = ({ itemId }: { itemId: string }) => ( { e.stopPropagation() vscode.postMessage({ type: "exportTaskWithId", text: itemId }) }}>
EXPORT
) export default memo(HistoryView)