From 32f098a6fce74e6bee68332e24ef98a9e58fbdc2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Almeida?= <57680069+zeval@users.noreply.github.com> Date: Sat, 2 May 2026 23:01:21 +0100 Subject: [PATCH] feat: show question icon only for pending input (#782) * fix: show question icon only for pending input * fix: address pending input review feedback * fix: reduce pending input sidebar complexity * fix: address clarification review comments * test: cover pending clarification hook --- apps/web/components/kanban-card.tsx | 10 ++- .../components/kanban/graph2-step-node.tsx | 6 +- .../kanban/swimlane-graph-content.tsx | 7 +- .../mobile/session-task-switcher-sheet.tsx | 7 ++ apps/web/components/task/task-item.test.tsx | 48 ++++++++++++++ apps/web/components/task/task-item.tsx | 21 +++++- .../components/task/task-session-sidebar.tsx | 19 +++++- apps/web/components/task/task-switcher.tsx | 2 + apps/web/hooks/use-processed-messages.ts | 12 +--- .../use-task-pending-clarification.test.tsx | 64 +++++++++++++++++++ .../hooks/use-task-pending-clarification.ts | 8 +++ apps/web/lib/ui/state-icons.test.tsx | 23 +++++++ apps/web/lib/ui/state-icons.tsx | 31 ++++++++- .../lib/utils/pending-clarification.test.ts | 64 +++++++++++++++++++ apps/web/lib/utils/pending-clarification.ts | 27 ++++++++ 15 files changed, 327 insertions(+), 22 deletions(-) create mode 100644 apps/web/components/task/task-item.test.tsx create mode 100644 apps/web/hooks/use-task-pending-clarification.test.tsx create mode 100644 apps/web/hooks/use-task-pending-clarification.ts create mode 100644 apps/web/lib/ui/state-icons.test.tsx create mode 100644 apps/web/lib/utils/pending-clarification.test.ts create mode 100644 apps/web/lib/utils/pending-clarification.ts diff --git a/apps/web/components/kanban-card.tsx b/apps/web/components/kanban-card.tsx index 804d893c67..2f6dd0801c 100644 --- a/apps/web/components/kanban-card.tsx +++ b/apps/web/components/kanban-card.tsx @@ -28,12 +28,13 @@ import { } from "@kandev/ui/dropdown-menu"; import type { TaskState, Repository } from "@/lib/types/http"; import { cn, getRepositoryDisplayName } from "@/lib/utils"; -import { getTaskStateIcon } from "@/lib/ui/state-icons"; +import { getTaskStateIcon, shouldUseQuestionTaskIcon } from "@/lib/ui/state-icons"; import { needsAction } from "@/lib/utils/needs-action"; import { useAppStore } from "@/components/state-provider"; import { PRTaskIcon } from "@/components/github/pr-task-icon"; import { RemoteCloudTooltip } from "@/components/task/remote-cloud-tooltip"; import { TaskArchiveConfirmDialog } from "@/components/task/task-archive-confirm-dialog"; +import { useTaskPendingClarification } from "@/hooks/use-task-pending-clarification"; export interface Task { id: string; @@ -249,13 +250,16 @@ function KanbanCardActions({ >) { const [menuOpen, setMenuOpen] = useState(false); const effectiveMenuOpen = menuOpen || Boolean(isDeleting) || Boolean(isArchiving); - const statusIcon = getTaskStateIcon(task.state, "h-4 w-4"); + const hasPendingClarificationRequest = useTaskPendingClarification(task.primarySessionId); + const showQuestionIcon = shouldUseQuestionTaskIcon(task.state, hasPendingClarificationRequest); + const statusIcon = getTaskStateIcon(task.state, "h-4 w-4", hasPendingClarificationRequest); const hasKnownSession = Boolean(task.primarySessionId) || Boolean(task.sessionCount && task.sessionCount > 0); return (
- {(task.state === "IN_PROGRESS" || task.state === "SCHEDULING") && statusIcon} + {(task.state === "IN_PROGRESS" || task.state === "SCHEDULING" || showQuestionIcon) && + statusIcon} {showMaximizeButton && onOpenFullPage && hasKnownSession && ( diff --git a/apps/web/components/kanban/swimlane-graph-content.tsx b/apps/web/components/kanban/swimlane-graph-content.tsx index 6e7bde7bcf..adc217976b 100644 --- a/apps/web/components/kanban/swimlane-graph-content.tsx +++ b/apps/web/components/kanban/swimlane-graph-content.tsx @@ -23,6 +23,7 @@ import type { Task } from "@/components/kanban-card"; import type { WorkflowStep } from "@/components/kanban-column"; import type { MoveTaskError } from "@/hooks/use-drag-and-drop"; import type { KanbanState } from "@/lib/state/slices/kanban/types"; +import { useTaskPendingClarification } from "@/hooks/use-task-pending-clarification"; export type SwimlaneGraphContentProps = { workflowId: string; @@ -72,7 +73,8 @@ function DraggableTaskChip({ id: task.id, }); const isPreviewed = useAppStore((state) => state.kanbanPreviewedTaskId === task.id); - const statusIcon = getTaskStateIcon(task.state, "h-3 w-3"); + const hasPendingClarificationRequest = useTaskPendingClarification(task.primarySessionId); + const statusIcon = getTaskStateIcon(task.state, "h-3 w-3", hasPendingClarificationRequest); return (