feat: integrate TranscriptChatModal and button into transcript page

This commit is contained in:
Igor Loskutov
2026-01-12 20:08:23 -05:00
parent 39e0b89e67
commit 8ca5324c1a
3 changed files with 54 additions and 10 deletions

View File

@@ -1,14 +1,23 @@
{ {
"assignee": null, "assignee": "igor.loskutoff@gmail.com",
"claim_note": "", "claim_note": "",
"claimed_at": null, "claimed_at": "2026-01-13T01:00:42.868632Z",
"created_at": "2026-01-12T22:41:17.915169Z", "created_at": "2026-01-12T22:41:17.915169Z",
"depends_on": [], "depends_on": [],
"epic": "fn-1", "epic": "fn-1",
"evidence": {
"commits": [
"e7dc003a1dacdbc1992265e6c5b0f0cf522f8530"
],
"prs": [],
"tests": [
"pnpm format"
]
},
"id": "fn-1.7", "id": "fn-1.7",
"priority": null, "priority": null,
"spec_path": ".flow/tasks/fn-1.7.md", "spec_path": ".flow/tasks/fn-1.7.md",
"status": "todo", "status": "done",
"title": "Integrate into transcript page", "title": "Integrate into transcript page",
"updated_at": "2026-01-12T22:41:17.915341Z" "updated_at": "2026-01-13T01:08:49.593046Z"
} }

View File

@@ -1,15 +1,32 @@
# fn-1.7 Integrate into transcript page # fn-1.7 Integrate into transcript page
## Description ## Description
TBD Add TranscriptChatModal and TranscriptChatButton to the transcript details page. Use `useDisclosure` hook for modal state, instantiate `useTranscriptChat` hook with transcriptId, and render both components.
## Acceptance ## Acceptance
- [ ] TBD - [ ] Import useDisclosure from @chakra-ui/react
- [ ] Import TranscriptChatModal and TranscriptChatButton components
- [ ] Import useTranscriptChat hook
- [ ] Add useDisclosure hook for modal open/close state
- [ ] Add useTranscriptChat hook with transcriptId
- [ ] Render TranscriptChatModal with all required props
- [ ] Render TranscriptChatButton with onClick handler
- [ ] Floating button appears on transcript page
- [ ] Click button opens chat dialog
- [ ] Dialog integrates with existing page layout
## Done summary ## Done summary
TBD - Added TranscriptChatModal and TranscriptChatButton to transcript details page
- Imported useDisclosure hook from @chakra-ui/react for modal state management
- Integrated useTranscriptChat hook with transcriptId for WebSocket connection
- Rendered floating chat button in bottom-right corner and modal dialog
- Chat interface now accessible from all completed transcript pages
Verification:
- Code formatting passed (pnpm format)
- Pre-commit hooks passed
- Integration follows existing patterns from PRD spec
## Evidence ## Evidence
- Commits: - Commits: e7dc003a1dacdbc1992265e6c5b0f0cf522f8530
- Tests: - Tests: pnpm format
- PRs: - PRs:

View File

@@ -18,9 +18,15 @@ import {
Skeleton, Skeleton,
Text, Text,
Spinner, Spinner,
useDisclosure,
} from "@chakra-ui/react"; } from "@chakra-ui/react";
import { useTranscriptGet } from "../../../lib/apiHooks"; import { useTranscriptGet } from "../../../lib/apiHooks";
import { TranscriptStatus } from "../../../lib/transcript"; import { TranscriptStatus } from "../../../lib/transcript";
import {
TranscriptChatModal,
TranscriptChatButton,
} from "../TranscriptChatModal";
import { useTranscriptChat } from "../useTranscriptChat";
type TranscriptDetails = { type TranscriptDetails = {
params: Promise<{ params: Promise<{
@@ -53,6 +59,9 @@ export default function TranscriptDetails(details: TranscriptDetails) {
const [finalSummaryElement, setFinalSummaryElement] = const [finalSummaryElement, setFinalSummaryElement] =
useState<HTMLDivElement | null>(null); useState<HTMLDivElement | null>(null);
const { open, onOpen, onClose } = useDisclosure();
const chat = useTranscriptChat(transcriptId);
useEffect(() => { useEffect(() => {
if (!waiting || !transcript.data) return; if (!waiting || !transcript.data) return;
@@ -119,6 +128,15 @@ export default function TranscriptDetails(details: TranscriptDetails) {
return ( return (
<> <>
<TranscriptChatModal
open={open}
onClose={onClose}
messages={chat.messages}
sendMessage={chat.sendMessage}
isStreaming={chat.isStreaming}
currentStreamingText={chat.currentStreamingText}
/>
<TranscriptChatButton onClick={onOpen} />
<Grid <Grid
templateColumns="1fr" templateColumns="1fr"
templateRows="auto minmax(0, 1fr)" templateRows="auto minmax(0, 1fr)"