diff options
Diffstat (limited to 'makima/frontend/src/routes')
| -rw-r--r-- | makima/frontend/src/routes/listen.tsx | 38 |
1 files changed, 37 insertions, 1 deletions
diff --git a/makima/frontend/src/routes/listen.tsx b/makima/frontend/src/routes/listen.tsx index 8af538e..a53cbd9 100644 --- a/makima/frontend/src/routes/listen.tsx +++ b/makima/frontend/src/routes/listen.tsx @@ -4,9 +4,10 @@ import { SpeakerPanel } from "../components/listen/SpeakerPanel"; import { TranscriptPanel } from "../components/listen/TranscriptPanel"; import { ControlPanel, type ContractOption } from "../components/listen/ControlPanel"; import { TranscriptAnalysisPanel } from "../components/listen/TranscriptAnalysisPanel"; +import { DiscussContractModal } from "../components/listen/DiscussContractModal"; import { useMicrophone } from "../hooks/useMicrophone"; import { useWebSocket } from "../hooks/useWebSocket"; -import { listContracts } from "../lib/api"; +import { listContracts, type CreatedContractInfo } from "../lib/api"; import { useAuth } from "../contexts/AuthContext"; export default function ListenPage() { @@ -27,6 +28,9 @@ export default function ListenPage() { contractId: string; } | null>(null); + // Discuss contract modal state + const [isDiscussModalOpen, setIsDiscussModalOpen] = useState(false); + // Fetch contracts on mount useEffect(() => { if (!isAuthenticated) { @@ -175,6 +179,29 @@ export default function ListenPage() { setSavedTranscript(null); }, []); + // Get current transcript context for discussion + const transcriptContext = useMemo(() => { + if (ws.transcripts.length === 0) return undefined; + return ws.transcripts + .map(t => `[${t.speaker}]: ${t.text}`) + .join("\n"); + }, [ws.transcripts]); + + const handleOpenDiscussModal = useCallback(() => { + setIsDiscussModalOpen(true); + }, []); + + const handleContractCreated = useCallback((contract: CreatedContractInfo) => { + // Add to contracts list and select it + setContracts(prev => [ + { id: contract.id, name: contract.name }, + ...prev, + ]); + setSelectedContractId(contract.id); + // Close the modal after a short delay to show success + setTimeout(() => setIsDiscussModalOpen(false), 2000); + }, []); + const error = ws.error || mic.error; return ( @@ -206,6 +233,7 @@ export default function ListenPage() { contracts={contracts} selectedContractId={selectedContractId} onContractChange={setSelectedContractId} + onDiscussContract={handleOpenDiscussModal} contractsLoading={contractsLoading} connectionStatus={ws.status} /> @@ -236,6 +264,14 @@ export default function ListenPage() { </div> </div> )} + + {/* Discuss Contract Modal */} + <DiscussContractModal + isOpen={isDiscussModalOpen} + onClose={() => setIsDiscussModalOpen(false)} + transcriptContext={transcriptContext} + onContractCreated={handleContractCreated} + /> </div> ); } |
