🐛 hover analysis should update the sidebar feedback

This commit is contained in:
2026-03-02 09:35:49 +10:00
parent c735eed1f3
commit cc091d06ab
2 changed files with 20 additions and 0 deletions

View File

@@ -130,6 +130,7 @@ export function analyseAnnotation(
const text = accumulated || ann.message const text = accumulated || ann.message
const suggestion = extractBlockquote(text) ?? ann.suggestion ?? null const suggestion = extractBlockquote(text) ?? ann.suggestion ?? null
tooltipAnalysisCache.set(ann.id, { text, suggestion }) tooltipAnalysisCache.set(ann.id, { text, suggestion })
window.dispatchEvent(new CustomEvent('annotation-cached', { detail: { id: ann.id } }))
onUpdate(text, false, suggestion) onUpdate(text, false, suggestion)
}).catch(() => { }).catch(() => {
if (!cancelled) onUpdate(ann.message, false, ann.suggestion ?? null) if (!cancelled) onUpdate(ann.message, false, ann.suggestion ?? null)
@@ -137,6 +138,7 @@ export function analyseAnnotation(
} else { } else {
const suggestion = ann.suggestion ?? null const suggestion = ann.suggestion ?? null
tooltipAnalysisCache.set(ann.id, { text: ann.message, suggestion }) tooltipAnalysisCache.set(ann.id, { text: ann.message, suggestion })
window.dispatchEvent(new CustomEvent('annotation-cached', { detail: { id: ann.id } }))
onUpdate(ann.message, false, suggestion) onUpdate(ann.message, false, suggestion)
} }

View File

@@ -79,6 +79,24 @@ function FeedbackCard({ ann, autoAnalyse, onDismiss }: FeedbackCardProps): JSX.E
return () => { cleanupRef.current?.() } return () => { cleanupRef.current?.() }
}, []) }, [])
// When a hover tooltip completes analysis for this annotation, hydrate the card
// from the cache so the sidebar reflects the result without requiring a manual click.
useEffect(() => {
const handler = (e: Event): void => {
const { id } = (e as CustomEvent<{ id: string }>).detail
if (id !== ann.id) return
const cached = tooltipAnalysisCache.get(ann.id)
if (!cached) return
setState(prev =>
prev.status === 'idle'
? { status: 'done', text: cached.text, suggestion: cached.suggestion }
: prev
)
}
window.addEventListener('annotation-cached', handler)
return () => window.removeEventListener('annotation-cached', handler)
}, [ann.id])
const typeName = ann.type.replace(/_/g, ' ') const typeName = ann.type.replace(/_/g, ' ')
const isSpinning = state.status === 'streaming' && state.text === '' const isSpinning = state.status === 'streaming' && state.text === ''
const hasText = (state.status === 'streaming' || state.status === 'done') && state.text !== '' const hasText = (state.status === 'streaming' || state.status === 'done') && state.text !== ''