diff --git a/apps/rowboat/app/projects/[projectId]/playground/app.tsx b/apps/rowboat/app/projects/[projectId]/playground/app.tsx index d7b9528a..eadf7014 100644 --- a/apps/rowboat/app/projects/[projectId]/playground/app.tsx +++ b/apps/rowboat/app/projects/[projectId]/playground/app.tsx @@ -98,22 +98,26 @@ export function App({ } return ( - } - onClick={handleNewChatButtonClick} - > - New chat - , - } - onClick={handleSimulateButtonClick} - > - Simulate - , - ]}> + } + onClick={handleNewChatButtonClick} + > + New chat + , + } + onClick={handleSimulateButtonClick} + > + Simulate + , + ]} + >
{loadingChat &&
diff --git a/apps/rowboat/app/projects/[projectId]/workflow/copilot.tsx b/apps/rowboat/app/projects/[projectId]/workflow/copilot.tsx index 4d8e66b1..93019573 100644 --- a/apps/rowboat/app/projects/[projectId]/workflow/copilot.tsx +++ b/apps/rowboat/app/projects/[projectId]/workflow/copilot.tsx @@ -174,23 +174,35 @@ function App({ workflow, dispatch, chatContext=undefined, + messages, + setMessages, + loadingResponse, + setLoadingResponse, + loadingMessage, + setLoadingMessage, + responseError, + setResponseError, }: { projectId: string; workflow: z.infer; dispatch: (action: WorkflowDispatch) => void; chatContext?: z.infer; + messages: z.infer[]; + setMessages: (messages: z.infer[]) => void; + loadingResponse: boolean; + setLoadingResponse: (loading: boolean) => void; + loadingMessage: string; + setLoadingMessage: (message: string) => void; + responseError: string | null; + setResponseError: (error: string | null) => void; }) { - const [messages, setMessages] = useState[]>([]); - const [loadingResponse, setLoadingResponse] = useState(false); - const [loadingMessage, setLoadingMessage] = useState("Thinking..."); - const [responseError, setResponseError] = useState(null); const messagesEndRef = useRef(null); const [appliedChanges, setAppliedChanges] = useState>({}); const [discardContext, setDiscardContext] = useState(false); const [lastRequest, setLastRequest] = useState(null); const [lastResponse, setLastResponse] = useState(null); - // Cycle through loading messages until reaching the last one + // First useEffect for loading messages useEffect(() => { setLoadingMessage("Thinking"); if (!loadingResponse) return; @@ -210,7 +222,7 @@ function App({ }, 4000); return () => clearInterval(interval); - }, [loadingResponse, messages]); + }, [loadingResponse, setLoadingMessage]); // Reset discardContext when chatContext changes useEffect(() => { @@ -328,7 +340,7 @@ function App({ } }, [dispatch, appliedChanges, messages]); - // get copilot response + // Second useEffect for copilot response useEffect(() => { let ignore = false; @@ -383,7 +395,16 @@ function App({ return () => { ignore = true; }; - }, [messages, projectId, responseError, workflow, effectiveContext]); + }, [ + messages, + projectId, + responseError, + workflow, + effectiveContext, + setLoadingResponse, + setMessages, + setResponseError + ]); function handleCopyChat() { const jsonString = JSON.stringify({ @@ -483,40 +504,63 @@ export function Copilot({ workflow, chatContext=undefined, dispatch, + onNewChat, + messages, + setMessages, + loadingResponse, + setLoadingResponse, + loadingMessage, + setLoadingMessage, + responseError, + setResponseError, }: { projectId: string; workflow: z.infer; chatContext?: z.infer; dispatch: (action: WorkflowDispatch) => void; + onNewChat: () => void; + messages: z.infer[]; + setMessages: (messages: z.infer[]) => void; + loadingResponse: boolean; + setLoadingResponse: (loading: boolean) => void; + loadingMessage: string; + setLoadingMessage: (message: string) => void; + responseError: string | null; + setResponseError: (error: string | null) => void; }) { - const [key, setKey] = useState(0); - - function handleNewChat() { - setKey(key + 1); - } - return ( -