1
0

fix: 修复供应商管理弹窗交互问题

- 导入 TDesign react-19-adapter 修复 MessagePlugin 在 React 19 下的渲染错误
- Dialog 禁用蒙版点击和 ESC 键关闭,防止误操作丢失表单数据
- 重构弹窗关闭逻辑,使用 mutateAsync 替代 useEffect 监听 isSuccess
- 成功后自动关闭弹窗,失败后保持弹窗打开并显示错误提示
This commit is contained in:
2026-04-22 11:36:16 +08:00
parent f488b9cc15
commit 141f5f886f
5 changed files with 72 additions and 41 deletions

View File

@@ -1,6 +1,7 @@
import { StrictMode } from 'react'
import { createRoot } from 'react-dom/client'
import 'tdesign-react/es/style/index.css'
import 'tdesign-react/es/_util/react-19-adapter'
import './index.scss'
import App from './App'

View File

@@ -14,7 +14,7 @@ interface ModelFormProps {
model?: Model;
providerId: string;
providers: Provider[];
onSave: (values: ModelFormValues) => void;
onSave: (values: ModelFormValues) => Promise<void> | void;
onCancel: () => void;
loading: boolean;
}
@@ -63,6 +63,8 @@ export function ModelForm({
<Dialog
header={isEdit ? '编辑模型' : '添加模型'}
visible={open}
closeOnOverlayClick={false}
closeOnEscKeydown={false}
onConfirm={() => { form?.submit(); return false; }}
onClose={onCancel}
confirmLoading={loading}

View File

@@ -15,7 +15,7 @@ interface ProviderFormValues {
interface ProviderFormProps {
open: boolean;
provider?: Provider;
onSave: (values: ProviderFormValues) => void;
onSave: (values: ProviderFormValues) => Promise<void> | void;
onCancel: () => void;
loading: boolean;
}
@@ -59,6 +59,8 @@ export function ProviderForm({
<Dialog
header={isEdit ? '编辑供应商' : '添加供应商'}
visible={open}
closeOnOverlayClick={false}
closeOnEscKeydown={false}
onConfirm={() => { form?.submit(); return false; }}
onClose={onCancel}
confirmLoading={loading}

View File

@@ -1,4 +1,4 @@
import { useState, useEffect } from 'react';
import { useState } from 'react';
import type { Provider, Model, UpdateProviderInput, UpdateModelInput } from '@/types';
import { useProviders, useCreateProvider, useUpdateProvider, useDeleteProvider } from '@/hooks/useProviders';
import { useCreateModel, useUpdateModel } from '@/hooks/useModels';
@@ -20,18 +20,6 @@ export function ProvidersPage() {
const [editingModel, setEditingModel] = useState<Model | undefined>();
const [modelFormProviderId, setModelFormProviderId] = useState('');
useEffect(() => {
if ((createProvider.isSuccess || updateProvider.isSuccess) && providerFormOpen) {
setProviderFormOpen(false);
}
}, [createProvider.isSuccess, updateProvider.isSuccess, providerFormOpen]);
useEffect(() => {
if ((createModel.isSuccess || updateModel.isSuccess) && modelFormOpen) {
setModelFormOpen(false);
}
}, [createModel.isSuccess, updateModel.isSuccess, modelFormOpen]);
return (
<div>
<ProviderTable
@@ -62,16 +50,21 @@ export function ProvidersPage() {
open={providerFormOpen}
provider={editingProvider}
loading={createProvider.isPending || updateProvider.isPending}
onSave={(values) => {
if (editingProvider) {
const input: Partial<UpdateProviderInput> = {};
if (values.name !== editingProvider.name) input.name = values.name;
if (values.apiKey) input.apiKey = values.apiKey;
if (values.baseUrl !== editingProvider.baseUrl) input.baseUrl = values.baseUrl;
if (values.enabled !== editingProvider.enabled) input.enabled = values.enabled;
updateProvider.mutate({ id: editingProvider.id, input });
} else {
createProvider.mutate(values);
onSave={async (values) => {
try {
if (editingProvider) {
const input: Partial<UpdateProviderInput> = {};
if (values.name !== editingProvider.name) input.name = values.name;
if (values.apiKey) input.apiKey = values.apiKey;
if (values.baseUrl !== editingProvider.baseUrl) input.baseUrl = values.baseUrl;
if (values.enabled !== editingProvider.enabled) input.enabled = values.enabled;
await updateProvider.mutateAsync({ id: editingProvider.id, input });
} else {
await createProvider.mutateAsync(values);
}
setProviderFormOpen(false);
} catch {
// 错误已由 hooks 的 onError 处理
}
}}
onCancel={() => setProviderFormOpen(false)}
@@ -83,15 +76,20 @@ export function ProvidersPage() {
providerId={modelFormProviderId}
providers={providers}
loading={createModel.isPending || updateModel.isPending}
onSave={(values) => {
if (editingModel) {
const input: Partial<UpdateModelInput> = {};
if (values.providerId !== editingModel.providerId) input.providerId = values.providerId;
if (values.modelName !== editingModel.modelName) input.modelName = values.modelName;
if (values.enabled !== editingModel.enabled) input.enabled = values.enabled;
updateModel.mutate({ id: editingModel.id, input });
} else {
createModel.mutate(values);
onSave={async (values) => {
try {
if (editingModel) {
const input: Partial<UpdateModelInput> = {};
if (values.providerId !== editingModel.providerId) input.providerId = values.providerId;
if (values.modelName !== editingModel.modelName) input.modelName = values.modelName;
if (values.enabled !== editingModel.enabled) input.enabled = values.enabled;
await updateModel.mutateAsync({ id: editingModel.id, input });
} else {
await createModel.mutateAsync(values);
}
setModelFormOpen(false);
} catch {
// 错误已由 hooks 的 onError 处理
}
}}
onCancel={() => setModelFormOpen(false)}