refactor: remove providerUuid prop from model components and enhance provider deletion confirmation UI

This commit is contained in:
Junyan Qin
2026-01-01 15:07:37 +08:00
parent b4773c4e48
commit 75c2a063cc
7 changed files with 62 additions and 22 deletions
@@ -17,7 +17,6 @@ import { ExtraArg, ModelType, TestResult } from '../types';
import ExtraArgsEditor from './ExtraArgsEditor'; import ExtraArgsEditor from './ExtraArgsEditor';
interface AddModelPopoverProps { interface AddModelPopoverProps {
providerUuid: string;
isOpen: boolean; isOpen: boolean;
onOpen: () => void; onOpen: () => void;
onClose: () => void; onClose: () => void;
@@ -40,7 +39,6 @@ interface AddModelPopoverProps {
} }
export default function AddModelPopover({ export default function AddModelPopover({
providerUuid,
isOpen, isOpen,
onOpen, onOpen,
onClose, onClose,
@@ -20,7 +20,6 @@ import ExtraArgsEditor from './ExtraArgsEditor';
interface ModelItemProps { interface ModelItemProps {
model: LLMModel | EmbeddingModel; model: LLMModel | EmbeddingModel;
modelType: ModelType; modelType: ModelType;
providerUuid: string;
isLangBotModels: boolean; isLangBotModels: boolean;
editModelPopoverOpen: string | null; editModelPopoverOpen: string | null;
deleteConfirmOpen: string | null; deleteConfirmOpen: string | null;
@@ -58,7 +57,6 @@ function convertExtraArgsToArray(extraArgs?: object): ExtraArg[] {
export default function ModelItem({ export default function ModelItem({
model, model,
modelType, modelType,
providerUuid,
isLangBotModels, isLangBotModels,
editModelPopoverOpen, editModelPopoverOpen,
deleteConfirmOpen, deleteConfirmOpen,
@@ -1,5 +1,6 @@
'use client'; 'use client';
import { useState } from 'react';
import { import {
Plus, Plus,
ChevronDown, ChevronDown,
@@ -9,17 +10,18 @@ import {
LogIn, LogIn,
} from 'lucide-react'; } from 'lucide-react';
import { httpClient, systemInfo } from '@/app/infra/http/HttpClient'; import { httpClient, systemInfo } from '@/app/infra/http/HttpClient';
import { import { ModelProvider } from '@/app/infra/entities/api';
ModelProvider,
LLMModel,
EmbeddingModel,
} from '@/app/infra/entities/api';
import { Button } from '@/components/ui/button'; import { Button } from '@/components/ui/button';
import { import {
Collapsible, Collapsible,
CollapsibleContent, CollapsibleContent,
CollapsibleTrigger, CollapsibleTrigger,
} from '@/components/ui/collapsible'; } from '@/components/ui/collapsible';
import {
Popover,
PopoverContent,
PopoverTrigger,
} from '@/components/ui/popover';
import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';
import { Badge } from '@/components/ui/badge'; import { Badge } from '@/components/ui/badge';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
@@ -116,6 +118,8 @@ export default function ProviderCard({
onResetTestResult, onResetTestResult,
}: ProviderCardProps) { }: ProviderCardProps) {
const { t } = useTranslation(); const { t } = useTranslation();
const [deleteProviderConfirmOpen, setDeleteProviderConfirmOpen] =
useState(false);
const canDelete = const canDelete =
!isLangBotModels && !isLangBotModels &&
@@ -231,17 +235,55 @@ export default function ProviderCard({
<Settings className="h-4 w-4" /> <Settings className="h-4 w-4" />
</Button> </Button>
{canDelete && ( {canDelete && (
<Button <Popover
variant="ghost" open={deleteProviderConfirmOpen}
size="icon" onOpenChange={setDeleteProviderConfirmOpen}
className="h-8 w-8"
onClick={(e) => {
e.stopPropagation();
onDeleteProvider();
}}
> >
<Trash2 className="h-4 w-4 text-destructive" /> <PopoverTrigger asChild>
</Button> <Button
variant="ghost"
size="icon"
className="h-8 w-8"
onClick={(e) => {
e.stopPropagation();
}}
>
<Trash2 className="h-4 w-4 text-destructive" />
</Button>
</PopoverTrigger>
<PopoverContent
className="w-64"
align="end"
onClick={(e) => e.stopPropagation()}
>
<div className="space-y-3">
<p className="text-sm">
{t('models.deleteProviderConfirmation')}
</p>
<div className="flex gap-2 justify-end">
<Button
variant="outline"
size="sm"
onClick={() =>
setDeleteProviderConfirmOpen(false)
}
>
{t('common.cancel')}
</Button>
<Button
variant="destructive"
size="sm"
onClick={() => {
onDeleteProvider();
setDeleteProviderConfirmOpen(false);
}}
>
{t('common.delete')}
</Button>
</div>
</div>
</PopoverContent>
</Popover>
)} )}
</> </>
)} )}
@@ -266,7 +308,6 @@ export default function ProviderCard({
)} )}
{!isLangBotModels && ( {!isLangBotModels && (
<AddModelPopover <AddModelPopover
providerUuid={provider.uuid}
isOpen={addModelPopoverOpen === provider.uuid} isOpen={addModelPopoverOpen === provider.uuid}
onOpen={onOpenAddModel} onOpen={onOpenAddModel}
onClose={onCloseAddModel} onClose={onCloseAddModel}
@@ -293,7 +334,6 @@ export default function ProviderCard({
key={model.uuid} key={model.uuid}
model={model} model={model}
modelType="llm" modelType="llm"
providerUuid={provider.uuid}
isLangBotModels={isLangBotModels} isLangBotModels={isLangBotModels}
editModelPopoverOpen={editModelPopoverOpen} editModelPopoverOpen={editModelPopoverOpen}
deleteConfirmOpen={deleteConfirmOpen} deleteConfirmOpen={deleteConfirmOpen}
@@ -325,7 +365,6 @@ export default function ProviderCard({
key={model.uuid} key={model.uuid}
model={model} model={model}
modelType="embedding" modelType="embedding"
providerUuid={provider.uuid}
isLangBotModels={isLangBotModels} isLangBotModels={isLangBotModels}
editModelPopoverOpen={editModelPopoverOpen} editModelPopoverOpen={editModelPopoverOpen}
deleteConfirmOpen={deleteConfirmOpen} deleteConfirmOpen={deleteConfirmOpen}
+2
View File
@@ -218,6 +218,8 @@ const enUS = {
providerSaveError: 'Failed to save provider: ', providerSaveError: 'Failed to save provider: ',
providerDeleted: 'Provider deleted', providerDeleted: 'Provider deleted',
providerDeleteError: 'Failed to delete provider: ', providerDeleteError: 'Failed to delete provider: ',
deleteProviderConfirmation:
'Are you sure you want to delete this provider?',
loadError: 'Failed to load data', loadError: 'Failed to load data',
chat: 'Chat', chat: 'Chat',
embedding: 'Embedding', embedding: 'Embedding',
+1
View File
@@ -224,6 +224,7 @@ const jaJP = {
providerSaveError: 'プロバイダーの保存に失敗しました:', providerSaveError: 'プロバイダーの保存に失敗しました:',
providerDeleted: 'プロバイダーを削除しました', providerDeleted: 'プロバイダーを削除しました',
providerDeleteError: 'プロバイダーの削除に失敗しました:', providerDeleteError: 'プロバイダーの削除に失敗しました:',
deleteProviderConfirmation: 'このプロバイダーを削除してもよろしいですか?',
loadError: 'データの読み込みに失敗しました', loadError: 'データの読み込みに失敗しました',
chat: 'チャット', chat: 'チャット',
embedding: '埋め込み', embedding: '埋め込み',
+1
View File
@@ -211,6 +211,7 @@ const zhHans = {
providerSaveError: '保存供应商失败:', providerSaveError: '保存供应商失败:',
providerDeleted: '供应商已删除', providerDeleted: '供应商已删除',
providerDeleteError: '删除供应商失败:', providerDeleteError: '删除供应商失败:',
deleteProviderConfirmation: '你确定要删除这个供应商吗?',
loadError: '加载数据失败', loadError: '加载数据失败',
chat: '对话', chat: '对话',
embedding: '嵌入', embedding: '嵌入',
+1
View File
@@ -210,6 +210,7 @@ const zhHant = {
providerSaveError: '儲存供應商失敗:', providerSaveError: '儲存供應商失敗:',
providerDeleted: '供應商已刪除', providerDeleted: '供應商已刪除',
providerDeleteError: '刪除供應商失敗:', providerDeleteError: '刪除供應商失敗:',
deleteProviderConfirmation: '您確定要刪除這個供應商嗎?',
loadError: '載入資料失敗', loadError: '載入資料失敗',
chat: '對話', chat: '對話',
embedding: '嵌入', embedding: '嵌入',