'use client'; import { useState, useEffect } from 'react'; import type { VideoSource } from '@/lib/types'; interface AddSourceModalProps { isOpen: boolean; onClose: () => void; onAdd: (source: VideoSource) => void; existingIds: string[]; } export function AddSourceModal({ isOpen, onClose, onAdd, existingIds }: AddSourceModalProps) { const [name, setName] = useState(''); const [url, setUrl] = useState(''); const [error, setError] = useState(''); useEffect(() => { if (isOpen) { setName(''); setUrl(''); setError(''); } }, [isOpen]); const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); setError(''); if (!name.trim() || !url.trim()) { setError('请填写所有字段'); return; } try { new URL(url); } catch { setError('请输入有效的 URL'); return; } const id = name.toLowerCase().replace(/[^a-z0-9]/g, '-'); if (existingIds.includes(id)) { setError('此源名称已存在'); return; } const newSource: VideoSource = { id, name: name.trim(), baseUrl: url.trim(), searchPath: '', detailPath: '', enabled: true, priority: existingIds.length + 1, }; onAdd(newSource); onClose(); }; if (!isOpen) return null; return ( <> {/* Backdrop */}
{/* Modal */}

添加自定义源

setName(e.target.value)} placeholder="例如:新视频源" className="w-full bg-[var(--glass-bg)] backdrop-blur-md border border-[var(--glass-border)] rounded-[var(--radius-2xl)] px-4 py-3 text-[var(--text-color)] placeholder:text-[var(--text-color-secondary)] focus:outline-none focus:border-[var(--accent-color)] focus:ring-4 focus:ring-[color-mix(in_srgb,var(--accent-color)_30%,transparent)] transition-all duration-[0.4s]" />
setUrl(e.target.value)} placeholder="https://example.com/api.php/provide/vod" className="w-full bg-[var(--glass-bg)] backdrop-blur-md border border-[var(--glass-border)] rounded-[var(--radius-2xl)] px-4 py-3 text-[var(--text-color)] placeholder:text-[var(--text-color-secondary)] focus:outline-none focus:border-[var(--accent-color)] focus:ring-4 focus:ring-[color-mix(in_srgb,var(--accent-color)_30%,transparent)] transition-all duration-[0.4s]" />
{error && (
{error}
)}
); }