11import { usePanelLayoutStore } from "@features/panels/store/panelLayoutStore" ;
22import { useRightSidebarStore } from "@features/right-sidebar" ;
3+ import { usePinnedTasksStore } from "@features/sidebar/stores/pinnedTasksStore" ;
34import { useSidebarStore } from "@features/sidebar/stores/sidebarStore" ;
5+ import { useTasks } from "@features/tasks/hooks/useTasks" ;
46import { useWorkspaceStore } from "@features/workspace/stores/workspaceStore" ;
57import { SHORTCUTS } from "@renderer/constants/keyboard-shortcuts" ;
68import { clearApplicationStorage } from "@renderer/lib/clearStorage" ;
79import { useRegisteredFoldersStore } from "@renderer/stores/registeredFoldersStore" ;
10+ import type { Task } from "@shared/types" ;
811import { useNavigationStore } from "@stores/navigationStore" ;
9- import { useCallback , useEffect } from "react" ;
12+ import { useCallback , useEffect , useMemo } from "react" ;
1013import { useHotkeys } from "react-hotkeys-hook" ;
1114import { trpcReact } from "@/renderer/trpc" ;
1215
@@ -25,6 +28,7 @@ export function GlobalEventHandlers({
2528 const navigateToTaskInput = useNavigationStore (
2629 ( state ) => state . navigateToTaskInput ,
2730 ) ;
31+ const navigateToTask = useNavigationStore ( ( state ) => state . navigateToTask ) ;
2832 const navigateToFolderSettings = useNavigationStore (
2933 ( state ) => state . navigateToFolderSettings ,
3034 ) ;
@@ -37,6 +41,40 @@ export function GlobalEventHandlers({
3741 const toggleLeftSidebar = useSidebarStore ( ( state ) => state . toggle ) ;
3842 const toggleRightSidebar = useRightSidebarStore ( ( state ) => state . toggle ) ;
3943
44+ const { data : allTasks = [ ] } = useTasks ( ) ;
45+ const pinnedTaskIds = usePinnedTasksStore ( ( state ) => state . pinnedTaskIds ) ;
46+
47+ // Build ordered task list for CMD+0-9 switching (pinned → active → recent)
48+ const orderedTasks = useMemo ( ( ) : Task [ ] => {
49+ if ( allTasks . length === 0 ) return [ ] ;
50+
51+ const sortedByActivity = [ ...allTasks ] . sort (
52+ ( a , b ) =>
53+ new Date ( b . updated_at ) . getTime ( ) - new Date ( a . updated_at ) . getTime ( ) ,
54+ ) ;
55+
56+ const pinned = sortedByActivity . filter ( ( t ) => pinnedTaskIds . has ( t . id ) ) ;
57+ const unpinned = sortedByActivity . filter ( ( t ) => ! pinnedTaskIds . has ( t . id ) ) ;
58+
59+ return [ ...pinned , ...unpinned ] ;
60+ } , [ allTasks , pinnedTaskIds ] ) ;
61+
62+ const handleSwitchTask = useCallback (
63+ ( index : number ) => {
64+ if ( index === 0 ) {
65+ // mod+0 goes to home/task input
66+ navigateToTaskInput ( ) ;
67+ } else {
68+ // mod+1-9 switches to task at that index (1-based)
69+ const task = orderedTasks [ index - 1 ] ;
70+ if ( task ) {
71+ navigateToTask ( task ) ;
72+ }
73+ }
74+ } ,
75+ [ orderedTasks , navigateToTask , navigateToTaskInput ] ,
76+ ) ;
77+
4078 const handleOpenSettings = useCallback ( ( ) => {
4179 toggleSettings ( ) ;
4280 } , [ toggleSettings ] ) ;
@@ -91,6 +129,21 @@ export function GlobalEventHandlers({
91129 useHotkeys ( SHORTCUTS . TOGGLE_RIGHT_SIDEBAR , toggleRightSidebar , globalOptions ) ;
92130 useHotkeys ( SHORTCUTS . SHORTCUTS_SHEET , onToggleShortcutsSheet , globalOptions ) ;
93131
132+ // Task switching with mod+0-9
133+ useHotkeys (
134+ SHORTCUTS . SWITCH_TASK ,
135+ ( event , handler ) => {
136+ if ( event . ctrlKey && ! event . metaKey ) return ;
137+
138+ const keyPressed = handler . keys ?. [ 0 ] ;
139+ if ( ! keyPressed ) return ;
140+ const index = parseInt ( keyPressed , 10 ) ;
141+ handleSwitchTask ( index ) ;
142+ } ,
143+ globalOptions ,
144+ [ handleSwitchTask ] ,
145+ ) ;
146+
94147 // Mouse back/forward buttons
95148 useEffect ( ( ) => {
96149 const handleMouseButton = ( event : MouseEvent ) => {
0 commit comments