From 44257db17ef51184294c52fd69e2d4e4092c96d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Max=20Paulus=20=F0=9F=A5=AA?= Date: Mon, 1 Jun 2026 10:53:37 -0700 Subject: [PATCH] fix history view bugs - deleting entries works - favoriting works --- .../src/components/history/HistoryView.tsx | 50 +++++++++++++------ 1 file changed, 34 insertions(+), 16 deletions(-) diff --git a/apps/vscode/webview-ui/src/components/history/HistoryView.tsx b/apps/vscode/webview-ui/src/components/history/HistoryView.tsx index a1aa5d4504..c0c3dba249 100644 --- a/apps/vscode/webview-ui/src/components/history/HistoryView.tsx +++ b/apps/vscode/webview-ui/src/components/history/HistoryView.tsx @@ -1,4 +1,4 @@ -import { BooleanRequest, EmptyRequest, StringArrayRequest } from "@shared/proto/cline/common" +import { EmptyRequest, StringArrayRequest } from "@shared/proto/cline/common" import { GetTaskHistoryRequest, TaskFavoriteRequest, type TaskItem } from "@shared/proto/cline/task" import { VSCodeTextField } from "@vscode/webview-ui-toolkit/react" import Fuse, { FuseResult } from "fuse.js" @@ -131,20 +131,26 @@ const HistoryView = ({ onDone }: HistoryViewProps) => { const toggleFavorite = useCallback( async (taskId: string, currentValue: boolean) => { + const nextValue = !currentValue + // Optimistic UI update - setPendingFavoriteToggles((prev) => ({ ...prev, [taskId]: !currentValue })) + setPendingFavoriteToggles((prev) => ({ ...prev, [taskId]: nextValue })) try { await TaskServiceClient.toggleTaskFavorite( TaskFavoriteRequest.create({ taskId, - isFavorited: !currentValue, + isFavorited: nextValue, }), ) + setTasks((currentTasks) => + currentTasks.map((task) => (task.id === taskId ? { ...task, isFavorited: nextValue } : task)), + ) + // Refresh if either filter is active to ensure proper combined filtering if (showFavoritesOnly || showCurrentWorkspaceOnly) { - loadTaskHistory(0) + await loadTaskHistory(0) } } catch (err) { console.error(`[FAVORITE_TOGGLE_UI] Error for task ${taskId}:`, err) @@ -226,24 +232,42 @@ const HistoryView = ({ onDone }: HistoryViewProps) => { const handleDeleteHistoryItem = useCallback( (id: string) => { TaskServiceClient.deleteTasksWithIds(StringArrayRequest.create({ value: [id] })) - .then(() => fetchTotalTasksSize()) + .then(async () => { + await loadTaskHistory(0) + await fetchTotalTasksSize() + }) .catch((error) => console.error("Error deleting task:", error)) }, - [fetchTotalTasksSize], + [fetchTotalTasksSize, loadTaskHistory], ) const handleDeleteSelectedHistoryItems = useCallback( (ids: string[]) => { if (ids.length > 0) { TaskServiceClient.deleteTasksWithIds(StringArrayRequest.create({ value: ids })) - .then(() => fetchTotalTasksSize()) + .then(async () => { + await loadTaskHistory(0) + setSelectedItems([]) + await fetchTotalTasksSize() + }) .catch((error) => console.error("Error deleting tasks:", error)) - setSelectedItems([]) } }, - [fetchTotalTasksSize], + [fetchTotalTasksSize, loadTaskHistory], ) + const handleDeleteAllHistory = useCallback(() => { + setDeleteAllDisabled(true) + TaskServiceClient.deleteAllTaskHistory(EmptyRequest.create({})) + .then(async () => { + await loadTaskHistory(0) + setSelectedItems([]) + await fetchTotalTasksSize() + }) + .catch((error) => console.error("Error deleting task history:", error)) + .finally(() => setDeleteAllDisabled(false)) + }, [fetchTotalTasksSize, loadTaskHistory]) + const fuse = useMemo(() => { return new Fuse(tasks, { keys: ["task"], @@ -512,13 +536,7 @@ const HistoryView = ({ onDone }: HistoryViewProps) => { aria-label="Delete all history" className="w-full" disabled={deleteAllDisabled || (taskHistory.length === 0 && tasks.length === 0)} - onClick={() => { - setDeleteAllDisabled(true) - TaskServiceClient.deleteAllTaskHistory(BooleanRequest.create({})) - .then(() => fetchTotalTasksSize()) - .catch((error) => console.error("Error deleting task history:", error)) - .finally(() => setDeleteAllDisabled(false)) - }} + onClick={handleDeleteAllHistory} variant="danger"> Delete All History{totalTasksSize !== null ? ` (${formatSize(totalTasksSize)})` : ""}