From 2e003ad8cf42485e43a9a2c05ca2520433c266f1 Mon Sep 17 00:00:00 2001 From: Miguel Solorio Date: Wed, 29 Oct 2025 14:19:44 -0700 Subject: [PATCH] refactor(todo): improve performance and readability of todo component (#12238) --- .../cli/src/ui/components/messages/Todo.tsx | 33 ++++++++++++------- .../messages/__snapshots__/Todo.test.tsx.snap | 18 +++++----- 2 files changed, 31 insertions(+), 20 deletions(-) diff --git a/packages/cli/src/ui/components/messages/Todo.tsx b/packages/cli/src/ui/components/messages/Todo.tsx index c558e0a43a..17bed4d57d 100644 --- a/packages/cli/src/ui/components/messages/Todo.tsx +++ b/packages/cli/src/ui/components/messages/Todo.tsx @@ -28,7 +28,7 @@ const TodoTitleDisplay: React.FC<{ todos: TodoList }> = ({ todos }) => { } } } - return `${completed}/${total}`; + return `${completed}/${total} completed`; }, [todos]); return ( @@ -57,7 +57,7 @@ const TodoStatusDisplay: React.FC<{ status: TodoStatus }> = ({ status }) => { ); case 'pending': return ( - + ); @@ -71,20 +71,31 @@ const TodoStatusDisplay: React.FC<{ status: TodoStatus }> = ({ status }) => { } }; +const statusTextColor: Partial> = { + in_progress: theme.text.accent, + completed: theme.text.secondary, + cancelled: theme.text.secondary, +}; + const TodoItemDisplay: React.FC<{ todo: Todo; wrap?: 'truncate'; role?: 'listitem'; -}> = ({ todo, wrap, role: ariaRole }) => ( - - - - - {todo.description} - +}> = ({ todo, wrap, role: ariaRole }) => { + const textColor = statusTextColor[todo.status] ?? theme.text.primary; + const strikethrough = todo.status === 'cancelled'; + + return ( + + + + + {todo.description} + + - -); + ); +}; export const TodoTray: React.FC = () => { const uiState = useUIState(); diff --git a/packages/cli/src/ui/components/messages/__snapshots__/Todo.test.tsx.snap b/packages/cli/src/ui/components/messages/__snapshots__/Todo.test.tsx.snap index 47c202b81b..04e9663011 100644 --- a/packages/cli/src/ui/components/messages/__snapshots__/Todo.test.tsx.snap +++ b/packages/cli/src/ui/components/messages/__snapshots__/Todo.test.tsx.snap @@ -2,7 +2,7 @@ exports[` (showFullTodos: false) > renders a todo list with long descriptions that wrap when full view is on 1`] = ` "────────────────────────────────────────────────── - Todo 1/2 (ctrl+t to toggle) » This is a very l…" + Todo 1/2 completed (ctrl+t to toggle) » This i…" `; exports[` (showFullTodos: false) > renders full list when all todos are inactive 1`] = `""`; @@ -13,22 +13,22 @@ exports[` (showFullTodos: false) > renders null when todo list is em exports[` (showFullTodos: false) > renders the most recent todo list when multiple write_todos calls are in history 1`] = ` "──────────────────────────────────────────────────────────────────────────────────────────────────── - Todo 0/2 (ctrl+t to toggle) » Newer Task 2" + Todo 0/2 completed (ctrl+t to toggle) » Newer Task 2" `; exports[` (showFullTodos: false) > renders when todos exist and one is in progress 1`] = ` "──────────────────────────────────────────────────────────────────────────────────────────────────── - Todo 1/3 (ctrl+t to toggle) » Task 2" + Todo 1/3 completed (ctrl+t to toggle) » Task 2" `; exports[` (showFullTodos: false) > renders when todos exist but none are in progress 1`] = ` "──────────────────────────────────────────────────────────────────────────────────────────────────── - Todo 1/2 (ctrl+t to toggle)" + Todo 1/2 completed (ctrl+t to toggle)" `; exports[` (showFullTodos: true) > renders a todo list with long descriptions that wrap when full view is on 1`] = ` "────────────────────────────────────────────────── - Todo 1/2 (ctrl+t to toggle) + Todo 1/2 completed (ctrl+t to toggle) » This is a very long description for a pending task that should wrap around multiple lines @@ -39,7 +39,7 @@ exports[` (showFullTodos: true) > renders a todo list with long desc exports[` (showFullTodos: true) > renders full list when all todos are inactive 1`] = ` "──────────────────────────────────────────────────────────────────────────────────────────────────── - Todo 1/1 (ctrl+t to toggle) + Todo 1/1 completed (ctrl+t to toggle) ✓ Task 1 ✗ Task 2" @@ -51,7 +51,7 @@ exports[` (showFullTodos: true) > renders null when todo list is emp exports[` (showFullTodos: true) > renders the most recent todo list when multiple write_todos calls are in history 1`] = ` "──────────────────────────────────────────────────────────────────────────────────────────────────── - Todo 0/2 (ctrl+t to toggle) + Todo 0/2 completed (ctrl+t to toggle) ☐ Newer Task 1 » Newer Task 2" @@ -59,7 +59,7 @@ exports[` (showFullTodos: true) > renders the most recent todo list exports[` (showFullTodos: true) > renders when todos exist and one is in progress 1`] = ` "──────────────────────────────────────────────────────────────────────────────────────────────────── - Todo 1/3 (ctrl+t to toggle) + Todo 1/3 completed (ctrl+t to toggle) ☐ Pending Task » Task 2 @@ -69,7 +69,7 @@ exports[` (showFullTodos: true) > renders when todos exist and one i exports[` (showFullTodos: true) > renders when todos exist but none are in progress 1`] = ` "──────────────────────────────────────────────────────────────────────────────────────────────────── - Todo 1/2 (ctrl+t to toggle) + Todo 1/2 completed (ctrl+t to toggle) ☐ Pending Task ✗ In Progress Task