From c4e7220a2317eb29949c35be70877dc1df0d46de Mon Sep 17 00:00:00 2001 From: LHagfoss Date: Sun, 15 Nov 2026 15:54:24 +0100 Subject: [PATCH] fix(desktop): lead the thread menu with what is used The thread menu listed about fifteen actions with debugging tools (Repair Thread, Copy Thread ID, Open Thread Log) beside Pin and Rename. It now leads with Pin, Rename, Mark Unread and Snooze, then the thread's state and changes, and keeps the occasional tools under More. Copy Link takes the menu's Title Case and Mark Unread no longer shares Settle's icon. --- apps/desktop/src/ui/Sidebar.tsx | 135 ++++++++++++++++++-------------- 1 file changed, 78 insertions(+), 57 deletions(-) diff --git a/apps/desktop/src/ui/Sidebar.tsx b/apps/desktop/src/ui/Sidebar.tsx index eb2b5b014..1ece71ae4 100644 --- a/apps/desktop/src/ui/Sidebar.tsx +++ b/apps/desktop/src/ui/Sidebar.tsx @@ -23,6 +23,7 @@ import { CircleAlert, CircleCheck, CircleDashed, + CircleDot, Clock, CloudUpload, Copy, @@ -313,35 +314,27 @@ function ThreadMenuItems({ onClear?.(); }} > - Mark {n} Unread + Mark {n} Unread ); } + // Most used first (pin, rename, unread, snooze), then the thread's state and what it changed, + // then the worktree's own actions; the occasional tools sit under More, and Trash last. return ( <> - {status !== "review" && ( - void setThreadStatus(session.id, "review")}> - Mark for Review - - )} - {status === "done" ? ( - void setThreadStatus(session.id, "idle")}> - Unsettle - - ) : ( - settleThread(session.id)}> - Settle - - )} - {status === "review" && ( - void setThreadStatus(session.id, "idle")}> - Clear Status + togglePin(session.id)}> + {pinned ? : } + {pinned ? "Unpin" : "Pin"} + + {!remote && ( + + Rename… )} - {statusMissing && ( -
Kept by the app: {statusMissing}
- )} + markUnread(session.id)}> + Mark Unread + {snoozed ? ( snoozeThread(session.id, null)}> Unsnooze @@ -375,49 +368,37 @@ function ThreadMenuItems({ )} - {!remote && ( - setView({ kind: "review", threadId: session.id })}> - Review Changes + + {status === "done" ? ( + void setThreadStatus(session.id, "idle")}> + Unsettle + + ) : ( + settleThread(session.id)}> + Settle )} - setAutoCompactForThread(session.id, autoCompactOff)}> - {autoCompactOff ? "Turn On Auto-compact" : "Turn Off Auto-compact"} - - markUnread(session.id)}> - Mark Unread - - - togglePin(session.id)}> - {pinned ? : } - {pinned ? "Unpin" : "Pin"} - - {!remote && ( - - Rename… + {status !== "review" && ( + void setThreadStatus(session.id, "review")}> + Mark for Review )} - void repairThread(session.id)}> - Repair Thread - - copyThreadLink(session.id)}> - Copy link - - copyText(session.id, "Thread ID copied")}> - Copy Thread ID - + {status === "review" && ( + void setThreadStatus(session.id, "idle")}> + Clear Status + + )} + {statusMissing && ( +
Kept by the app: {statusMissing}
+ )} {!remote && ( - - void openThreadLog(session.id).catch((e) => - toast(`Could not open the thread log: ${errorText(e)}`, "error"), - ) - } - > - Open Thread Log + setView({ kind: "review", threadId: session.id })}> + Review Changes )} + copyThreadLink(session.id)}> + Copy Link + {worktree && ( <> @@ -443,6 +424,46 @@ function ThreadMenuItems({ )} )} + + {/* What a thread needs now and then, not every day: kept one level down so the menu leads + with what is used. */} + + + More + + + + + setAutoCompactForThread(session.id, autoCompactOff)}> + {autoCompactOff ? "Turn On Auto-compact" : "Turn Off Auto-compact"} + + copyText(session.id, "Thread ID copied")}> + Copy Thread ID + + {!remote && ( + + void openThreadLog(session.id).catch((e) => + toast(`Could not open the thread log: ${errorText(e)}`, "error"), + ) + } + > + Open Thread Log + + )} + void repairThread(session.id)}> + Repair Thread + + + + {!remote && ( <>