fix: 修复供应商管理弹窗交互问题
- 导入 TDesign react-19-adapter 修复 MessagePlugin 在 React 19 下的渲染错误 - Dialog 禁用蒙版点击和 ESC 键关闭,防止误操作丢失表单数据 - 重构弹窗关闭逻辑,使用 mutateAsync 替代 useEffect 监听 isSuccess - 成功后自动关闭弹窗,失败后保持弹窗打开并显示错误提示
This commit is contained in:
@@ -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'
|
||||
|
||||
|
||||
@@ -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}
|
||||
|
||||
@@ -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}
|
||||
|
||||
@@ -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)}
|
||||
|
||||
Reference in New Issue
Block a user