import React, { useState, useCallback } from 'react'; import { motion, AnimatePresence } from 'framer-motion'; import { Plus } from 'lucide-react'; import { DndContext, closestCenter, DragEndEvent } from '@dnd-kit/core'; import { SortableContext, rectSortingStrategy } from '@dnd-kit/sortable'; import { StoryboardCard as StoryboardCardType, mockStoryboards, mockSceneOptions } from '@/app/model/enums'; import FilterBar from './filter-bar'; import StoryboardCard from './storyboard-card'; const ScriptTabContent: React.FC = () => { const [cards, setCards] = useState(mockStoryboards); const [selectedScenes, setSelectedScenes] = useState([]); const [selectedCharacters, setSelectedCharacters] = useState([]); // 筛选卡片 const filteredCards = cards.filter(card => { const matchesScene = selectedScenes.length === 0 || selectedScenes.includes(card.scene?.sceneId || ''); const matchesCharacter = selectedCharacters.length === 0 || card.characters.some(char => selectedCharacters.includes(char.characterId)); return matchesScene && matchesCharacter; }); // 处理卡片拖拽 const handleDragEnd = (event: DragEndEvent) => { const { active, over } = event; if (active.id !== over?.id) { const oldIndex = cards.findIndex(c => c.id === active.id); const newIndex = cards.findIndex(c => c.id === over?.id); const newCards = [...cards]; const [removed] = newCards.splice(oldIndex, 1); newCards.splice(newIndex, 0, removed); setCards(newCards); } }; // 处理卡片更新 const handleCardUpdate = useCallback((cardId: string, updates: Partial) => { setCards(cards => cards.map(card => card.id === cardId ? { ...card, ...updates } : card )); }, []); // 处理卡片删除 const handleCardDelete = useCallback((cardId: string) => { setCards(cards => cards.filter(card => card.id !== cardId)); }, []); // 处理卡片复制 const handleCardDuplicate = useCallback((cardId: string) => { const card = cards.find(c => c.id === cardId); if (card) { const newCard: StoryboardCardType = { ...card, id: `card-${Date.now()}`, shotId: `SC-${cards.length + 1}`, dialogues: card.dialogues.map(d => ({ ...d, id: `d${Date.now()}-${d.id}` })), }; setCards(cards => [...cards, newCard]); } }, [cards]); // 添加新卡片 const handleAddCard = () => { const newCard: StoryboardCardType = { id: `card-${Date.now()}`, shotId: `SC-${cards.length + 1}`, scene: undefined, characters: [], dialogues: [], description: '', shotType: '', cameraMove: '', }; setCards(cards => [...cards, newCard]); }; return (
{/* 筛选栏 - 固定在顶部 */}
{ setSelectedScenes([]); setSelectedCharacters([]); }} />
{/* 卡片网格 - 可滚动区域 */}
card.id), 'add-card']} strategy={rectSortingStrategy} >
{filteredCards.map((card) => (
handleCardUpdate(card.id, updates)} onDelete={() => handleCardDelete(card.id)} onDuplicate={() => handleCardDuplicate(card.id)} />
))} {/* 添加卡片占位符 */}
); }; export default ScriptTabContent;