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" ;
77import { TaskDetail } from "@features/task-detail/components/TaskDetail" ;
88import { TaskList } from "@features/task-list/components/TaskList" ;
99import { useIntegrations } from "@hooks/useIntegrations" ;
1010import { Box , Flex } from "@radix-ui/themes" ;
11- import { track } from "@renderer/lib/analytics" ;
1211import type { Task } from "@shared/types" ;
1312import { useLayoutStore } from "@stores/layoutStore" ;
14- import { useTabStore } from "@stores/tabStore " ;
13+ import { useNavigationStore } from "@stores/navigationStore " ;
1514import { useCallback , useEffect , useState } from "react" ;
1615import { useHotkeys } from "react-hotkeys-hook" ;
1716import { Toaster } from "sonner" ;
18- import { ANALYTICS_EVENTS } from "@/types/analytics" ;
1917
2018export function MainLayout ( ) {
21- const { activeTabId, tabs, createTab, setActiveTab, closeTab } =
22- useTabStore ( ) ;
2319 const { setCliMode } = useLayoutStore ( ) ;
20+ const { view, toggleSettings, navigateToTaskList, navigateToTask, goBack, goForward } =
21+ useNavigationStore ( ) ;
2422 useIntegrations ( ) ;
2523 const [ commandMenuOpen , setCommandMenuOpen ] = useState ( false ) ;
2624
2725 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 ] ) ;
26+ toggleSettings ( ) ;
27+ } , [ toggleSettings ] ) ;
4328
4429 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
30+ navigateToTaskList ( ) ;
5331 setCliMode ( "task" ) ;
54-
55- // Note: The auto-focus effect in CliTaskPanel will handle focusing the editor
56- } , [ tabs , setActiveTab , setCliMode ] ) ;
32+ } , [ setCliMode , navigateToTaskList ] ) ;
5733
5834 useHotkeys ( "mod+k" , ( ) => setCommandMenuOpen ( ( prev ) => ! prev ) , {
5935 enabled : ! commandMenuOpen ,
@@ -66,6 +42,8 @@ export function MainLayout() {
6642 } ) ;
6743 useHotkeys ( "mod+n" , ( ) => handleFocusTaskMode ( ) ) ;
6844 useHotkeys ( "mod+," , ( ) => handleOpenSettings ( ) ) ;
45+ useHotkeys ( "mod+[" , ( ) => goBack ( ) ) ;
46+ useHotkeys ( "mod+]" , ( ) => goForward ( ) ) ;
6947
7048 useEffect ( ( ) => {
7149 const unsubscribe = window . electronAPI ?. onOpenSettings ( ( ) => {
@@ -78,51 +56,25 @@ export function MainLayout() {
7856 } , [ handleOpenSettings ] ) ;
7957
8058 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- } ) ;
98-
99- // Track task view
100- track ( ANALYTICS_EVENTS . TASK_VIEWED , {
101- task_id : task . id ,
102- has_repository : ! ! task . repository_config ,
103- } ) ;
104- }
59+ navigateToTask ( task ) ;
10560 } ;
10661
107- const activeTab = tabs . find ( ( tab ) => tab . id === activeTabId ) ;
108-
10962 return (
11063 < Flex direction = "column" height = "100vh" >
111- < TabBar onOpenCommandMenu = { ( ) => setCommandMenuOpen ( true ) } />
112-
64+ < TopBar onSearchClick = { ( ) => setCommandMenuOpen ( true ) } />
11365 < Flex flexGrow = "1" overflow = "hidden" >
11466 < MainSidebar />
11567
11668 < Box flexGrow = "1" overflow = "hidden" >
117- { activeTab ? .type === "task-list" && (
69+ { view . type === "task-list" && (
11870 < TaskList onSelectTask = { handleSelectTask } />
11971 ) }
12072
121- { activeTab ? .type === "task-detail" && activeTab . data ? (
122- < TaskDetail task = { activeTab . data as Task } />
123- ) : null }
73+ { view . type === "task-detail" && view . data && (
74+ < TaskDetail key = { view . data . id } task = { view . data } />
75+ ) }
12476
125- { activeTab ? .type === "settings" && < SettingsView /> }
77+ { view . type === "settings" && < SettingsView /> }
12678 </ Box >
12779 </ Flex >
12880
0 commit comments