11import { MainSidebar } from "@components/MainSidebar" ;
2+ import { TopBar } from "@components/ui/topnav/TopBar" ;
23import { StatusBar } from "@components/StatusBar" ;
3- import { TabBar } from "@components/TabBar" ;
44import { UpdatePrompt } from "@components/UpdatePrompt" ;
55import { CommandMenu } from "@features/command/components/CommandMenu" ;
66import { SettingsView } from "@features/settings/components/SettingsView" ;
@@ -11,49 +11,27 @@ import { Box, Flex } from "@radix-ui/themes";
1111import { track } from "@renderer/lib/analytics" ;
1212import type { Task } from "@shared/types" ;
1313import { useLayoutStore } from "@stores/layoutStore" ;
14- import { useTabStore } from "@stores/tabStore " ;
14+ import { useNavigationStore } from "@stores/navigationStore " ;
1515import { useCallback , useEffect , useState } from "react" ;
1616import { useHotkeys } from "react-hotkeys-hook" ;
1717import { Toaster } from "sonner" ;
1818import { ANALYTICS_EVENTS } from "@/types/analytics" ;
1919
2020export function MainLayout ( ) {
21- const { activeTabId, tabs, createTab, setActiveTab, closeTab } =
22- useTabStore ( ) ;
2321 const { setCliMode } = useLayoutStore ( ) ;
22+ const { view, toggleSettings, navigateToTaskList, navigateToTask, goBack, goForward } =
23+ useNavigationStore ( ) ;
2424 useIntegrations ( ) ;
2525 const [ commandMenuOpen , setCommandMenuOpen ] = useState ( false ) ;
2626
2727 const handleOpenSettings = useCallback ( ( ) => {
28- const existingTab = tabs . find ( ( tab ) => tab . type === "settings" ) ;
29-
30- if ( existingTab ) {
31- if ( activeTabId === existingTab . id ) {
32- closeTab ( existingTab . id ) ;
33- } else {
34- setActiveTab ( existingTab . id ) ;
35- }
36- } else {
37- createTab ( {
38- type : "settings" ,
39- title : "Settings" ,
40- } ) ;
41- }
42- } , [ tabs , activeTabId , setActiveTab , createTab , closeTab ] ) ;
28+ toggleSettings ( ) ;
29+ } , [ toggleSettings ] ) ;
4330
4431 const handleFocusTaskMode = useCallback ( ( ) => {
45- // Find the Tasks tab or use the first task-list tab
46- const tasksTab = tabs . find ( ( tab ) => tab . type === "task-list" ) ;
47-
48- if ( tasksTab ) {
49- setActiveTab ( tasksTab . id ) ;
50- }
51-
52- // Switch to task mode
32+ navigateToTaskList ( ) ;
5333 setCliMode ( "task" ) ;
54-
55- // Note: The auto-focus effect in CliTaskPanel will handle focusing the editor
56- } , [ tabs , setActiveTab , setCliMode ] ) ;
34+ } , [ setCliMode , navigateToTaskList ] ) ;
5735
5836 useHotkeys ( "mod+k" , ( ) => setCommandMenuOpen ( ( prev ) => ! prev ) , {
5937 enabled : ! commandMenuOpen ,
@@ -66,6 +44,8 @@ export function MainLayout() {
6644 } ) ;
6745 useHotkeys ( "mod+n" , ( ) => handleFocusTaskMode ( ) ) ;
6846 useHotkeys ( "mod+," , ( ) => handleOpenSettings ( ) ) ;
47+ useHotkeys ( "mod+[" , ( ) => goBack ( ) ) ;
48+ useHotkeys ( "mod+]" , ( ) => goForward ( ) ) ;
6949
7050 useEffect ( ( ) => {
7151 const unsubscribe = window . electronAPI ?. onOpenSettings ( ( ) => {
@@ -78,51 +58,31 @@ export function MainLayout() {
7858 } , [ handleOpenSettings ] ) ;
7959
8060 const handleSelectTask = ( task : Task ) => {
81- const existingTab = tabs . find (
82- ( tab ) =>
83- tab . type === "task-detail" &&
84- tab . data &&
85- typeof tab . data === "object" &&
86- "id" in tab . data &&
87- tab . data . id === task . id ,
88- ) ;
89-
90- if ( existingTab ) {
91- setActiveTab ( existingTab . id ) ;
92- } else {
93- createTab ( {
94- type : "task-detail" ,
95- title : task . title ,
96- data : task ,
97- } ) ;
61+ navigateToTask ( task ) ;
9862
99- // Track task view
100- track ( ANALYTICS_EVENTS . TASK_VIEWED , {
101- task_id : task . id ,
102- has_repository : ! ! task . repository_config ,
103- } ) ;
104- }
63+ // Track task view
64+ track ( ANALYTICS_EVENTS . TASK_VIEWED , {
65+ task_id : task . id ,
66+ has_repository : ! ! task . repository_config ,
67+ } ) ;
10568 } ;
10669
107- const activeTab = tabs . find ( ( tab ) => tab . id === activeTabId ) ;
108-
10970 return (
11071 < Flex direction = "column" height = "100vh" >
111- < TabBar onOpenCommandMenu = { ( ) => setCommandMenuOpen ( true ) } />
112-
72+ < TopBar onSearchClick = { ( ) => setCommandMenuOpen ( true ) } />
11373 < Flex flexGrow = "1" overflow = "hidden" >
11474 < MainSidebar />
11575
11676 < Box flexGrow = "1" overflow = "hidden" >
117- { activeTab ? .type === "task-list" && (
77+ { view . type === "task-list" && (
11878 < TaskList onSelectTask = { handleSelectTask } />
11979 ) }
12080
121- { activeTab ? .type === "task-detail" && activeTab . data ? (
122- < TaskDetail task = { activeTab . data as Task } />
123- ) : null }
81+ { view . type === "task-detail" && view . data && (
82+ < TaskDetail key = { view . data . id } task = { view . data } />
83+ ) }
12484
125- { activeTab ? .type === "settings" && < SettingsView /> }
85+ { view . type === "settings" && < SettingsView /> }
12686 </ Box >
12787 </ Flex >
12888
0 commit comments