import React, { useCallback } from 'react'; import { useDispatch, useSelector } from 'react-redux'; import { IReduxState } from '../../../app/types'; import { exportMeeting, generateSummary } from '../../actions'; import { getMeetingIntelligenceState } from '../../functions'; /** * AI-generated meeting summary panel. * * @returns {React.ReactElement} The summary panel component. */ const SummaryPanel: React.FC = () => { const dispatch = useDispatch(); const { summary, summaryLoading, summaryError, selectedMeetingId, selectedMeeting, exportLoading } = useSelector((state: IReduxState) => getMeetingIntelligenceState(state)); const handleGenerateSummary = useCallback(() => { if (selectedMeetingId) { dispatch(generateSummary(selectedMeetingId) as any); } }, [ dispatch, selectedMeetingId ]); const handleExportMarkdown = useCallback(() => { if (selectedMeetingId) { dispatch(exportMeeting(selectedMeetingId, 'markdown') as any); } }, [ dispatch, selectedMeetingId ]); const handleExportPdf = useCallback(() => { if (selectedMeetingId) { dispatch(exportMeeting(selectedMeetingId, 'pdf') as any); } }, [ dispatch, selectedMeetingId ]); const handleExportJson = useCallback(() => { if (selectedMeetingId) { dispatch(exportMeeting(selectedMeetingId, 'json') as any); } }, [ dispatch, selectedMeetingId ]); if (summaryLoading) { return (
Loading summary...
); } if (summaryError) { return (

Failed to load summary: {summaryError}

); } if (!summary) { const canGenerate = selectedMeeting?.status === 'ready'; return (

No summary yet

{canGenerate ? 'Generate an AI summary to see key points, action items, and decisions.' : 'Summary will be available after transcription is complete.'}

{canGenerate && ( )}
); } return (

Summary

{summary.summary_text}

{summary.key_points && summary.key_points.length > 0 && (

Key Points

    {summary.key_points.map((point, index) => (
  • {point}
  • ))}
)} {summary.action_items && summary.action_items.length > 0 && (

Action Items

    {summary.action_items.map((item, index) => (
  • {item.task} {item.assignee && ( ({item.assignee}) )}
  • ))}
)} {summary.decisions && summary.decisions.length > 0 && (

Decisions

    {summary.decisions.map((decision, index) => (
  • {decision}
  • ))}
)} {summary.topics && summary.topics.length > 0 && (

Topics Discussed

{summary.topics.map((topic, index) => ( {topic} ))}
)}

Export

); }; export default SummaryPanel;