diff options
| author | soryu <soryu@soryu.co> | 2026-02-03 23:48:41 +0000 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-02-03 23:48:41 +0000 |
| commit | 9ebc9724afcc0482a8e7cd2369c06208fedbcbd1 (patch) | |
| tree | 53da855b4ca61a5c0856fc15112daa7a3748c637 /makima/frontend/src/routes | |
| parent | dcbf8c834626870a43b633b099f409d69d4f9b87 (diff) | |
| download | soryu-9ebc9724afcc0482a8e7cd2369c06208fedbcbd1.tar.gz soryu-9ebc9724afcc0482a8e7cd2369c06208fedbcbd1.zip | |
Add 'Discuss Contract' feature to listen page (#57)
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> ); } |
