"use client"; import { useState, useEffect } from "react"; import { Card, CardHeader, CardTitle, CardDescription, CardContent, Button, FormField, FormInput, Icon } from "@/app/components/ui"; import { useTranslation } from "@/lib/i18n/context"; export const DEFAULT_EVENTS = { scan_completed: true, scan_failed: true, scan_cancelled: true, thumbnail_completed: true, thumbnail_failed: true, conversion_completed: true, conversion_failed: true, metadata_approved: true, metadata_batch_completed: true, metadata_batch_failed: true, metadata_refresh_completed: true, metadata_refresh_failed: true, }; export function TelegramCard({ handleUpdateSetting }: { handleUpdateSetting: (key: string, value: unknown) => Promise }) { const { t } = useTranslation(); const [botToken, setBotToken] = useState(""); const [chatId, setChatId] = useState(""); const [enabled, setEnabled] = useState(false); const [events, setEvents] = useState(DEFAULT_EVENTS); const [isTesting, setIsTesting] = useState(false); const [testResult, setTestResult] = useState<{ success: boolean; message: string } | null>(null); const [showHelp, setShowHelp] = useState(false); useEffect(() => { fetch("/api/settings/telegram") .then((r) => (r.ok ? r.json() : null)) .then((data) => { if (data) { if (data.bot_token) setBotToken(data.bot_token); if (data.chat_id) setChatId(data.chat_id); if (data.enabled !== undefined) setEnabled(data.enabled); if (data.events) setEvents({ ...DEFAULT_EVENTS, ...data.events }); } }) .catch(() => {}); }, []); function saveTelegram(token?: string, chat?: string, en?: boolean, ev?: typeof events) { handleUpdateSetting("telegram", { bot_token: token ?? botToken, chat_id: chat ?? chatId, enabled: en ?? enabled, events: ev ?? events, }); } async function handleTestConnection() { setIsTesting(true); setTestResult(null); try { const resp = await fetch("/api/telegram/test"); const data = await resp.json(); if (data.error) { setTestResult({ success: false, message: data.error }); } else { setTestResult(data); } } catch { setTestResult({ success: false, message: "Failed to connect" }); } finally { setIsTesting(false); } } return ( {t("settings.telegram")} {t("settings.telegramDesc")}
{/* Setup guide */}
{showHelp && (

1. Bot Token

2. Chat ID

3. Group chat

)}
{t("settings.telegramEnabled")}
setBotToken(e.target.value)} onBlur={() => saveTelegram()} />
setChatId(e.target.value)} onBlur={() => saveTelegram()} />
{/* Event toggles grouped by category */}

{t("settings.telegramEvents")}

{([ { category: t("settings.eventCategoryScan"), icon: "search" as const, items: [ { key: "scan_completed" as const, label: t("settings.eventCompleted") }, { key: "scan_failed" as const, label: t("settings.eventFailed") }, { key: "scan_cancelled" as const, label: t("settings.eventCancelled") }, ], }, { category: t("settings.eventCategoryThumbnail"), icon: "image" as const, items: [ { key: "thumbnail_completed" as const, label: t("settings.eventCompleted") }, { key: "thumbnail_failed" as const, label: t("settings.eventFailed") }, ], }, { category: t("settings.eventCategoryConversion"), icon: "refresh" as const, items: [ { key: "conversion_completed" as const, label: t("settings.eventCompleted") }, { key: "conversion_failed" as const, label: t("settings.eventFailed") }, ], }, { category: t("settings.eventCategoryMetadata"), icon: "tag" as const, items: [ { key: "metadata_approved" as const, label: t("settings.eventLinked") }, { key: "metadata_batch_completed" as const, label: t("settings.eventBatchCompleted") }, { key: "metadata_batch_failed" as const, label: t("settings.eventBatchFailed") }, { key: "metadata_refresh_completed" as const, label: t("settings.eventRefreshCompleted") }, { key: "metadata_refresh_failed" as const, label: t("settings.eventRefreshFailed") }, ], }, ]).map(({ category, icon, items }) => (

{category}

{items.map(({ key, label }) => (
))}
{testResult && ( {testResult.message} )}
); }