mirror of
https://github.com/langbot-app/LangBot.git
synced 2026-07-22 12:26:08 +00:00
refactor: remove providerUuid prop from model components and enhance provider deletion confirmation UI
This commit is contained in:
@@ -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}
|
||||||
|
|||||||
@@ -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',
|
||||||
|
|||||||
@@ -224,6 +224,7 @@ const jaJP = {
|
|||||||
providerSaveError: 'プロバイダーの保存に失敗しました:',
|
providerSaveError: 'プロバイダーの保存に失敗しました:',
|
||||||
providerDeleted: 'プロバイダーを削除しました',
|
providerDeleted: 'プロバイダーを削除しました',
|
||||||
providerDeleteError: 'プロバイダーの削除に失敗しました:',
|
providerDeleteError: 'プロバイダーの削除に失敗しました:',
|
||||||
|
deleteProviderConfirmation: 'このプロバイダーを削除してもよろしいですか?',
|
||||||
loadError: 'データの読み込みに失敗しました',
|
loadError: 'データの読み込みに失敗しました',
|
||||||
chat: 'チャット',
|
chat: 'チャット',
|
||||||
embedding: '埋め込み',
|
embedding: '埋め込み',
|
||||||
|
|||||||
@@ -211,6 +211,7 @@ const zhHans = {
|
|||||||
providerSaveError: '保存供应商失败:',
|
providerSaveError: '保存供应商失败:',
|
||||||
providerDeleted: '供应商已删除',
|
providerDeleted: '供应商已删除',
|
||||||
providerDeleteError: '删除供应商失败:',
|
providerDeleteError: '删除供应商失败:',
|
||||||
|
deleteProviderConfirmation: '你确定要删除这个供应商吗?',
|
||||||
loadError: '加载数据失败',
|
loadError: '加载数据失败',
|
||||||
chat: '对话',
|
chat: '对话',
|
||||||
embedding: '嵌入',
|
embedding: '嵌入',
|
||||||
|
|||||||
@@ -210,6 +210,7 @@ const zhHant = {
|
|||||||
providerSaveError: '儲存供應商失敗:',
|
providerSaveError: '儲存供應商失敗:',
|
||||||
providerDeleted: '供應商已刪除',
|
providerDeleted: '供應商已刪除',
|
||||||
providerDeleteError: '刪除供應商失敗:',
|
providerDeleteError: '刪除供應商失敗:',
|
||||||
|
deleteProviderConfirmation: '您確定要刪除這個供應商嗎?',
|
||||||
loadError: '載入資料失敗',
|
loadError: '載入資料失敗',
|
||||||
chat: '對話',
|
chat: '對話',
|
||||||
embedding: '嵌入',
|
embedding: '嵌入',
|
||||||
|
|||||||
Reference in New Issue
Block a user