import React, { useState, useEffect } from 'react'; import { Box, Button, Typography, Alert, Card, CardContent, CircularProgress, Chip, Grid, Accordion, AccordionSummary, AccordionDetails, List, ListItem, ListItemIcon, ListItemText, LinearProgress, Divider, IconButton, Tooltip, Dialog, DialogTitle, DialogContent, DialogActions } from '@mui/material'; import { ExpandMore, Psychology, CheckCircle, Warning, Info, Visibility, ContentCopy, Download, Refresh, Twitter, LinkedIn, Instagram, Facebook, Article, Email } from '@mui/icons-material'; import { checkPersonaReadiness, generatePersonaPreview, generateWritingPersona, getSupportedPlatforms, exportPersonaPrompt, PersonaReadinessResponse, PersonaPreviewResponse, PersonaGenerationResponse } from '../../api/persona'; interface PersonaGenerationStepProps { onContinue: () => void; updateHeaderContent: (content: { title: string; description: string }) => void; } const PersonaGenerationStep: React.FC = ({ onContinue, updateHeaderContent }) => { const [loading, setLoading] = useState(false); const [readinessData, setReadinessData] = useState(null); const [previewData, setPreviewData] = useState(null); const [generationResult, setGenerationResult] = useState(null); const [supportedPlatforms, setSupportedPlatforms] = useState([]); const [error, setError] = useState(null); const [activeAccordion, setActiveAccordion] = useState('readiness'); const [showExportDialog, setShowExportDialog] = useState(false); const [exportedPrompt, setExportedPrompt] = useState(''); useEffect(() => { updateHeaderContent({ title: 'AI Writing Persona Generation 🤖', description: 'Generate your personalized writing persona based on your onboarding data analysis' }); loadInitialData(); }, [updateHeaderContent]); const loadInitialData = async () => { try { setLoading(true); // Load readiness check and supported platforms in parallel const [readiness, platforms] = await Promise.all([ checkPersonaReadiness(), getSupportedPlatforms() ]); setReadinessData(readiness); setSupportedPlatforms(platforms.platforms); // If ready, automatically generate preview if (readiness.ready && readiness.data_sufficiency >= 70) { await handleGeneratePreview(); } } catch (err: any) { setError(err.message); } finally { setLoading(false); } }; const handleGeneratePreview = async () => { try { setLoading(true); setError(null); const preview = await generatePersonaPreview(); setPreviewData(preview); setActiveAccordion('preview'); } catch (err: any) { setError(err.message); } finally { setLoading(false); } }; const handleGeneratePersona = async () => { try { setLoading(true); setError(null); const result = await generateWritingPersona(); setGenerationResult(result); if (result.success) { setActiveAccordion('result'); } } catch (err: any) { setError(err.message); } finally { setLoading(false); } }; const handleExportPrompt = async (platform: string) => { try { const exportData = await exportPersonaPrompt(1, platform); setExportedPrompt(exportData.hardened_system_prompt); setShowExportDialog(true); } catch (err: any) { setError(err.message); } }; const copyToClipboard = (text: string) => { navigator.clipboard.writeText(text); }; const getPlatformIcon = (platform: string) => { const icons: { [key: string]: React.ReactElement } = { twitter: , linkedin: , instagram: , facebook: , blog:
, medium:
, substack: }; return icons[platform] ||
; }; const getDataSufficiencyColor = (score: number) => { if (score >= 80) return 'success'; if (score >= 60) return 'warning'; return 'error'; }; const getConfidenceColor = (score: number) => { if (score >= 85) return 'success'; if (score >= 70) return 'warning'; return 'error'; }; return ( {error && ( setError(null)}> {error} )} {/* Readiness Check */} setActiveAccordion(activeAccordion === 'readiness' ? '' : 'readiness')} > }> Persona Generation Readiness {readinessData && ( )} {readinessData ? ( Data Sufficiency {readinessData.data_sufficiency.toFixed(1)}% Status {readinessData.ready ? ( ) : ( )} {readinessData.message} {readinessData.missing_steps.length > 0 && ( Missing Required Data: {readinessData.missing_steps.map((step, index) => ( ))} )} {readinessData.recommendations && readinessData.recommendations.length > 0 && ( Recommendations: {readinessData.recommendations.map((rec, index) => ( ))} )} ) : ( )} {/* Preview Results */} {previewData && ( setActiveAccordion(activeAccordion === 'preview' ? '' : 'preview')} > }> Persona Preview {/* Identity */} Persona Identity {previewData.preview.identity.persona_name} Archetype: {previewData.preview.identity.archetype} {previewData.preview.identity.core_belief} {/* Linguistic Fingerprint */} Writing Style Sentence Length: {previewData.preview.linguistic_fingerprint.sentence_metrics?.average_sentence_length_words || 'N/A'} words avg Tone: {previewData.preview.tonal_range?.default_tone || 'N/A'} Voice: {previewData.preview.linguistic_fingerprint.sentence_metrics?.preferred_sentence_type || 'N/A'} {/* Sample Platform */} Sample Platform Adaptation: {previewData.preview.sample_platform.platform} This shows how your persona will be adapted for different platforms. )} {/* Generation Results */} {generationResult && ( setActiveAccordion(activeAccordion === 'result' ? '' : 'result')} > }> Persona Generated Successfully {/* Generation Summary */} Generation Summary Confidence Score: {generationResult.confidence_score?.toFixed(1)}% Data Sufficiency: {generationResult.data_sufficiency?.toFixed(1)}% Platforms Generated: {generationResult.platforms_generated?.length || 0} {/* Platform Support */} Platform Support {generationResult.platforms_generated?.map((platform) => ( ))} {/* Export Options */} Export Persona for External Use Export hardened persona prompts for use in other AI systems (ChatGPT, Claude, etc.) {supportedPlatforms.slice(0, 4).map((platform) => ( ))} )} {/* Loading State */} {loading && !readinessData && ( Analyzing your onboarding data... )} {/* Action Buttons */} {readinessData && !generationResult && ( {readinessData.ready ? ( <> {!previewData && ( )} ) : ( {readinessData.message} Please complete the missing onboarding steps to generate your writing persona. )} )} {/* Export Dialog */} setShowExportDialog(false)} maxWidth="md" fullWidth > Hardened Persona Prompt Copy this prompt into any AI system to replicate your writing persona: {exportedPrompt} ); }; export default PersonaGenerationStep;