import { useMemo, useState } from 'react'; import { useTranslation } from 'react-i18next'; import { Alert, Button, Input, Select, Space, Switch, Tabs } from 'antd'; import { BellOutlined, SendOutlined, SettingOutlined } from '@ant-design/icons'; import { HttpUtil, LanguageManager } from '@/utils'; import type { AllSetting } from '@/models/setting'; import { SettingListItem } from '@/components/ui'; import { DiscordNotifications } from '@/components/ui/notifications/DiscordNotifications'; import { useMediaQuery } from '@/hooks/useMediaQuery'; import { catTabLabel } from './catTabLabel'; import { NotifyTimeField } from './NotifyTimeField'; import SecretInput from './SecretInput'; interface DiscordTabProps { allSetting: AllSetting; updateSetting: (patch: Partial) => void; } interface DiscordTestResult { success: boolean; msg: string; } export default function DiscordTab({ allSetting, updateSetting }: DiscordTabProps) { const { t } = useTranslation(); const { isMobile } = useMediaQuery(); const [testLoading, setTestLoading] = useState(false); const [testResult, setTestResult] = useState(null); async function handleTestDiscord() { setTestLoading(true); setTestResult(null); try { const res = (await HttpUtil.post('/panel/api/setting/testDiscord')) as DiscordTestResult; setTestResult(res); } catch (e: unknown) { setTestResult({ success: false, msg: e instanceof Error ? e.message : t('pages.settings.requestFailed'), }); } finally { setTestLoading(false); } } const langOptions = useMemo( () => LanguageManager.supportedLanguages.map( (l: { value: string; name: string; icon: string }) => ({ value: l.value, label: ( <> {l.icon}   {l.name} ), }), ), [], ); return ( , t('pages.settings.panelSettings'), isMobile, ), children: ( <> updateSetting({ discordBotEnable: v })} /> updateSetting({ discordBotToken: v })} onClearArmedChange={(armed) => updateSetting({ clearDiscordBotToken: armed })} /> updateSetting({ discordChannelId: e.target.value })} style={{ width: '100%' }} /> updateSetting({ discordAdminIds: e.target.value })} style={{ width: '100%' }} />