import { useEffect, useState } from 'react'; import type { ChannelItem } from '../../../stores'; import DialogSurface from './DialogSurface'; type AddChannelDialogProps = { open: boolean; loading: boolean; availableChannels: ChannelItem[]; initialSelected: ChannelItem[]; onClose: () => void; onConfirm: (items: ChannelItem[]) => Promise; }; export default function AddChannelDialog({ open, loading, availableChannels, initialSelected, onClose, onConfirm, }: AddChannelDialogProps) { const [searchQuery, setSearchQuery] = useState(''); const [localSelected, setLocalSelected] = useState([]); const [error, setError] = useState(null); const [submitting, setSubmitting] = useState(false); useEffect(() => { if (!open) return; setSearchQuery(''); setError(null); setSubmitting(false); setLocalSelected(initialSelected.map((item) => ({ ...item }))); }, [open, initialSelected]); const query = searchQuery.trim().toLowerCase(); const existingChannelUrls = new Set(localSelected.map((item) => item.channelUrl)); const candidateChannels = availableChannels.filter((item) => !existingChannelUrls.has(item.channelUrl)); const filteredChannels = (query ? candidateChannels.filter((item) => ( item.channelName.toLowerCase().includes(query) || item.channelUrl.toLowerCase().includes(query) )) : candidateChannels) .slice(0, 8); function addChannel(item: ChannelItem): void { setLocalSelected((current) => { if (current.some((channel) => channel.channelUrl === item.channelUrl)) return current; return [...current, { ...item }]; }); setSearchQuery(''); } function removeChannel(id: string): void { setLocalSelected((current) => current.filter((item) => item.id !== id)); } async function handleConfirm(): Promise { setSubmitting(true); setError(null); try { await onConfirm(localSelected.map((item) => ({ ...item }))); } catch (confirmError) { setError(confirmError instanceof Error ? confirmError.message : String(confirmError)); setSubmitting(false); return; } setSubmitting(false); } return (
搜索添加渠道
setSearchQuery(event.target.value)} placeholder="输入渠道名称或链接" className="h-[48px] w-full rounded-[12px] border border-transparent bg-[#EDECE4] px-4 text-[14px] text-[#171717] outline-none transition-colors placeholder:text-[#99A0AE] focus:border-[#3B6DE8] dark:bg-[#222225] dark:text-[#f3f4f6]" />
{loading ? (
正在加载可用渠道...
) : filteredChannels.length > 0 ? (
{filteredChannels.map((item) => ( ))}
) : (
{availableChannels.length === 0 ? '暂无可用渠道,请先检查脚本配置。' : '没有匹配到可添加的渠道。'}
)}
已选渠道
{localSelected.length > 0 ? ( localSelected.map((item) => (
{item.channelName}
{item.channelUrl}
)) ) : (
未选择任何渠道
)}
{error ? (
{error}
) : null}
); }