'use client' import { useEffect, useRef, useState } from 'react' import type { AdvisorCase } from './useAdvisorCase' import { StickyQuestion } from './StickyQuestion' import { AdvisorEmptyState } from './EmptyState' import { CaseView, LoadingDots, ErrorBox } from './CaseView' import { ClarifyView } from './ClarifyView' import { EvidenceSummary } from './EvidenceSummary' import { EvidencePane } from './EvidencePane' import { VisualEvidencePane } from './VisualEvidencePane' import { FootnotesPane } from './FootnotesPane' import { Markdown } from './Markdown' import { useCitationHighlight } from './useCitationHighlight' /** * Advisor body as a series of CASES. * - Narrow: stacked cases with a pinned last question. * - Wide: 3-column Case Workspace — question+summary (left) | answer/clarify (center) | evidence (right). */ export function EvidenceWorkspace({ cases, expanded, busy, exampleQuestions, onExample, onSelectContext, }: { cases: AdvisorCase[] expanded: boolean busy: boolean exampleQuestions: string[] onExample: (q: string) => void onSelectContext: (caseId: string, ctx: string) => void }) { const [activeId, setActiveId] = useState(null) const endRef = useRef(null) const latest = cases[cases.length - 1] const active = cases.find((c) => c.id === activeId) ?? latest useEffect(() => { setActiveId(null) }, [cases.length]) useEffect(() => { if (!expanded) endRef.current?.scrollIntoView({ behavior: 'smooth' }) }, [cases.length, expanded]) const answer = active?.response?.mode === 'answer' ? active.response : null const { highlightedId, cite } = useCitationHighlight(answer?.citations ?? []) if (cases.length === 0) { return (
) } if (!expanded) { return (
{latest && }
{cases.map((c, i) => ( onSelectContext(c.id, ctx)} /> ))}
) } const r = active?.response return (
{active?.status === 'loading' && } {active?.status === 'error' && } {r?.mode === 'clarify' && ( active && onSelectContext(active.id, ctx)} /> )} {r?.mode === 'answer' && (
)}
) }