import React, { useMemo, useCallback } from "react"; import { Stack, Typography, Chip, Divider, Box, alpha, Paper, Stepper, Step, StepLabel, CircularProgress } from "@mui/material"; import { Insights as InsightsIcon, Search as SearchIcon, AttachMoney as AttachMoneyIcon, EditNote as EditNoteIcon, Article as ArticleIcon, AutoAwesome as AutoAwesomeIcon, ArrowForward as ArrowForwardIcon, CheckCircle as CheckCircleIcon, } from "@mui/icons-material"; import { Research, ResearchInsight } from "../types"; import { GlassyCard, glassyCardSx, PrimaryButton } from "../ui"; import { FactCard } from "../FactCard"; import { TextToSpeechButton } from "../../shared/TextToSpeechButton"; interface ResearchSummaryProps { research: Research; canGenerateScript: boolean; onGenerateScript: () => void; isGeneratingScript?: boolean; } export const ResearchSummary: React.FC = ({ research, canGenerateScript, onGenerateScript, isGeneratingScript = false, }) => { // Simple markdown-to-HTML converter const renderMarkdown = useCallback((text: string) => { if (!text) return null; return text .split('\n') .filter(line => line.trim() !== '') // Remove empty lines .map((line, i) => { // Handle bold let processedLine = line.replace(/\*\*(.*?)\*\*/g, '$1'); // Handle lists if (processedLine.trim().startsWith('- ') || processedLine.trim().startsWith('* ')) { return
  • ; } // Handle headers - make them smaller if (processedLine.startsWith('### ')) { return {processedLine.substring(4)}; } if (processedLine.startsWith('## ')) { return {processedLine.substring(3)}; } // Paragraphs - compact spacing return processedLine.trim() ?

    : null; }); }, []); return ( {/* Step Indicator */} } > Analysis Research Script Render Research Summary {/* Research Metadata - Moved alongside title */} {research.searchQueries && research.searchQueries.length > 0 && ( } label={`${research.searchQueries.length} search${research.searchQueries.length > 1 ? "es" : ""}`} size="small" sx={{ background: alpha("#667eea", 0.1), color: "#667eea", fontWeight: 600, border: "1px solid rgba(102, 126, 234, 0.2)", }} /> )} {research.searchType && ( )} {research.sourceCount !== undefined && ( )} {research.cost !== undefined && ( } label={`$${research.cost.toFixed(3)}`} size="small" sx={{ background: alpha("#f59e0b", 0.1), color: "#d97706", fontWeight: 600, border: "1px solid rgba(245, 158, 11, 0.2)", }} /> )} : } endIcon={isGeneratingScript ? undefined : } tooltip={!canGenerateScript ? "Complete research to generate script" : "Generate AI-powered script from research"} sx={{ background: "linear-gradient(135deg, #667eea 0%, #764ba2 100%)", color: "#fff", fontWeight: 700, fontSize: "1rem", px: 4, py: 1.5, borderRadius: 2, textTransform: "none", boxShadow: "0 4px 14px rgba(102, 126, 234, 0.4)", "&:hover": { background: "linear-gradient(135deg, #764ba2 0%, #667eea 100%)", boxShadow: "0 6px 20px rgba(102, 126, 234, 0.5)", }, "&:disabled": { background: "#94a3b8", boxShadow: "none", } }} > {isGeneratingScript ? "Generating Script..." : "Generate Script to Continue"} {/* Main Summary */} {research.summary && ( Executive Summary {renderMarkdown(research.summary)} )} {/* Deep Insights */} {(research.keyInsights && research.keyInsights.length > 0) ? ( Deep Insights {research.keyInsights.map((insight: ResearchInsight, idx: number) => ( {insight.title} {insight.source_indices && insight.source_indices.length > 0 && ( {insight.source_indices.map(sIdx => ( ))} )} {renderMarkdown(insight.content)} ))} ) : ( /* Fallback if keyInsights is missing but we have summary paragraphs */ research.summary && research.summary.length > 500 && !research.keyInsights && ( Additional Insights {/* Render parts of summary that might contain insights if structured data is missing */} {renderMarkdown(research.summary.split('\n\n').slice(1).join('\n\n'))} ) )} {/* Search Queries Used */} {research.searchQueries && research.searchQueries.length > 0 && ( Search Queries Used {research.searchQueries.map((query, idx) => ( ))} )} {research.factCards.length > 0 && ( <> Research Sources & Facts ({research.factCards.length}) Click to expand • Hover to see source {research.factCards.map((fact) => ( ))} )} ); };