import React, { useState } from "react"; import { Stack, Box, Typography, Paper, Button, CircularProgress, Chip, IconButton, Tooltip, Accordion, AccordionSummary, AccordionDetails, Dialog, DialogContent, DialogTitle } from "@mui/material"; import { BarChart as BarChartIcon, AutoAwesome as AutoAwesomeIcon, Refresh as RefreshIcon, DeleteOutline as DeleteIcon, Fullscreen as FullscreenIcon, ExpandMore as ExpandMoreIcon, Close as CloseIcon, ZoomOutMap as ZoomOutMapIcon } from "@mui/icons-material"; import { useScriptEditor } from "../ScriptEditorContext"; import { Script } from "../../types"; interface BrollInfoPanelProps { activeScript?: Script | null; generatingChartId?: string | null; generateChartPreviews?: () => Promise; regenerateChart?: (sceneId: string) => Promise; removeChart?: (sceneId: string) => void; scenesWithCharts?: number; } export const BrollInfoPanel: React.FC = (props) => { const [expanded, setExpanded] = useState(false); const [previewModal, setPreviewModal] = useState<{ url: string; title: string } | null>(null); const ctx = useScriptEditor(); const { activeScript: ctxActiveScript, generatingChartId: ctxGeneratingChartId, generateChartPreviews: ctxGenerateChartPreviews, regenerateChart: ctxRegenerateChart, removeChart: ctxRemoveChart, scenesWithCharts: ctxScenesWithCharts } = ctx; const resolvedActiveScript = props.activeScript ?? ctxActiveScript; const resolvedGeneratingChartId = props.generatingChartId ?? ctxGeneratingChartId; const resolvedGenerateChartPreviews = props.generateChartPreviews ?? ctxGenerateChartPreviews; const resolvedRegenerateChart = props.regenerateChart ?? ctxRegenerateChart; const resolvedRemoveChart = props.removeChart ?? ctxRemoveChart; if (!resolvedActiveScript || resolvedActiveScript.scenes.length === 0) { return null; } const scenesWithData = resolvedActiveScript.scenes.filter(s => s.chart_data && Object.keys(s.chart_data).length > 0); const hasChartData = scenesWithData.length > 0; const resolvedScenesWithCharts = props.scenesWithCharts ?? ctxScenesWithCharts ?? scenesWithData.length; const openPreview = (url: string, title: string) => { setPreviewModal({ url, title }); }; const closePreview = () => { setPreviewModal(null); }; return ( <> setExpanded(isExpanded)} sx={{ background: "linear-gradient(135deg, rgba(34, 197, 94, 0.03) 0%, rgba(16, 185, 129, 0.03) 100%)", border: "1px solid rgba(34, 197, 94, 0.15)", borderRadius: 2, '&:before': { display: 'none', }, '&.MuiAccordion-root': { borderRadius: 2, }, '& .MuiAccordionSummary-root': { borderRadius: 2, }, }} > } sx={{ '& .MuiAccordionSummary-content': { alignItems: 'center', justifyContent: 'space-between', }, }} > Podcast Charts {resolvedScenesWithCharts} chart{resolvedScenesWithCharts !== 1 ? 's' : ''} for visual storytelling {hasChartData && ( )} {hasChartData ? ( {scenesWithData.map((scene) => { const chartData = scene.chart_data; const hasPreview = !!scene.broll_preview_url; return ( {/* Thumbnail */} hasPreview && scene.broll_preview_url && openPreview(scene.broll_preview_url, scene.title)} sx={{ width: 72, height: 48, flexShrink: 0, borderRadius: 1, overflow: "hidden", background: hasPreview ? "rgba(0,0,0,0.04)" : "linear-gradient(135deg, #f1f5f9 0%, #e2e8f0 100%)", display: "flex", alignItems: "center", justifyContent: "center", cursor: hasPreview ? "pointer" : "default", transition: "all 0.2s ease", position: "relative", "&:hover": hasPreview ? { transform: "scale(1.05)", boxShadow: "0 4px 12px rgba(0,0,0,0.15)", "& .zoom-overlay": { opacity: 1, }, } : {} }} > {resolvedGeneratingChartId === scene.id ? ( ) : hasPreview && scene.broll_preview_url ? ( <> ) : ( )} {/* Chart Info */} {scene.title} {chartData?.labels?.length || 0} labels {hasPreview && ( )} {/* Takeaway */} {chartData?.takeaway && ( "{chartData.takeaway}" )} {/* Actions */} {hasPreview && ( scene.broll_preview_url && openPreview(scene.broll_preview_url, scene.title)} sx={{ color: "#64748b", "&:hover": { color: "#22c55e", background: "rgba(34, 197, 94, 0.1)" } }} > )} resolvedRegenerateChart?.(scene.id)} disabled={!resolvedRegenerateChart || !!resolvedGeneratingChartId} sx={{ color: "#64748b", "&:hover": { color: "#f59e0b", background: "rgba(245, 158, 11, 0.1)" } }} > resolvedRemoveChart?.(scene.id)} disabled={!resolvedRemoveChart} sx={{ color: "#64748b", "&:hover": { color: "#ef4444", background: "rgba(239, 68, 68, 0.1)" } }} > ); })} ) : ( No chart data yet. Add chart data to scenes to generate B-roll visuals. )} {/* Full-size chart preview modal */} {previewModal && ( <> {previewModal.title} )} ); };