feat(web): add reusable admin form dialog
This commit is contained in:
@@ -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 };
|
||||
}
|
||||
Reference in New Issue
Block a user