From 45bdea53013a08cb69bfbc696cb77605b8d4874b Mon Sep 17 00:00:00 2001 From: icarus Date: Sat, 11 Oct 2025 16:37:39 +0800 Subject: [PATCH] feat(video): add provider settings component and layout Implement provider selection dropdown in video settings panel Add shared setting components for consistent styling Update video page layout to accommodate settings sidebar --- src/renderer/src/pages/video/VideoPage.tsx | 16 ++++- .../pages/video/settings/ProviderSetting.tsx | 59 +++++++++++++++++++ .../src/pages/video/settings/shared.tsx | 20 +++++++ 3 files changed, 94 insertions(+), 1 deletion(-) create mode 100644 src/renderer/src/pages/video/settings/ProviderSetting.tsx create mode 100644 src/renderer/src/pages/video/settings/shared.tsx diff --git a/src/renderer/src/pages/video/VideoPage.tsx b/src/renderer/src/pages/video/VideoPage.tsx index 1ce6c41325..128436a279 100644 --- a/src/renderer/src/pages/video/VideoPage.tsx +++ b/src/renderer/src/pages/video/VideoPage.tsx @@ -1,16 +1,30 @@ // interface VideoPageProps {} +import { Divider } from '@heroui/react' import { Navbar, NavbarCenter } from '@renderer/components/app/Navbar' +import { SystemProviderIds } from '@renderer/types' +import { useState } from 'react' import { useTranslation } from 'react-i18next' +import { ProviderSetting } from './settings/ProviderSetting' + export const VideoPage = () => { const { t } = useTranslation() + const [providerId, setProviderId] = useState(SystemProviderIds.openai) return (
{t('video.title')} -
video page
+
+
+ +
+ +
+ +
+
) } diff --git a/src/renderer/src/pages/video/settings/ProviderSetting.tsx b/src/renderer/src/pages/video/settings/ProviderSetting.tsx new file mode 100644 index 0000000000..5619c5b379 --- /dev/null +++ b/src/renderer/src/pages/video/settings/ProviderSetting.tsx @@ -0,0 +1,59 @@ +import { Select, SelectItem } from '@heroui/react' +import { ProviderAvatar } from '@renderer/components/ProviderAvatar' +import { useProviders } from '@renderer/hooks/useProvider' +import { Provider, SystemProviderId } from '@renderer/types' +import { getFancyProviderName } from '@renderer/utils' +import { Dispatch, SetStateAction } from 'react' +import { useTranslation } from 'react-i18next' + +import { SettingItem, SettingTitle } from './shared' + +export interface ProviderSettingProps { + providerId: string + setProviderId: Dispatch> +} + +interface ProviderSelectItem extends Provider { + key: string + label: string +} + +export const ProviderSetting = ({ providerId, setProviderId }: ProviderSettingProps) => { + const { t } = useTranslation() + // Support limited providers. + const supportedProviderIds = ['openai'] satisfies SystemProviderId[] + const { providers } = useProviders() + const items: ProviderSelectItem[] = providers + .filter((p) => supportedProviderIds.some((id) => id === p.id)) + .map((p) => ({ ...p, key: p.id, label: getFancyProviderName(p) })) + + return ( + + + + + ) +} diff --git a/src/renderer/src/pages/video/settings/shared.tsx b/src/renderer/src/pages/video/settings/shared.tsx new file mode 100644 index 0000000000..7628aef6c5 --- /dev/null +++ b/src/renderer/src/pages/video/settings/shared.tsx @@ -0,0 +1,20 @@ +import { cn, Divider } from '@heroui/react' +import { PropsWithChildren, ReactNode } from 'react' + +export const SettingItem = ({ children, divider = true }: PropsWithChildren<{ divider?: boolean }>) => { + return ( + <> +
{children}
+ {divider && } + + ) +} + +export const SettingTitle = ({ name, footer }: { name: string; footer?: ReactNode }) => { + return ( +
+ {name} + {footer} +
+ ) +}