import { useEffect, useState } from "react"; import { useNavigate } from "react-router-dom"; import { Button, Descriptions, Form, Grid, Input, InputNumber, InputTag, Message, Modal, Select, Space, Switch } from "@arco-design/web-react"; import { IconArrowLeft, IconRefresh } from "@arco-design/web-react/icon"; import { channelApi, dramaApi, mediaApi } from "../../api"; import { Panel } from "../../components/Panel"; import { toDramaPayload, toEpisodePayload } from "../formPayload"; import type { Channel, Drama, DramaDetailPageProps, Episode } from "../interface"; import { EpisodeTable } from "./EpisodeTable"; const { Row, Col } = Grid; const STATUS_OPTIONS = [ { value: "draft", label: "草稿" }, { value: "scheduled", label: "定时发布" }, { value: "published", label: "已发布" }, { value: "offline", label: "已下线" }, ]; const PUBLISH_STATUS_LABEL: Record = { draft: "草稿", scheduled: "定时发布", published: "已发布", offline: "已下线", }; export function DramaDetail({ dramaId }: DramaDetailPageProps) { const navigate = useNavigate(); const [drama, setDrama] = useState(null); const [episodes, setEpisodes] = useState([]); const [loading, setLoading] = useState(false); const [episodeCount, setEpisodeCount] = useState(1); const [uploadingEpisodeId, setUploadingEpisodeId] = useState(null); const [editVisible, setEditVisible] = useState(false); const [updatingDrama, setUpdatingDrama] = useState(false); const [channels, setChannels] = useState([]); const loadDetail = async () => { setLoading(true); try { const [dramaData, episodeList, channelPage] = await Promise.all([dramaApi.getDrama(dramaId), dramaApi.getDramaEpisodes(dramaId), channelApi.listChannels({ page: 1, pageSize: 100 }).catch(() => ({ list: [] }))]); setDrama(dramaData); setEpisodeCount(dramaData.totalEpisodes || 1); setEpisodes(episodeList); setChannels(channelPage.list); } finally { setLoading(false); } }; useEffect(() => { void loadDetail(); }, [dramaId]); const configureEpisodes = async () => { await dramaApi.configureDramaEpisodes(dramaId, episodeCount); Message.success("剧集数量已更新"); await loadDetail(); }; const updateDramaStatus = async (status: string) => { await dramaApi.updateDrama(dramaId, { status }); Message.success("短剧状态已更新"); await loadDetail(); }; const updateDrama = async (values: Partial) => { setUpdatingDrama(true); try { await dramaApi.updateDrama(dramaId, toDramaPayload(values)); Message.success("短剧信息已更新"); setEditVisible(false); await loadDetail(); } finally { setUpdatingDrama(false); } }; const uploadEpisodeVideo = async (episode: Episode, file: File) => { setUploadingEpisodeId(episode.id); try { const task = await mediaApi.createUploadTask({ episodeId: episode.id, fileName: file.name, contentType: file.type || "video/mp4", fileSize: file.size, }); await mediaApi.completeUploadTask(task.jobId); await mediaApi.syncReviewStatus(); Message.success("视频上传并审核通过"); await loadDetail(); } finally { setUploadingEpisodeId(null); } }; const publishEpisode = async (episode: Episode) => { await dramaApi.updateEpisode(episode.id, { publishStatus: "published", status: "published", }); Message.success("剧集已发布"); await loadDetail(); }; const updateEpisode = async (episode: Episode, values: Partial) => { await dramaApi.updateDramaEpisode(dramaId, episode.id, toEpisodePayload(values)); Message.success("剧集信息已更新"); await loadDetail(); }; return (
{/* 导航栏 */} {/* 内容区域 */}
{loading && !drama ? (
加载中...
) : drama ? (
{drama.title}
) : null}
setEpisodeCount(Number(value) || 1)} /> } noPadding >
{drama && ( setEditVisible(false)} footer={null} style={{ width: "45rem" }}>
)}
); }