11import { useState , useRef , useEffect , useCallback } from "react" ;
22import { useAtom , useAtomValue } from "jotai" ;
33import { chatMessagesAtom , chatStreamCountAtom } from "../atoms/chatAtoms" ;
4+ import { isTodoPanelOpenAtom } from "../atoms/todoAtoms" ;
45import { IpcClient } from "@/ipc/ipc_client" ;
56import { useSettings } from "@/hooks/useSettings" ;
67
@@ -9,6 +10,7 @@ import { MessagesList } from "./chat/MessagesList";
910import { ChatInput } from "./chat/ChatInput" ;
1011import { VersionPane } from "./chat/VersionPane" ;
1112import { ChatError } from "./chat/ChatError" ;
13+ import { TodoListPanel } from "./TodoListPanel" ;
1214
1315// Backend components
1416import { BackendChatPanel as BackendChatPanelComponent } from "./backend-chat/BackendChatPanel" ;
@@ -26,11 +28,17 @@ export function ChatPanel({
2628} : ChatPanelProps ) {
2729 const { settings } = useSettings ( ) ;
2830 const isBackendMode = settings ?. selectedChatMode === "backend" ;
31+ const isFullstackMode = settings ?. selectedChatMode === "fullstack" ;
32+ const isFrontendMode = settings ?. selectedChatMode === "build" ;
2933
3034 const [ messages , setMessages ] = useAtom ( chatMessagesAtom ) ;
35+ const [ isTodoPanelOpen , setIsTodoPanelOpen ] = useAtom ( isTodoPanelOpenAtom ) ;
3136 const [ isVersionPaneOpen , setIsVersionPaneOpen ] = useState ( false ) ;
3237 const [ error , setError ] = useState < string | null > ( null ) ;
3338 const streamCount = useAtomValue ( chatStreamCountAtom ) ;
39+
40+ // Debug logging
41+ console . log ( "ChatPanel render:" , { isBackendMode, isFullstackMode, isFrontendMode, isTodoPanelOpen, showTodoToggle : isFullstackMode || isFrontendMode } ) ;
3442 // Reference to store the processed prompt so we don't submit it twice
3543
3644 const messagesEndRef = useRef < HTMLDivElement | null > ( null ) ;
@@ -134,30 +142,41 @@ export function ChatPanel({
134142
135143 // Default frontend mode
136144 return (
137- < div className = "flex flex-col h-full" >
138- < ChatHeader
139- isVersionPaneOpen = { isVersionPaneOpen }
140- isPreviewOpen = { isPreviewOpen }
141- onTogglePreview = { onTogglePreview }
142- onVersionClick = { ( ) => setIsVersionPaneOpen ( ! isVersionPaneOpen ) }
143- />
144- < div className = "flex flex-1 overflow-hidden" >
145- { ! isVersionPaneOpen && (
146- < div className = "flex-1 flex flex-col min-w-0" >
147- < MessagesList
148- messages = { messages }
149- messagesEndRef = { messagesEndRef }
150- ref = { messagesContainerRef }
151- />
152- < ChatError error = { error } onDismiss = { ( ) => setError ( null ) } />
153- < ChatInput chatId = { chatId } />
154- </ div >
155- ) }
156- < VersionPane
157- isVisible = { isVersionPaneOpen }
158- onClose = { ( ) => setIsVersionPaneOpen ( false ) }
145+ < div className = "flex h-full" >
146+ < div className = "flex flex-col flex-1" >
147+ < ChatHeader
148+ isVersionPaneOpen = { isVersionPaneOpen }
149+ isPreviewOpen = { isPreviewOpen }
150+ onTogglePreview = { onTogglePreview }
151+ onVersionClick = { ( ) => setIsVersionPaneOpen ( ! isVersionPaneOpen ) }
152+ showTodoToggle = { isFullstackMode || isFrontendMode }
153+ isTodoPanelOpen = { isTodoPanelOpen }
154+ onToggleTodo = { ( ) => setIsTodoPanelOpen ( ! isTodoPanelOpen ) }
159155 />
156+ < div className = "flex flex-1 overflow-hidden" >
157+ { ! isVersionPaneOpen && (
158+ < div className = "flex-1 flex flex-col min-w-0" >
159+ < MessagesList
160+ messages = { messages }
161+ messagesEndRef = { messagesEndRef }
162+ ref = { messagesContainerRef }
163+ />
164+ < ChatError error = { error } onDismiss = { ( ) => setError ( null ) } />
165+ < ChatInput chatId = { chatId } />
166+ </ div >
167+ ) }
168+ < VersionPane
169+ isVisible = { isVersionPaneOpen }
170+ onClose = { ( ) => setIsVersionPaneOpen ( false ) }
171+ />
172+ </ div >
160173 </ div >
174+ { ( isFullstackMode || isFrontendMode ) && (
175+ < TodoListPanel
176+ isOpen = { isTodoPanelOpen }
177+ onClose = { ( ) => setIsTodoPanelOpen ( false ) }
178+ />
179+ ) }
161180 </ div >
162181 ) ;
163182}
0 commit comments