// 设置向导各步骤表单组件 import { ExternalLink, Eye, EyeOff, X } from 'lucide-react' import { useState } from 'react' import { useTranslation } from 'react-i18next' import { Badge } from '@/components/ui/badge' import { Button } from '@/components/ui/button' import { Input } from '@/components/ui/input' import { Label } from '@/components/ui/label' import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from '@/components/ui/select' import { Separator } from '@/components/ui/separator' import { Switch } from '@/components/ui/switch' import { Textarea } from '@/components/ui/textarea' import type { BotBasicConfig, EmojiConfig, OtherBasicConfig, PersonalityConfig, SiliconFlowConfig, } from './types' // ====== 步骤1:Bot基础配置 ====== const KNOWN_PLATFORMS: Record = { qq: 'qq', telegram: 'telegram', tg: 'telegram', discord: 'discord', kook: 'kook', } const PLATFORM_OPTIONS = ['qq', 'telegram', 'discord', 'kook', 'custom'] as const function normalizePlatform(raw: string): string { const key = raw.trim().toLowerCase() return KNOWN_PLATFORMS[key] || key } function deriveSelectedPlatform(config: BotBasicConfig): { selected: string; customName: string } { const platform = config.platform // Legacy: no platform set but has QQ account if (!platform && config.qq_account > 0) { return { selected: 'qq', customName: '' } } if (!platform) { return { selected: '', customName: '' } } const known = PLATFORM_OPTIONS.find((value) => value === platform && value !== 'custom') if (known) { return { selected: platform, customName: '' } } return { selected: 'custom', customName: platform } } function upsertPlatformAccount( platforms: string[], platformName: string, accountId: string ): string[] { const normalized = normalizePlatform(platformName) const filtered = platforms.filter((platform) => { const prefix = platform.split(':')[0] return normalizePlatform(prefix) !== normalized }) if (accountId.trim()) { filtered.push(`${normalized}:${accountId.trim()}`) } return filtered } function getPrimaryAccount(platforms: string[], platformName: string): string { const normalized = normalizePlatform(platformName) const entry = platforms.find((platform) => { const prefix = platform.split(':')[0] return normalizePlatform(prefix) === normalized }) return entry ? entry.split(':').slice(1).join(':') : '' } interface BotBasicFormProps { config: BotBasicConfig onChange: (config: BotBasicConfig) => void } export function BotBasicForm({ config, onChange }: BotBasicFormProps) { const { t } = useTranslation() const derived = deriveSelectedPlatform(config) const [selectedPlatformOverride, setSelectedPlatformOverride] = useState(null) const [customPlatformNameOverride, setCustomPlatformNameOverride] = useState(null) const selectedPlatform = selectedPlatformOverride ?? derived.selected const customPlatformName = customPlatformNameOverride ?? derived.customName const primaryAccount = selectedPlatform === 'qq' ? config.qq_account > 0 ? String(config.qq_account) : '' : config.platform ? getPrimaryAccount(config.platforms, config.platform) : '' const platformOptions = [ { value: 'qq', label: 'QQ' }, { value: 'telegram', label: 'Telegram' }, { value: 'discord', label: 'Discord' }, { value: 'kook', label: 'Kook' }, { value: 'custom', label: t('setupPage.forms.botBasic.platform.options.custom') }, ] const handlePlatformChange = (value: string) => { setSelectedPlatformOverride(value) const realPlatform = value === 'custom' ? customPlatformName : value onChange({ ...config, platform: normalizePlatform(realPlatform), qq_account: value === 'qq' ? config.qq_account : config.qq_account, }) } const handleCustomNameChange = (name: string) => { setCustomPlatformNameOverride(name) const normalized = normalizePlatform(name) const nextPlatforms = primaryAccount ? upsertPlatformAccount(config.platforms, normalized, primaryAccount) : config.platforms onChange({ ...config, platform: normalized, platforms: nextPlatforms, }) } const handleAccountChange = (accountId: string) => { const realPlatform = selectedPlatform === 'custom' ? customPlatformName : selectedPlatform const normalized = normalizePlatform(realPlatform) if (normalized === 'qq') { onChange({ ...config, qq_account: Number(accountId) || 0, platform: 'qq', }) } else { onChange({ ...config, platform: normalized, platforms: upsertPlatformAccount(config.platforms, normalized, accountId), }) } } const handleAddAlias = (alias: string) => { if (alias.trim() && !config.alias_names.includes(alias.trim())) { onChange({ ...config, alias_names: [...config.alias_names, alias.trim()], }) } } const handleRemoveAlias = (index: number) => { onChange({ ...config, alias_names: config.alias_names.filter((_, aliasIndex) => aliasIndex !== index), }) } return (

{t('setupPage.forms.botBasic.platform.description')}

{selectedPlatform === 'custom' && (
handleCustomNameChange(e.target.value)} />
)} {selectedPlatform === 'qq' && (
handleAccountChange(e.target.value)} />

{t('setupPage.forms.botBasic.qqAccount.description')}

)} {selectedPlatform && selectedPlatform !== 'qq' && (selectedPlatform !== 'custom' || customPlatformName) && (
handleAccountChange(e.target.value)} />

{t('setupPage.forms.botBasic.primaryAccount.description')}

)}
onChange({ ...config, nickname: e.target.value })} />

{t('setupPage.forms.botBasic.nickname.description')}

{config.alias_names.map((alias, index) => ( {alias} ))}
{ if (e.key === 'Enter') { handleAddAlias((e.target as HTMLInputElement).value) ;(e.target as HTMLInputElement).value = '' } }} />

{t('setupPage.forms.botBasic.alias.description')}

) } // ====== 步骤2:人格配置 ====== interface PersonalityFormProps { config: PersonalityConfig onChange: (config: PersonalityConfig) => void } export function PersonalityForm({ config, onChange }: PersonalityFormProps) { const { t } = useTranslation() return (