feat(web): add reusable admin form dialog

This commit is contained in:
2026-05-09 20:15:35 +08:00
parent c0335bd5d0
commit a5e66e79cd
49 changed files with 6013 additions and 1108 deletions
@@ -0,0 +1,99 @@
import type { Dispatch, SetStateAction } from 'react';
import type {
BaseModelCatalogItem,
BaseModelUpsertRequest,
CatalogProvider,
CatalogProviderUpsertRequest,
} from '@easyai-ai-gateway/contracts';
import {
createBaseModel,
createCatalogProvider,
deleteBaseModel,
deleteCatalogProvider,
updateBaseModel,
updateCatalogProvider,
} from '../api';
import type { LoadState } from '../types';
export function useCatalogOperations(input: {
setBaseModels: Dispatch<SetStateAction<BaseModelCatalogItem[]>>;
setCoreMessage: Dispatch<SetStateAction<string>>;
setCoreState: Dispatch<SetStateAction<LoadState>>;
setProviders: Dispatch<SetStateAction<CatalogProvider[]>>;
token: string;
}) {
async function saveProvider(payload: CatalogProviderUpsertRequest, providerId?: string) {
if (!input.token) throw new Error('请先登录后再维护模型厂商');
input.setCoreState('loading');
input.setCoreMessage('');
try {
const provider = providerId
? await updateCatalogProvider(input.token, providerId, payload)
: await createCatalogProvider(input.token, payload);
input.setProviders((current) => [provider, ...current.filter((item) => item.id !== provider.id)]);
input.setCoreState('ready');
input.setCoreMessage(providerId ? '模型厂商已更新。' : '模型厂商已新增。');
} catch (err) {
input.setCoreState('error');
input.setCoreMessage(err instanceof Error ? err.message : '模型厂商保存失败');
throw err;
}
}
async function removeProvider(providerId: string) {
if (!input.token) throw new Error('请先登录后再维护模型厂商');
input.setCoreState('loading');
input.setCoreMessage('');
try {
await deleteCatalogProvider(input.token, providerId);
input.setProviders((current) => current.filter((item) => item.id !== providerId));
input.setCoreState('ready');
input.setCoreMessage('模型厂商已删除。');
} catch (err) {
input.setCoreState('error');
input.setCoreMessage(err instanceof Error ? err.message : '模型厂商删除失败');
throw err;
}
}
async function saveBaseModel(payload: BaseModelUpsertRequest, baseModelId?: string) {
if (!input.token) throw new Error('请先登录后再维护基准模型');
input.setCoreState('loading');
input.setCoreMessage('');
try {
const model = baseModelId
? await updateBaseModel(input.token, baseModelId, payload)
: await createBaseModel(input.token, payload);
input.setBaseModels((current) => [model, ...current.filter((item) => item.id !== model.id)]);
input.setCoreState('ready');
input.setCoreMessage(baseModelId ? '基准模型已更新。' : '基准模型已新增。');
} catch (err) {
input.setCoreState('error');
input.setCoreMessage(err instanceof Error ? err.message : '基准模型保存失败');
throw err;
}
}
async function removeBaseModel(baseModelId: string) {
if (!input.token) throw new Error('请先登录后再维护基准模型');
input.setCoreState('loading');
input.setCoreMessage('');
try {
await deleteBaseModel(input.token, baseModelId);
input.setBaseModels((current) => current.filter((item) => item.id !== baseModelId));
input.setCoreState('ready');
input.setCoreMessage('基准模型已删除。');
} catch (err) {
input.setCoreState('error');
input.setCoreMessage(err instanceof Error ? err.message : '基准模型删除失败');
throw err;
}
}
return {
removeBaseModel,
removeProvider,
saveBaseModel,
saveProvider,
};
}
@@ -0,0 +1,47 @@
import type { Dispatch, SetStateAction } from 'react';
import type { PricingRuleSet, PricingRuleSetUpsertRequest } from '@easyai-ai-gateway/contracts';
import { createPricingRuleSet, deletePricingRuleSet, updatePricingRuleSet } from '../api';
import type { LoadState } from '../types';
export function usePricingRuleSetOperations(input: {
setCoreMessage: Dispatch<SetStateAction<string>>;
setCoreState: Dispatch<SetStateAction<LoadState>>;
setPricingRuleSets: Dispatch<SetStateAction<PricingRuleSet[]>>;
token: string;
}) {
async function savePricingRuleSet(payload: PricingRuleSetUpsertRequest, ruleSetId?: string) {
if (!input.token) throw new Error('请先登录后再维护定价规则');
input.setCoreState('loading');
input.setCoreMessage('');
try {
const item = ruleSetId
? await updatePricingRuleSet(input.token, ruleSetId, payload)
: await createPricingRuleSet(input.token, payload);
input.setPricingRuleSets((current) => [item, ...current.filter((ruleSet) => ruleSet.id !== item.id)]);
input.setCoreState('ready');
input.setCoreMessage(ruleSetId ? '定价规则已更新。' : '定价规则已新增。');
} catch (err) {
input.setCoreState('error');
input.setCoreMessage(err instanceof Error ? err.message : '定价规则保存失败');
throw err;
}
}
async function removePricingRuleSet(ruleSetId: string) {
if (!input.token) throw new Error('请先登录后再维护定价规则');
input.setCoreState('loading');
input.setCoreMessage('');
try {
await deletePricingRuleSet(input.token, ruleSetId);
input.setPricingRuleSets((current) => current.filter((item) => item.id !== ruleSetId));
input.setCoreState('ready');
input.setCoreMessage('定价规则已删除。');
} catch (err) {
input.setCoreState('error');
input.setCoreMessage(err instanceof Error ? err.message : '定价规则删除失败');
throw err;
}
}
return { removePricingRuleSet, savePricingRuleSet };
}