import React, { useState, useEffect } from 'react'; import { Drawer, Button, Select, Input, Row, Col, Card, Typography, Pagination, Checkbox, Space, message, Modal, } from 'antd'; import { EditOutlined, PlayCircleOutlined, CheckCircleFilled, CaretRightFilled } from '@ant-design/icons'; import { VideoItem } from '../types'; const { Option } = Select; const { Text } = Typography; interface VideoSelectModalProps { visible: boolean; onClose: () => void; onOk: (selectedVideos: VideoItem[]) => void; initialSelectedIds?: number[]; } // Mock data for demonstration - Ensure videoUrl is added const mockVideos: VideoItem[] = Array.from({ length: 15 }, (_, i) => ({ id: i + 100, source: '票圈 | 3亿人喜欢的视频平台', title: `最美中国——上海之海 ${i + 1},带你领略航拍风景`, thumbnail: 'https://gw.alipayobjects.com/zos/rmsportal/JiqGstEfoWAOHiTxclqi.png', spreadEfficiency: 8.56 + i * 0.1, videoUrl: 'https://sample-videos.com/video123/mp4/720/big_buck_bunny_720p_1mb.mp4', // Example video URL })); const VideoSelectModal: React.FC = ({ visible, onClose, onOk, initialSelectedIds = [] }) => { const [category, setCategory] = useState(); const [searchTerm, setSearchTerm] = useState(''); const [currentPage, setCurrentPage] = useState(1); const [pageSize, setPageSize] = useState(10); const [selectedVideoIds, setSelectedVideoIds] = useState>(new Set(initialSelectedIds)); const [playingVideo, setPlayingVideo] = useState(null); const MAX_SELECTION = 3; useEffect(() => { if (visible) { setSelectedVideoIds(new Set(initialSelectedIds)); } }, [visible, initialSelectedIds]); const handleSearch = () => { console.log('Searching for:', { category, searchTerm }); setCurrentPage(1); }; const handleSelectVideo = (videoId: number) => { setSelectedVideoIds(prev => { const newSet = new Set(prev); if (newSet.has(videoId)) { newSet.delete(videoId); } else { if (newSet.size >= MAX_SELECTION) { message.warning(`最多只能选择 ${MAX_SELECTION} 条视频`); return prev; } newSet.add(videoId); } return newSet; }); }; const handleOk = () => { const selectedVideos = mockVideos.filter(video => selectedVideoIds.has(video.id)); onOk(selectedVideos); onClose(); }; const playVideo = (video: VideoItem) => { setPlayingVideo(video); }; const closeVideoPlayer = () => { setPlayingVideo(null); }; const paginatedData = mockVideos.slice((currentPage - 1) * pageSize, currentPage * pageSize); return ( <> { setCurrentPage(page); setPageSize(size); }} pageSizeOptions={['10', '20', '50']} size="small" showSizeChanger showTotal={(total) => `共 ${total} 条`} /> 已选 {selectedVideoIds.size} / {MAX_SELECTION} 条视频 } >
品类: setSearchTerm(e.target.value)} />
{paginatedData.map((video) => { const isSelected = selectedVideoIds.has(video.id); const isDisabled = !isSelected && selectedVideoIds.size >= MAX_SELECTION; return ( !isDisabled && handleSelectVideo(video.id)} >
{video.source} {video.title}
{ e.stopPropagation(); playVideo(video); }} > {video.title}
传播效率: {video.spreadEfficiency.toFixed(2)} {isSelected ? ( ) : (
)}
); })}
{playingVideo && ( )} ); }; export default VideoSelectModal;