import React, { useState, useCallback, useEffect } from 'react'; import { createTheme, ThemeProvider, Paper, IconButton, TextField, Tooltip, CircularProgress, Dialog, DialogTitle, DialogContent, DialogActions, Button, Typography, Box, Divider } from '@mui/material'; import { AutoAwesome as AutoAwesomeIcon, } from '@mui/icons-material'; import { BlogOutlineSection, BlogResearchResponse } from '../../../services/blogWriterApi'; import BlogSection from './BlogSection'; // Helper to create a consistent theme const theme = createTheme({ typography: { fontFamily: '"Inter", "Roboto", "Helvetica", "Arial", sans-serif', }, palette: { primary: { main: '#4f46e5', }, }, }); interface BlogEditorProps { outline: BlogOutlineSection[]; research: BlogResearchResponse | null; initialTitle?: string; titleOptions?: string[]; researchTitles?: string[]; aiGeneratedTitles?: string[]; sections?: Record; onContentUpdate?: (sections: any[]) => void; onSave?: (content: any) => void; } const BlogEditor: React.FC = ({ outline, research, initialTitle, titleOptions = [], researchTitles = [], aiGeneratedTitles = [], sections: parentSections, onContentUpdate, onSave }) => { const [blogTitle, setBlogTitle] = useState(initialTitle || 'Your Amazing Blog Title'); const [sections, setSections] = useState([]); const [isTitleLoading, setIsTitleLoading] = useState(false); const [expandedSections, setExpandedSections] = useState>(new Set()); const [showTitleModal, setShowTitleModal] = useState(false); // Initialize sections from outline or use parent sections useEffect(() => { if (outline && outline.length > 0) { const initialSections = outline.map((section, index) => ({ id: section.id || index + 1, title: section.heading, content: parentSections?.[section.id] || section.key_points?.join(' ') || '', wordCount: section.target_words || 0, sources: section.references?.length || 0, outlineData: { subheadings: section.subheadings || [], keyPoints: section.key_points || [], keywords: section.keywords || [], references: section.references || [], targetWords: section.target_words || 0 } })); setSections(initialSections); } }, [outline, parentSections]); // Initialize title from parent when provided useEffect(() => { if (initialTitle && initialTitle.trim().length > 0) { setBlogTitle(initialTitle); } }, [initialTitle]); const handleSuggestTitle = useCallback(() => { console.log('Available titles:', { researchTitles, aiGeneratedTitles, titleOptions }); setShowTitleModal(true); }, [researchTitles, aiGeneratedTitles, titleOptions]); const handleTitleSelect = useCallback((selectedTitle: string) => { setBlogTitle(selectedTitle); setShowTitleModal(false); }, []); const toggleSectionExpansion = useCallback((sectionId: any) => { setExpandedSections(prev => { const newSet = new Set(prev); if (newSet.has(sectionId)) { newSet.delete(sectionId); } else { newSet.add(sectionId); } return newSet; }); }, []); // Main Render - Exactly like your example return (

{ const newTitle = prompt('Edit blog title:', blogTitle); if (newTitle !== null) { setBlogTitle(newTitle); } }} title="Click to edit title" > {blogTitle}

{isTitleLoading ? : }

This is where your blog's subtitle or a brief one-line description will appear. It's editable too!

{sections.map((section) => ( ))}
{/* Title Selection Modal */} setShowTitleModal(false)} maxWidth="md" fullWidth > Choose Your Blog Title {/* Research Titles */} {researchTitles.length > 0 && ( 📊 Research-Based Titles {researchTitles.map((title, index) => ( ))} )} {/* AI Generated Titles */} {aiGeneratedTitles.length > 0 && ( 🤖 AI Generated Titles {aiGeneratedTitles.map((title, index) => ( ))} )} {/* Title Options */} {titleOptions.length > 0 && ( ✨ Additional Options {titleOptions.map((title, index) => ( ))} )} {researchTitles.length === 0 && aiGeneratedTitles.length === 0 && titleOptions.length === 0 && ( No title options available. Please generate an outline first. )} {/* Debug info */} {process.env.NODE_ENV === 'development' && ( Debug: Research titles: {researchTitles.length}, AI titles: {aiGeneratedTitles.length}, Options: {titleOptions.length} )}
); }; export default BlogEditor;