import { useState, useEffect, useCallback } from 'react'; import { useNavigate } from 'react-router-dom'; import PageMeta from '../../components/common/PageMeta'; import PageHeader from '../../components/common/PageHeader'; import ModuleNavigationTabs from '../../components/navigation/ModuleNavigationTabs'; import { optimizerApi, EntryPoint } from '../../api/optimizer.api'; import { fetchContent, Content as ContentType } from '../../services/api'; import { useToast } from '../../components/ui/toast/ToastContainer'; import { SourceBadge, ContentSource } from '../../components/content/SourceBadge'; import { ContentFilter, FilterState } from '../../components/content/ContentFilter'; import { OptimizationScores } from '../../components/optimizer/OptimizationScores'; import { BoltIcon, CheckCircleIcon, FileIcon } from '../../icons'; import { useSectorStore } from '../../store/sectorStore'; import { usePageSizeStore } from '../../store/pageSizeStore'; import Select from '../../components/form/Select'; import Checkbox from '../../components/form/input/Checkbox'; import Button from '../../components/ui/button/Button'; export default function OptimizerContentSelector() { const navigate = useNavigate(); const toast = useToast(); const { activeSector } = useSectorStore(); const { pageSize } = usePageSizeStore(); const [content, setContent] = useState([]); const [filteredContent, setFilteredContent] = useState([]); const [loading, setLoading] = useState(true); const [processing, setProcessing] = useState([]); const [selectedIds, setSelectedIds] = useState([]); const [filters, setFilters] = useState({ source: 'all', search: '', }); const [entryPoint, setEntryPoint] = useState('auto'); const [currentPage, setCurrentPage] = useState(1); const [totalCount, setTotalCount] = useState(0); const loadContent = useCallback(async () => { setLoading(true); try { const data = await fetchContent({ page: currentPage, page_size: pageSize, sector_id: activeSector?.id, }); setContent(data.results || []); setTotalCount(data.count || 0); } catch (error: any) { console.error('Error loading content:', error); toast.error(`Failed to load content: ${error.message}`); } finally { setLoading(false); } }, [currentPage, pageSize, activeSector, toast]); useEffect(() => { loadContent(); }, [loadContent]); // Apply filters useEffect(() => { let filtered = [...content]; // Search filter if (filters.search) { const searchLower = filters.search.toLowerCase(); filtered = filtered.filter( item => item.title?.toLowerCase().includes(searchLower) || item.meta_title?.toLowerCase().includes(searchLower) || item.primary_keyword?.toLowerCase().includes(searchLower) ); } // Source filter if (filters.source !== 'all') { filtered = filtered.filter(item => item.source === filters.source); } setFilteredContent(filtered); }, [content, filters]); const handleOptimize = async (contentId: number) => { try { setProcessing(prev => [...prev, contentId]); const result = await optimizerApi.optimize(contentId, entryPoint); toast.success(`Content optimized! Score: ${result.scores_after.overall_score.toFixed(1)}`); // Refresh content list await loadContent(); } catch (error: any) { console.error('Error optimizing content:', error); toast.error(`Failed to optimize content: ${error.message}`); } finally { setProcessing(prev => prev.filter(id => id !== contentId)); } }; const handleBatchOptimize = async () => { if (selectedIds.length === 0) { toast.error('Please select at least one content item'); return; } try { setProcessing(selectedIds); const result = await optimizerApi.batchOptimize(selectedIds, entryPoint); toast.success( `Optimized ${result.succeeded} content item${result.succeeded !== 1 ? 's' : ''}. ` + `${result.failed > 0 ? `${result.failed} failed.` : ''}` ); setSelectedIds([]); await loadContent(); } catch (error: any) { console.error('Error batch optimizing content:', error); toast.error(`Failed to optimize content: ${error.message}`); } finally { setProcessing([]); } }; const toggleSelection = (contentId: number) => { setSelectedIds(prev => prev.includes(contentId) ? prev.filter(id => id !== contentId) : [...prev, contentId] ); }; const toggleSelectAll = () => { if (selectedIds.length === filteredContent.length) { setSelectedIds([]); } else { setSelectedIds(filteredContent.map(item => item.id)); } }; return ( <>
, color: 'orange', }} navigation={ }, ]} />} />