Skip to content

Commit 12c9120

Browse files
authored
fix: Build ordered task list for CMD+0-9 switching, matching sidebar visual order (#719)
1 parent f792038 commit 12c9120

2 files changed

Lines changed: 46 additions & 10 deletions

File tree

apps/twig/src/renderer/components/GlobalEventHandlers.tsx

Lines changed: 45 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
import { usePanelLayoutStore } from "@features/panels/store/panelLayoutStore";
22
import { useRightSidebarStore } from "@features/right-sidebar";
3+
import { useSessions } from "@features/sessions/stores/sessionStore";
34
import { usePinnedTasksStore } from "@features/sidebar/stores/pinnedTasksStore";
45
import { useSidebarStore } from "@features/sidebar/stores/sidebarStore";
6+
import { useTaskViewedStore } from "@features/sidebar/stores/taskViewedStore";
57
import { useTasks } from "@features/tasks/hooks/useTasks";
68
import { useWorkspaceStore } from "@features/workspace/stores/workspaceStore";
79
import { SHORTCUTS } from "@renderer/constants/keyboard-shortcuts";
@@ -43,21 +45,55 @@ export function GlobalEventHandlers({
4345

4446
const { data: allTasks = [] } = useTasks();
4547
const pinnedTaskIds = usePinnedTasksStore((state) => state.pinnedTaskIds);
48+
const sessions = useSessions();
49+
const lastViewedAt = useTaskViewedStore((state) => state.lastViewedAt);
50+
const localActivityAt = useTaskViewedStore((state) => state.lastActivityAt);
4651

47-
// Build ordered task list for CMD+0-9 switching (pinned → active → recent)
52+
// Build ordered task list for CMD+0-9 switching, matching sidebar visual order:
53+
// pinned (by activity) → active (by activity) → recent (by creation)
4854
const orderedTasks = useMemo((): Task[] => {
4955
if (allTasks.length === 0) return [];
5056

51-
const sortedByActivity = [...allTasks].sort(
52-
(a, b) =>
53-
new Date(b.updated_at).getTime() - new Date(a.updated_at).getTime(),
54-
);
57+
const getLastActivityAt = (task: Task): number => {
58+
const apiUpdatedAt = new Date(task.updated_at).getTime();
59+
const localActivity = localActivityAt[task.id];
60+
return localActivity
61+
? Math.max(apiUpdatedAt, localActivity)
62+
: apiUpdatedAt;
63+
};
64+
65+
const isTaskUnread = (task: Task): boolean => {
66+
const taskLastViewedAt = lastViewedAt[task.id];
67+
return (
68+
taskLastViewedAt !== undefined &&
69+
getLastActivityAt(task) > taskLastViewedAt
70+
);
71+
};
72+
73+
const taskNeedsPermission = (task: Task): boolean => {
74+
const session = Object.values(sessions).find((s) => s.taskId === task.id);
75+
return (session?.pendingPermissions?.size ?? 0) > 0;
76+
};
77+
78+
const pinned = allTasks
79+
.filter((t) => pinnedTaskIds.has(t.id))
80+
.sort((a, b) => getLastActivityAt(b) - getLastActivityAt(a));
81+
82+
const unpinned = allTasks.filter((t) => !pinnedTaskIds.has(t.id));
83+
84+
const active = unpinned
85+
.filter((t) => isTaskUnread(t) || taskNeedsPermission(t))
86+
.sort((a, b) => getLastActivityAt(b) - getLastActivityAt(a));
5587

56-
const pinned = sortedByActivity.filter((t) => pinnedTaskIds.has(t.id));
57-
const unpinned = sortedByActivity.filter((t) => !pinnedTaskIds.has(t.id));
88+
const recent = unpinned
89+
.filter((t) => !isTaskUnread(t) && !taskNeedsPermission(t))
90+
.sort(
91+
(a, b) =>
92+
new Date(b.created_at).getTime() - new Date(a.created_at).getTime(),
93+
);
5894

59-
return [...pinned, ...unpinned];
60-
}, [allTasks, pinnedTaskIds]);
95+
return [...pinned, ...active, ...recent];
96+
}, [allTasks, pinnedTaskIds, sessions, lastViewedAt, localActivityAt]);
6197

6298
const handleSwitchTask = useCallback(
6399
(index: number) => {

apps/twig/src/renderer/components/action-selector/ActionSelector.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,7 @@ export function ActionSelector({
173173
h.handleCancel();
174174
break;
175175
default:
176-
if (/^[1-9]$/.test(e.key)) {
176+
if (/^[1-9]$/.test(e.key) && !e.metaKey && !e.ctrlKey) {
177177
e.preventDefault();
178178
e.stopPropagation();
179179
h.selectByIndex(Number.parseInt(e.key, 10) - 1);

0 commit comments

Comments
 (0)