From 5e4b51640291c7ad26494364872895344a565ac0 Mon Sep 17 00:00:00 2001 From: icarus Date: Mon, 13 Oct 2025 14:58:45 +0800 Subject: [PATCH] feat(video): add expired state and regenerate button to video viewer Implement expired video state handling with a regenerate button. The viewer now checks if the video has expired and shows appropriate UI with a regeneration option (currently unimplemented). --- src/renderer/src/i18n/locales/en-us.json | 1 + src/renderer/src/pages/video/VideoPanel.tsx | 6 +++- src/renderer/src/pages/video/VideoViewer.tsx | 32 +++++++++++++++++--- 3 files changed, 33 insertions(+), 6 deletions(-) diff --git a/src/renderer/src/i18n/locales/en-us.json b/src/renderer/src/i18n/locales/en-us.json index f758014fe3..d181bf649e 100644 --- a/src/renderer/src/i18n/locales/en-us.json +++ b/src/renderer/src/i18n/locales/en-us.json @@ -4658,6 +4658,7 @@ "reason": "The file may be corrupted or has been deleted externally." } }, + "expired": "Expired", "input_reference": { "add": { "error": { diff --git a/src/renderer/src/pages/video/VideoPanel.tsx b/src/renderer/src/pages/video/VideoPanel.tsx index 3d4fd6d480..444bb99718 100644 --- a/src/renderer/src/pages/video/VideoPanel.tsx +++ b/src/renderer/src/pages/video/VideoPanel.tsx @@ -76,6 +76,10 @@ export const VideoPanel = ({ provider, video, params, updateParams }: VideoPanel } }, [addOpenAIVideo, couldCreateVideo, params, t, video]) + const handleRegenerateVideo = useCallback(() => { + window.toast.info('Not implemented') + }, []) + const handleDownloadVideo = async () => { if (!video) return if (video.status === 'completed' || video.status === 'downloaded') { @@ -145,7 +149,7 @@ export const VideoPanel = ({ provider, video, params, updateParams }: VideoPanel
- {video && } + {video && } {!video && }
diff --git a/src/renderer/src/pages/video/VideoViewer.tsx b/src/renderer/src/pages/video/VideoViewer.tsx index 34a01f0915..f0212551ba 100644 --- a/src/renderer/src/pages/video/VideoViewer.tsx +++ b/src/renderer/src/pages/video/VideoViewer.tsx @@ -10,7 +10,8 @@ import { useDisclosure } from '@heroui/react' import { Video, VideoFailed } from '@renderer/types/video' -import { CheckCircleIcon, CircleXIcon } from 'lucide-react' +import dayjs from 'dayjs' +import { CheckCircleIcon, CircleXIcon, Clock9Icon } from 'lucide-react' import { useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' @@ -18,13 +19,15 @@ export type VideoViewerProps = | { video: undefined onDownload?: never + onRegenerate?: never } | { video: Video onDownload: () => void + onRegenerate: () => void } -export const VideoViewer = ({ video, onDownload }: VideoViewerProps) => { +export const VideoViewer = ({ video, onDownload, onRegenerate }: VideoViewerProps) => { const { t } = useTranslation() const [loadSuccess, setLoadSuccess] = useState(undefined) return ( @@ -33,7 +36,9 @@ export const VideoViewer = ({ video, onDownload }: VideoViewerProps) => { {video === undefined && t('video.undefined')} {video && video.status === 'queued' && } {video && video.status === 'in_progress' && } - {video && video.status === 'completed' && } + {video && video.status === 'completed' && ( + + )} {video && video.status === 'downloading' && } {video && video.status === 'downloaded' && loadSuccess !== false && (