summaryrefslogtreecommitdiff
path: root/makima/frontend/src/routes
diff options
context:
space:
mode:
authorsoryu <soryu@soryu.co>2026-02-03 23:48:41 +0000
committerGitHub <noreply@github.com>2026-02-03 23:48:41 +0000
commit9ebc9724afcc0482a8e7cd2369c06208fedbcbd1 (patch)
tree53da855b4ca61a5c0856fc15112daa7a3748c637 /makima/frontend/src/routes
parentdcbf8c834626870a43b633b099f409d69d4f9b87 (diff)
downloadsoryu-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.tsx38
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>
);
}