import React, { useState } from 'react'; import { Box, Typography, TextField, Button, Alert, CircularProgress, Card, CardContent, Grid, Chip, Accordion, AccordionSummary, AccordionDetails, Divider, IconButton, Tooltip } from '@mui/material'; import { apiClient } from '../../api/client'; import { ExpandMore as ExpandMoreIcon, ContentCopy as CopyIcon, CheckCircle as CheckIcon, Error as ErrorIcon, Info as InfoIcon } from '@mui/icons-material'; import { useOnboardingStyles } from './common/useOnboardingStyles'; interface StyleDetectionStepProps { onContinue: () => void; } interface StyleAnalysis { writing_style?: { tone: string; voice: string; complexity: string; engagement_level: string; }; content_characteristics?: { sentence_structure: string; vocabulary_level: string; paragraph_organization: string; content_flow: string; }; target_audience?: { demographics: string[]; expertise_level: string; industry_focus: string; geographic_focus: string; }; recommended_settings?: { writing_tone: string; target_audience: string; content_type: string; creativity_level: string; geographic_location: string; }; } const StyleDetectionStep: React.FC = ({ onContinue }) => { const classes = useOnboardingStyles(); const [url, setUrl] = useState(''); const [textSample, setTextSample] = useState(''); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); const [success, setSuccess] = useState(null); const [analysis, setAnalysis] = useState(null); const [activeTab, setActiveTab] = useState<'url' | 'text'>('url'); const handleAnalyze = async () => { setError(null); setSuccess(null); setLoading(true); try { // Validate and fix URL format if using URL tab let requestUrl = url; if (activeTab === 'url') { const fixedUrl = fixUrlFormat(url); if (!fixedUrl) { setError('Please enter a valid website URL (starting with http:// or https://)'); setLoading(false); return; } requestUrl = fixedUrl; } const requestData = { url: activeTab === 'url' ? requestUrl : undefined, text_sample: activeTab === 'text' ? textSample : undefined, include_patterns: true, include_guidelines: true }; const response = await apiClient.post('/api/onboarding/style-detection/complete', requestData); if (response.data.success) { setAnalysis(response.data.style_analysis); setSuccess('Style analysis completed successfully!'); } else { setError(response.data.error || 'Analysis failed'); } } catch (err) { setError('Failed to analyze content. Please try again.'); } finally { setLoading(false); } }; const fixUrlFormat = (url: string): string | null => { if (!url) return null; // Remove leading/trailing whitespace let fixedUrl = url.trim(); // Check if URL already has a protocol but is missing slashes if (fixedUrl.startsWith('https:/') && !fixedUrl.startsWith('https://')) { fixedUrl = fixedUrl.replace('https:/', 'https://'); } else if (fixedUrl.startsWith('http:/') && !fixedUrl.startsWith('http://')) { fixedUrl = fixedUrl.replace('http:/', 'http://'); } // Add protocol if missing if (!fixedUrl.startsWith('http://') && !fixedUrl.startsWith('https://')) { fixedUrl = 'https://' + fixedUrl; } // Fix missing slash after protocol if (fixedUrl.includes('://') && !fixedUrl.split('://')[1].startsWith('/')) { fixedUrl = fixedUrl.replace('://', ':///'); } // Ensure only two slashes after protocol if (fixedUrl.includes(':///')) { fixedUrl = fixedUrl.replace(':///', '://'); } // Basic URL validation try { new URL(fixedUrl); return fixedUrl; } catch { return null; } }; const handleContinue = () => { if (analysis) { onContinue(); } else { setError('Please complete style analysis before continuing'); } }; const copyToClipboard = (text: string) => { navigator.clipboard.writeText(text); }; const renderAnalysisSection = (title: string, data: any, icon: React.ReactNode) => ( }> {icon} {title} {Object.entries(data).map(([key, value]) => ( {key.replace(/_/g, ' ').replace(/\b\w/g, l => l.toUpperCase())} {Array.isArray(value) ? value.join(', ') : String(value)} ))} ); return ( 🎨 Style Detection Analyze your writing style to get personalized content generation recommendations. Content Source {activeTab === 'url' ? ( setUrl(e.target.value)} placeholder="https://yourwebsite.com" helperText="Enter your website URL to analyze your content style" margin="normal" /> ) : ( setTextSample(e.target.value)} placeholder="Paste your content samples here..." helperText="Provide 2-3 samples of your best content (min 50 characters)" margin="normal" /> )} {error && ( {error} )} {success && ( {success} )} {analysis && ( Style Analysis Results {analysis.writing_style && renderAnalysisSection( 'Writing Style', analysis.writing_style, )} {analysis.content_characteristics && renderAnalysisSection( 'Content Characteristics', analysis.content_characteristics, )} {analysis.target_audience && renderAnalysisSection( 'Target Audience', analysis.target_audience, )} {analysis.recommended_settings && renderAnalysisSection( 'Recommended Settings', analysis.recommended_settings, )} )} ); }; export default StyleDetectionStep;