import React, { useState, useEffect, useRef } from 'react'; import { Plus, Search, Play, Copy, Trash2, Edit2, Mic, MessageSquare, Save, Video, PhoneOff, Camera, ArrowLeftRight, Send, Phone, MoreHorizontal, Rocket, AlertTriangle } from 'lucide-react'; import { Button, Input, Card, Badge, Drawer, Dialog } from '../components/UI'; import { mockAssistants, mockKnowledgeBases } from '../services/mockData'; import { Assistant, TabValue } from '../types'; import { GoogleGenAI } from "@google/genai"; export const AssistantsPage: React.FC = () => { const [assistants, setAssistants] = useState(mockAssistants); const [searchTerm, setSearchTerm] = useState(''); const [selectedId, setSelectedId] = useState(null); const [activeTab, setActiveTab] = useState(TabValue.GLOBAL); const [debugOpen, setDebugOpen] = useState(false); const [hotwordInput, setHotwordInput] = useState(''); // State for delete confirmation dialog const [deleteId, setDeleteId] = useState(null); const selectedAssistant = assistants.find(a => a.id === selectedId) || null; const filteredAssistants = assistants.filter(a => a.name.toLowerCase().includes(searchTerm.toLowerCase()) ); const handleCreate = () => { const newId = Date.now().toString(); const newAssistant: Assistant = { id: newId, name: 'New Assistant', callCount: 0, opener: '', prompt: '', knowledgeBaseId: '', language: 'zh', voice: 'default', speed: 1, hotwords: [] }; setAssistants([...assistants, newAssistant]); setSelectedId(newId); }; const handleCopy = (e: React.MouseEvent, assistant: Assistant) => { e.stopPropagation(); const newAssistant = { ...assistant, id: Date.now().toString(), name: `${assistant.name} (Copy)` }; setAssistants([...assistants, newAssistant]); }; const handleDeleteClick = (e: React.MouseEvent, id: string) => { e.stopPropagation(); setDeleteId(id); }; const confirmDelete = () => { if (deleteId) { setAssistants(prev => prev.filter(a => a.id !== deleteId)); if (selectedId === deleteId) setSelectedId(null); setDeleteId(null); } }; const updateAssistant = (field: keyof Assistant, value: any) => { if (!selectedId) return; setAssistants(prev => prev.map(a => a.id === selectedId ? { ...a, [field]: value } : a)); }; const addHotword = () => { if (hotwordInput.trim() && selectedAssistant) { updateAssistant('hotwords', [...selectedAssistant.hotwords, hotwordInput.trim()]); setHotwordInput(''); } }; const removeHotword = (word: string) => { if (selectedAssistant) { updateAssistant('hotwords', selectedAssistant.hotwords.filter(w => w !== word)); } }; return (
{/* LEFT COLUMN: List */}

小助手列表

setSearchTerm(e.target.value)} />
{filteredAssistants.map(assistant => (
setSelectedId(assistant.id)} className={`group relative flex flex-col p-4 rounded-xl border transition-all cursor-pointer ${ selectedId === assistant.id ? 'bg-primary/10 border-primary/40 shadow-[0_0_15px_rgba(6,182,212,0.15)]' : 'bg-card/30 border-white/5 hover:bg-white/5 hover:border-white/10' }`} >
{assistant.name}
{assistant.callCount} 次通话
{/* Hover Actions */}
))} {filteredAssistants.length === 0 && (
未找到小助手
)}
{/* RIGHT COLUMN: Config Panel */}
{selectedAssistant ? ( <> {/* Header Area */}
{/* Row 1: Name and Actions - Aligned with items-end */}
updateAssistant('name', e.target.value)} className="font-bold bg-white/5 border-white/10 focus:border-primary/50 text-base" />
{/* Row 2: Tabs */}
{/* Content Scroll Area */}
{activeTab === TabValue.GLOBAL ? (
updateAssistant('opener', e.target.value)} placeholder="例如:您好,我是您的专属AI助手..." className="bg-white/5 border-white/10 focus:border-primary/50" />

接通通话后的第一句话。