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 { VideoItem, VideoListResponse } from '../types'; import http from '@src/http'; import { getVideoContentListApi } from '@src/http/api'; import { useVideoCategoryOptions } from '../../hooks/useVideoCategoryOptions'; import { VideoSortType } from '@src/views/publishContent/weCom/components/videoSelectModal'; import { GzhPlanType } from '../../hooks/useGzhPlanList'; import { VideoSearchPlanType } from '@src/views/publishContent/weCom/type'; import { enumToOptions } from '@src/utils/helper'; const { Paragraph, Text } = Typography; interface VideoSelectModalProps { planType: GzhPlanType; visible: boolean; onClose: () => void; onOk: (selectedVideos: VideoItem[]) => void; initialSelectedIds?: number[]; selectedVideos?: VideoItem[]; } const VideoSelectModal: React.FC = ({ planType, visible, onClose, onOk, initialSelectedIds = [], selectedVideos = [] }) => { const { videoCategoryOptions } = useVideoCategoryOptions(); const [category, setCategory] = useState(); const [sort, setSort] = useState(VideoSortType.平台推荐); 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 getVideoListType = (planType: GzhPlanType) => { if (planType === GzhPlanType.自动回复) { return VideoSearchPlanType.自动回复; } else if (planType === GzhPlanType.公众号推送) { return VideoSearchPlanType.公众号推送; } else { return VideoSearchPlanType.服务号推送; } } const getVideoList = async (pageNum?: number, _pageSize?: number) => { setLoading(true); setCurrentPage(pageNum || currentPage); setPageSize(_pageSize || pageSize); const res = await http.post(getVideoContentListApi, { category, title: searchTerm, sort, type: getVideoListType(planType), pageNum: pageNum || currentPage, pageSize: _pageSize || pageSize, }).catch(() => { message.error('获取视频列表失败'); }).finally(() => { setLoading(false); }); if (res && res.code === 0) { setVideoList([...selectedVideos, ...res.data.objs.filter(v => !selectedVideos.find(ov => ov.videoId === v.videoId))]); setVideoListAll(old => [...old, ...res.data.objs.filter(v => !old.find(ov => ov.videoId === v.videoId))]); setTotal(res.data.totalSize); } } useEffect(() => { if (visible) { setVideoList(selectedVideos); setVideoListAll(selectedVideos); getVideoList(0); } }, [visible]); useEffect(() => { if (visible) { setSelectedVideoIds(new Set(initialSelectedIds)); } }, [visible, initialSelectedIds]); const handleSearch = () => { console.log('Searching for:', { category, searchTerm }); const currentPage = 1 setCurrentPage(currentPage); getVideoList(currentPage); }; 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)); onOk(_selectedVideos); onClose(); }; const playVideo = (video: VideoItem) => { setPlayingVideo(video); }; const closeVideoPlayer = () => { setPlayingVideo(null); }; return ( <> { setCurrentPage(page); setPageSize(size); getVideoList(page, size); }} pageSizeOptions={['10', '20', '50']} size="small" showSizeChanger showTotal={(total) => `共 ${total} 条`} /> 已选 {selectedVideoIds.size} / {MAX_SELECTION} 条视频 } >
排序选项: ({ label: option, value: option }))} />
视频标题: 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.customTitle || video.title}
{ e.stopPropagation(); playVideo(video); }} > {video.customTitle
平台传播得分: {video.score?.toFixed(2) || '无'} 行业裂变率: {video.industryFissionRate?.toFixed(2) || '无'} 本渠道传播率: {video.channelFissionRate?.toFixed(2) || '无'}
{isSelected ? ( ) : (
)}
); })}
{playingVideo && ( )} ); }; export default VideoSelectModal;