From ab2aa8380f69a5f700aa6394ab8d375ee64fd499 Mon Sep 17 00:00:00 2001 From: icarus Date: Sat, 11 Oct 2025 17:22:14 +0800 Subject: [PATCH] feat(video): add video panel component with error handling Implement video panel with placeholder prompt input and video display area Add error states for invalid and undefined video cases Update i18n strings for video related messages --- src/renderer/src/i18n/locales/en-us.json | 9 ++++- src/renderer/src/pages/video/Video.tsx | 22 ++++++++++++ src/renderer/src/pages/video/VideoPage.tsx | 5 +-- src/renderer/src/pages/video/VideoPanel.tsx | 39 +++++++++++++++++++++ 4 files changed, 72 insertions(+), 3 deletions(-) create mode 100644 src/renderer/src/pages/video/Video.tsx create mode 100644 src/renderer/src/pages/video/VideoPanel.tsx diff --git a/src/renderer/src/i18n/locales/en-us.json b/src/renderer/src/i18n/locales/en-us.json index 1054f199b2..b78ea22cf2 100644 --- a/src/renderer/src/i18n/locales/en-us.json +++ b/src/renderer/src/i18n/locales/en-us.json @@ -4646,7 +4646,14 @@ "title": "Update" }, "video": { - "title": "Video" + "error": { + "invalid": "Invalid video" + }, + "prompt": { + "placeholder": "describes the video to generate" + }, + "title": "Video", + "undefined": "No available video" }, "warning": { "missing_provider": "The supplier does not exist; reverted to the default supplier {{provider}}. This may cause issues." diff --git a/src/renderer/src/pages/video/Video.tsx b/src/renderer/src/pages/video/Video.tsx new file mode 100644 index 0000000000..e005454de1 --- /dev/null +++ b/src/renderer/src/pages/video/Video.tsx @@ -0,0 +1,22 @@ +import { CircleXIcon } from 'lucide-react' +import { useTranslation } from 'react-i18next' + +export interface VideoProps { + video: null | undefined +} + +export const Video = ({ video }: VideoProps) => { + const { t } = useTranslation() + return ( +
+ {video && } + {video === undefined && t('video.undefined')} + {video === null && ( +
+ + {t('video.error.invalid')} +
+ )} +
+ ) +} diff --git a/src/renderer/src/pages/video/VideoPage.tsx b/src/renderer/src/pages/video/VideoPage.tsx index 128436a279..89bf125067 100644 --- a/src/renderer/src/pages/video/VideoPage.tsx +++ b/src/renderer/src/pages/video/VideoPage.tsx @@ -7,6 +7,7 @@ import { useState } from 'react' import { useTranslation } from 'react-i18next' import { ProviderSetting } from './settings/ProviderSetting' +import { VideoPanel } from './VideoPanel' export const VideoPage = () => { const { t } = useTranslation() @@ -21,9 +22,9 @@ export const VideoPage = () => { -
+ -
+
) diff --git a/src/renderer/src/pages/video/VideoPanel.tsx b/src/renderer/src/pages/video/VideoPanel.tsx new file mode 100644 index 0000000000..42d5553797 --- /dev/null +++ b/src/renderer/src/pages/video/VideoPanel.tsx @@ -0,0 +1,39 @@ +import { Button, Skeleton, Textarea } from '@heroui/react' +import { ArrowUp } from 'lucide-react' +import { useState } from 'react' +import { useTranslation } from 'react-i18next' + +import { Video } from './Video' + +export const VideoPanel = () => { + const { t } = useTranslation() + const [prompt, setPrompt] = useState('') + // TODO: get video job from api + const video = { success: false, data: undefined } + return ( +
+
+ + +
+
+