import { useState, useEffect } from 'react'; import PageMeta from '../../components/common/PageMeta'; import { useToast } from '../../components/ui/toast/ToastContainer'; import { fetchContent, Content as ContentType } from '../../services/api'; import Badge from '../../components/ui/badge/Badge'; import HTMLContentRenderer from '../../components/common/HTMLContentRenderer'; const statusColors: Record = { draft: 'warning', review: 'info', published: 'success', }; export default function Content() { const toast = useToast(); const [content, setContent] = useState([]); const [loading, setLoading] = useState(true); const [expandedId, setExpandedId] = useState(null); useEffect(() => { loadContent(); }, []); const loadContent = async () => { try { setLoading(true); const response = await fetchContent(); setContent(response.results || []); } catch (error: any) { toast.error(`Failed to load content: ${error.message}`); } finally { setLoading(false); } }; const formatDate = (value: string) => new Date(value).toLocaleString(undefined, { year: 'numeric', month: 'short', day: 'numeric', hour: 'numeric', minute: 'numeric', }); const getList = (primary?: string[], fallback?: any): string[] => { if (primary && primary.length > 0) return primary; if (!fallback) return []; if (Array.isArray(fallback)) return fallback; return []; }; const renderBadgeList = (items: string[], emptyLabel = '-') => { if (!items || items.length === 0) { return {emptyLabel}; } return (
{items.map((item, index) => ( {item} ))}
); }; return (

Content

Review AI-generated drafts and metadata

{loading ? (
Loading...
) : content.length === 0 ? (
No content generated yet. Run an AI content job to see drafts here.
) : (
{content.map((item) => { const isExpanded = expandedId === item.id; const secondaryKeywords = getList( item.secondary_keywords, item.metadata?.secondary_keywords ); const tags = getList(item.tags, item.metadata?.tags); const categories = getList(item.categories, item.metadata?.categories); return ( ); })}
Title Primary Keyword Secondary Keywords Tags Categories Word Count Status Generated Content
{item.meta_title || item.title || item.task_title || `Task #${item.task}`}
{(() => { let metaDesc = item.meta_description; // If meta_description is a JSON string, extract the actual value if (metaDesc && typeof metaDesc === 'string' && metaDesc.trim().startsWith('{')) { try { const parsed = JSON.parse(metaDesc); metaDesc = parsed.meta_description || metaDesc; } catch { // Not valid JSON, use as-is } } return metaDesc ? (
{metaDesc}
) : null; })()}
{item.primary_keyword ? ( {item.primary_keyword} ) : ( - )} {renderBadgeList(secondaryKeywords)} {renderBadgeList(tags)} {renderBadgeList(categories)} {item.word_count?.toLocaleString?.() ?? '-'} {item.status?.replace('_', ' ') || 'draft'} {formatDate(item.generated_at)}
)} {content.map((item) => expandedId === item.id ? (

{item.meta_title || item.title || `Task #${item.task}`}

Generated {formatDate(item.generated_at)} • Task #{item.task}

) : null )}
); }