From e330ac3871891552f4ad99ef0696b213dbaa3587 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9D=D0=B8=D0=BA=20=28Claude=29?= Date: Wed, 10 Jun 2026 15:22:45 +0300 Subject: [PATCH] =?UTF-8?q?feat:=20=D0=B2=D0=BA=D0=BB=D0=B0=D0=B4=D0=BA?= =?UTF-8?q?=D0=B0=20=D0=9F=D0=BE=D0=B4=D0=BA=D0=BB=D1=8E=D1=87=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20=D0=B2=20ChannelEdit=20(bot=20token,=20TG=20chan?= =?UTF-8?q?nel=20id,=20VK=20token)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/ChannelEdit.js | 68 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 65 insertions(+), 3 deletions(-) diff --git a/components/ChannelEdit.js b/components/ChannelEdit.js index 27dbecf..37d464e 100644 --- a/components/ChannelEdit.js +++ b/components/ChannelEdit.js @@ -2,7 +2,7 @@ import { useState } from 'react'; import { useRouter } from 'next/navigation'; import Link from 'next/link'; -import { ArrowLeft, Save, Trash2, Loader2, Image as ImageIcon, Type, Palette, Plus, X, Sparkles } from 'lucide-react'; +import { ArrowLeft, Save, Trash2, Loader2, Image as ImageIcon, Type, Palette, Plus, X, Sparkles, Plug } from 'lucide-react'; const GOALS = [ { v: 'educational', label: 'Обучение', desc: 'Объясняем, разбираем' }, @@ -61,8 +61,9 @@ const IMAGE_PALETTES = [ ]; const TABS = [ - { id: 'content', label: 'Контент', icon: Type }, - { id: 'images', label: 'Картинки', icon: ImageIcon }, + { id: 'content', label: 'Контент', icon: Type }, + { id: 'images', label: 'Картинки', icon: ImageIcon }, + { id: 'connect', label: 'Подключение', icon: Plug }, ]; export default function ChannelEdit({ channel }) { @@ -95,6 +96,14 @@ export default function ChannelEdit({ channel }) { const [imageCustomColors, setImageCustomColors] = useState(style.image_custom_colors || ''); const [imagePromptInstructions, setImagePromptInstructions] = useState(style.image_prompt_instructions || ''); + // Подключение + const [botToken, setBotToken] = useState(channel.bot_token || ''); + const [tgChannelId, setTgChannelId] = useState(channel.tg_channel_id || ''); + const [tgUsername, setTgUsername] = useState(channel.tg_username || ''); + const [vkToken, setVkToken] = useState(channel.vk_access_token || ''); + const [tokenVerifying, setTokenVerifying] = useState(false); + const [tokenStatus, setTokenStatus] = useState(null); // null | 'ok' | 'error' + const [saving, setSaving] = useState(false); const [deleting, setDeleting] = useState(false); const [error, setError] = useState(''); @@ -106,6 +115,10 @@ export default function ChannelEdit({ channel }) { try { const data = { name, niche, audience, goal: goals.join(','), language, + bot_token: botToken.trim() || null, + tg_channel_id: tgChannelId.trim() || null, + tg_username: tgUsername.trim() || null, + vk_access_token: vkToken.trim() || null, style: { tone, formality, humor, post_length: postLength, @@ -417,6 +430,55 @@ export default function ChannelEdit({ channel }) { )} )} + + {/* TAB: Подключение */} + {tab === 'connect' && ( +
+
+
+ ✈️ +

Telegram

+
+
+
Как подключить:
+
1. Создай бота через @BotFather/newbot → скопируй токен
+
2. Добавь бота администратором в свой канал (права: публикация сообщений)
+
3. Узнай ID канала: перешли любое сообщение из канала боту @userinfobot
+
+
+ + { setBotToken(e.target.value); setTokenStatus(null); }} type="password" /> +
+
+
+ + setTgChannelId(e.target.value)} /> +
Начинается с -100
+
+
+ + setTgUsername(e.target.value)} /> +
Необязательно если заполнен ID
+
+
+
+
+
+ 🅱️ +

ВКонтакте

+
+
+ + setVkToken(e.target.value)} type="password" /> +
Управление → API → Ключи доступа → Создать ключ (права: wall, photos)
+
+
+
+ )} ); }