import React, { useState, useMemo } from 'react'; import { Sparkles, Tag, X } from 'lucide-react'; import { InspirationItem } from '../types'; import { InspirationCard } from './InspirationCard'; import { PageHeader } from './PageHeader'; import { ChatDialog } from './ChatDialog'; import { AddInspirationDialog } from './AddInspirationDialog'; interface InspirationViewProps { items: InspirationItem[]; onClose: () => void; onAdd?: (content: string, isVoice: boolean) => Promise; characterImageUrl?: string; onSendMessage: (message: string) => Promise; } // 标签颜色映射 const TAG_COLORS: Record = { '随想': 'bg-purple-100 text-purple-700 border-purple-200', '自然': 'bg-green-100 text-green-700 border-green-200', '设计': 'bg-pink-100 text-pink-700 border-pink-200', '创意': 'bg-orange-100 text-orange-700 border-orange-200', '生活': 'bg-blue-100 text-blue-700 border-blue-200', '提醒': 'bg-yellow-100 text-yellow-700 border-yellow-200', '工作': 'bg-indigo-100 text-indigo-700 border-indigo-200', '学习': 'bg-cyan-100 text-cyan-700 border-cyan-200', '友情': 'bg-rose-100 text-rose-700 border-rose-200', '成长': 'bg-lime-100 text-lime-700 border-lime-200', }; export const InspirationView: React.FC = ({ items, onClose, onAdd, characterImageUrl, onSendMessage }) => { const [isChatOpen, setIsChatOpen] = useState(false); const [isAddDialogOpen, setIsAddDialogOpen] = useState(false); const [selectedTags, setSelectedTags] = useState([]); const [isTagsExpanded, setIsTagsExpanded] = useState(false); const handleAddInspiration = async (content: string, isVoice: boolean) => { if (onAdd) { await onAdd(content, isVoice); } }; // 获取所有标签及其计数 const tagStats = useMemo(() => { const stats = new Map(); items.forEach(item => { item.tags.forEach(tag => { stats.set(tag, (stats.get(tag) || 0) + 1); }); }); return Array.from(stats.entries()) .map(([tag, count]) => ({ tag, count })) .sort((a, b) => b.count - a.count); }, [items]); // 筛选后的灵感 const filteredItems = useMemo(() => { if (selectedTags.length === 0) return items; return items.filter(item => selectedTags.some(tag => item.tags.includes(tag)) ); }, [items, selectedTags]); // 切换标签选择 const toggleTag = (tag: string) => { setSelectedTags(prev => prev.includes(tag) ? prev.filter(t => t !== tag) : [...prev, tag] ); }; // 清除所有筛选 const clearFilters = () => { setSelectedTags([]); }; return (
{/* Background Overlay */}
{/* 页面头部 */} setIsChatOpen(true)} characterImageUrl={characterImageUrl} /> {/* 标签筛选区域 - Notion 风格 */}
{/* 标签筛选标题 */}
{selectedTags.length > 0 && ( )}
{/* 标签列表 - 可折叠 */}
{tagStats.map(({ tag, count }) => { const isSelected = selectedTags.includes(tag); return ( ); })}
{/* 筛选结果统计 */}
显示 {filteredItems.length} / {items.length} 条灵感
{/* 灵感列表 */}
{filteredItems.length > 0 ? ( filteredItems.map((item, index) => ( )) ) : (
{selectedTags.length > 0 ? ( <>

没有匹配的灵感

) : ( <>

等待灵感的火花...

)}
)}
{/* Floating Action Button */}
{/* 添加灵感对话框 */} setIsAddDialogOpen(false)} onSubmit={handleAddInspiration} /> {/* 对话弹窗 */} setIsChatOpen(false)} characterImageUrl={characterImageUrl} onSendMessage={onSendMessage} />
); };