feat: drafts UI — /drafts review page + batch generate button

/drafts page: список черновиков по статусам (pending/approved/rejected)
  Одобрить + выбрать время → scheduled_post в календарь
  Редактировать текст inline, отклонить, удалить
Header: ссылка 'Черновики' (FileText иконка)
ChannelView: кнопка 'Авто ×N' для batch-генерации (async)
ChannelEdit AI-стиль: секция авто-черновиков (toggle + count + time)
API routes: /api/drafts, /api/drafts/[id]/{approve,reject}
  /api/channels/[channelId]/drafts/generate
This commit is contained in:
Ник (Claude)
2026-06-12 23:48:17 +03:00
parent ab4e340db9
commit 5bf01ec394
9 changed files with 411 additions and 1 deletions
+27
View File
@@ -62,6 +62,8 @@ export default function ChannelView({ channel }) {
const [showPhotoSearch, setShowPhotoSearch] = useState(false);
const [showFromUrl, setShowFromUrl] = useState(false);
const [showPoll, setShowPoll] = useState(false);
const [batchCount, setBatchCount] = useState(3);
const [batchLoading, setBatchLoading] = useState(false);
// Трансформации
const [transforming, setTransforming] = useState(false);
@@ -400,6 +402,31 @@ export default function ChannelView({ channel }) {
Опрос
</button>
)}
{/* Batch-генерация черновиков */}
<div className="flex items-center gap-1">
<button
onClick={async () => {
setBatchLoading(true);
try {
const res = await fetch(`/api/channels/${channel.id}/drafts/generate?count=${batchCount}`, {
method: 'POST', headers: { 'Content-Type': 'application/json' },
}).then(r => r.json());
if (res.ok) alert(`✅ Генерирую ${batchCount} черновиков — через несколько минут появятся в /drafts`);
else alert(res.error || 'Ошибка');
} catch { alert('Ошибка'); }
setBatchLoading(false);
}}
disabled={batchLoading}
className="text-xs inline-flex items-center gap-1 text-purple-400 hover:text-purple-300 transition-colors"
>
<span>{batchLoading ? '⏳' : '⚡'}</span>
Авто ×
</button>
<select value={batchCount} onChange={e => setBatchCount(+e.target.value)}
className="text-xs bg-surface2 border border-border rounded px-1 py-0.5 text-gray-400">
{[1,2,3,5,7,10].map(n => <option key={n} value={n}>{n}</option>)}
</select>
</div>
<button
onClick={fetchIdeas}
disabled={loadingIdeas}