import React, { useState, useEffect } from 'react'; import { Drawer, Button, Select, Input, Card, Typography, Pagination, Space, message, Modal, } from 'antd'; import { CheckCircleFilled, CaretRightFilled } from '@ant-design/icons'; import { VideoListResponse } from '@src/views/publishContent/weGZH/components/types'; import http from '@src/http'; import { getVideoContentListApi } from '@src/http/api'; import { useVideoCategoryOptions } from '@src/views/publishContent/weGZH/hooks/useVideoCategoryOptions'; import { WeComPlanType, WeVideoItem } from '@src/views/publishContent/weCom/type' const { Text, Paragraph } = Typography; interface VideoSelectModalProps { planType: WeComPlanType; visible: boolean; onClose: () => void; onOk: (selectedVideos: WeVideoItem[]) => void; initialSelectedIds?: number[]; } const VideoSelectModal: React.FC = ({ planType, visible, onClose, onOk, initialSelectedIds = [] }) => { const { videoCategoryOptions } = useVideoCategoryOptions(); const [category, setCategory] = useState(); const [searchTerm, setSearchTerm] = useState(''); const [currentPage, setCurrentPage] = useState(1); const [pageSize, setPageSize] = useState(10); const [total, setTotal] = useState(0); const [loading, setLoading] = useState(false); const [videoList, setVideoList] = useState([]); const [videoListAll, setVideoListAll] = useState([]); const [selectedVideoIds, setSelectedVideoIds] = useState>(new Set(initialSelectedIds)); const [playingVideo, setPlayingVideo] = useState(null); const MAX_SELECTION = 3; const getVideoList = async (pageNum?: number, _pageSize?: number) => { setLoading(true); setCurrentPage(pageNum || currentPage); setPageSize(_pageSize || pageSize); const res = await http.post(getVideoContentListApi, { category, title: searchTerm, pageNum: pageNum || currentPage, pageSize: _pageSize || pageSize, }).catch(() => { message.error('获取视频列表失败'); }).finally(() => { setLoading(false); }); if (res && res.code === 0) { const mappedVideos = res.data.objs.map(video => ({ ...video, scene: 0 as const })); setVideoList(mappedVideos); setVideoListAll(old => [...old, ...mappedVideos]); setTotal(res.data.totalSize); } } useEffect(() => { getVideoList(); }, []); useEffect(() => { if (visible) { setSelectedVideoIds(new Set(initialSelectedIds)); } }, [visible, initialSelectedIds]); const handleSearch = () => { console.log('Searching for:', { category, searchTerm }); setCurrentPage(1); getVideoList(); }; 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 = videoListAll.filter(video => selectedVideoIds.has(video.videoId)); // 去重 const uniqueSelectedVideos = selectedVideos.filter((video, index, self) => index === self.findIndex((t) => t.videoId === video.videoId) ); onOk(uniqueSelectedVideos); }; const playVideo = (video: WeVideoItem) => { setPlayingVideo(video); }; const closeVideoPlayer = () => { setPlayingVideo(null); }; const handleChangeSelectVideo = (videoId: number, scene: number) => { setVideoList((prev: WeVideoItem[]) => { const newList = prev.map(video => { if (video.videoId === videoId) { return { ...video, scene: scene as 0 | 1 }; } return video; }); return newList; }); setVideoListAll((prev: WeVideoItem[]) => { const newList = prev.map(video => { if (video.videoId === videoId) { return { ...video, scene: scene as 0 | 1 }; } return video; }); return newList; }); } return ( <> { setCurrentPage(page); setPageSize(size); getVideoList(page, size); }} pageSizeOptions={['10', '20', '50']} size="small" showSizeChanger showTotal={(total) => `共 ${total} 条`} /> 已选 {selectedVideoIds.size} / {MAX_SELECTION} 条视频 } >
品类: setSearchTerm(e.target.value)} />
{videoList.map((video) => { const isSelected = selectedVideoIds.has(video.videoId); const isDisabled = !isSelected && selectedVideoIds.size >= MAX_SELECTION; return ( !isDisabled && handleSelectVideo(video.videoId)} >
票圈 | 3亿人喜欢的视频平台 {video.title}
{ e.stopPropagation(); playVideo(video); }} > {video.title}
传播效率: {video.score?.toFixed(2)} {isSelected ? ( ) : (
)}
{isSelected && (