import React, { useState, useEffect } from 'react'; import { Header } from '@/components/Header'; import { Sidebar } from '@/components/Sidebar'; import { FloatingButton } from '@/components/FloatingButton'; import { ContentEditor } from '@/components/editors/ContentEditor'; import { StandardEditor } from '@/components/editors/StandardEditor'; import { useWebSocket } from '@/hooks/useWebSocket'; import { AgentState, Tabs, ClientMessageType, ServerMessageType } from '@/constants'; const App = () => { // Editor content state const [originalContext, setOriginalContext] = useState(''); const [modifiedContext, setModifiedContext] = useState(''); const [originalResponse, setOriginalResponse] = useState(''); const [modifiedResponse, setModifiedResponse] = useState(''); const [validationError, setValidationError] = useState(null); const [input, setInput] = useState(''); const [output, setOutput] = useState(''); // UI state const [activeTab, setActiveTab] = useState(Tabs.CONTEXT); const [showDiff, setShowDiff] = useState(false); const [showSidebar, setShowSidebar] = useState(false); const [agentState, setAgentState] = useState(AgentState.CONTEXT_APPROVAL); const { wsState, sendMessage, setMessageHandler } = useWebSocket('ws://localhost:8080/ws'); // Set up WebSocket message handlers useEffect(() => { setMessageHandler(ServerMessageType.STATE_CHANGE, (message) => { setAgentState(message.state); }); setMessageHandler(ServerMessageType.CONTEXT_UPDATE, (message) => { setOriginalContext(message.context); setModifiedContext(message.context); }); setMessageHandler(ServerMessageType.RESPONSE_UPDATE, (message) => { setOriginalResponse(message.response); setModifiedResponse(message.response); setValidationError(message.validation_error); }); setMessageHandler(ServerMessageType.OUTPUT_UPDATE, (message) => { setOutput(prev => prev + message.data); }); }, [setMessageHandler]); const handleApprove = () => { if (agentState === AgentState.CONTEXT_APPROVAL) { sendMessage(ClientMessageType.APPROVE_CONTEXT); } else if (agentState === AgentState.RESPONSE_APPROVAL) { sendMessage(ClientMessageType.APPROVE_RESPONSE, modifiedResponse); } }; const handleSendInput = () => { if (input.trim()) { sendMessage(ClientMessageType.SEND_INPUT, input); setInput(''); } }; useEffect(() => { switch (agentState) { case AgentState.CONTEXT_APPROVAL: setActiveTab(Tabs.CONTEXT); break; case AgentState.RESPONSE_APPROVAL: setActiveTab(Tabs.RESPONSE); break; } }, [agentState]); return (
{activeTab === Tabs.CONTEXT && ( setModifiedContext(value)} validationError={null} /> )} {activeTab === Tabs.RESPONSE && ( setModifiedResponse(value)} validationError={validationError} /> )} {activeTab === Tabs.INPUT && ( setInput(value)} language="plaintext" /> )} {activeTab === Tabs.OUTPUT && ( )}
setShowDiff(!showDiff)} onSendInput={handleSendInput} onClearOutput={() => setOutput('')} /> setShowSidebar(!showSidebar)} />
); }; export default App;