diff --git a/app/admin/(protected)/drafts/page.js b/app/admin/(protected)/drafts/page.js index cba82c8..bc1da60 100644 --- a/app/admin/(protected)/drafts/page.js +++ b/app/admin/(protected)/drafts/page.js @@ -1,6 +1,7 @@ 'use client'; import { useState, useEffect, useCallback } from 'react'; -import { CheckCircle, RefreshCw, Pencil, Clock, ImageIcon, ChevronDown, ChevronUp, X, Save } from 'lucide-react'; +import { CheckCircle, RefreshCw, Pencil, Clock, ImageIcon, ChevronDown, ChevronUp, X, Save, BookOpen, Maximize2 } from 'lucide-react'; +import { marked } from 'marked'; const COVER_STYLES = [ { id: 'robot-workspace', name: '🤖 Робот за работой' }, @@ -12,10 +13,14 @@ const COVER_STYLES = [ ]; const CATEGORY_LABELS = { - 'ai-tools': '🤖 AI Tools', - 'cybersec': '🔒 Cybersec', - 'automation': '⚡ Automation', - 'ai-dev': '💻 AI Dev', + 'ai-tools': '🤖 AI Tools', + 'cybersec': '🔒 Cybersec', + 'automation': '⚡ Automation', + 'ai-dev': '💻 AI Dev', + 'digest': '🗞 Digest', + 'opinions': '💬 Opinions', + 'tutorials': '📘 Tutorials', + 'comparisons': '⚖️ Comparisons', }; function DraftCard({ draft, onApproved, onCoverRegenerated }) { @@ -29,6 +34,22 @@ function DraftCard({ draft, onApproved, onCoverRegenerated }) { const [selectedStyle, setSelectedStyle] = useState(''); const [coverUrl, setCoverUrl] = useState(draft.cover_url); const [msg, setMsg] = useState(''); + const [reading, setReading] = useState(false); + const [full, setFull] = useState(null); + const [readLoading, setReadLoading] = useState(false); + + async function openReader() { + setReading(true); + if (full) return; + setReadLoading(true); + try { + const r = await fetch(`/api/admin/drafts/${draft.id}`); + const d = await r.json(); + if (d && d.content) setFull(d); + else setMsg('❌ ' + (d.error || 'Не удалось загрузить текст')); + } catch { setMsg('❌ Ошибка сети'); } + setReadLoading(false); + } async function approve() { setLoading(true); setMsg(''); @@ -86,12 +107,16 @@ function DraftCard({ draft, onApproved, onCoverRegenerated }) { return (