import { fetchJson, parseApiErrorMessage, saveJsonObject } from './jsonClient'; export const EDITOR_API_BASE_PATH = '/api/editor'; export const ASSETS_API_BASE_PATH = '/api/assets'; export const EDITOR_JSON_RESOURCE_IDS = { itemOverrides: 'item-overrides', npcVisualOverrides: 'npc-visual-overrides', npcLayoutConfig: 'npc-layout-config', characterOverrides: 'character-overrides', monsterOverrides: 'monster-overrides', sceneOverrides: 'scene-overrides', sceneNpcOverrides: 'scene-npc-overrides', stateFunctionOverrides: 'state-function-overrides', } as const; export type EditorJsonResourceId = (typeof EDITOR_JSON_RESOURCE_IDS)[keyof typeof EDITOR_JSON_RESOURCE_IDS]; export const ASSET_API_PATHS = { characterWorkflowCache: `${ASSETS_API_BASE_PATH}/character-workflow-cache`, characterVisualGenerate: `${ASSETS_API_BASE_PATH}/character-visual/generate`, characterVisualPublish: `${ASSETS_API_BASE_PATH}/character-visual/publish`, characterVisualJobs: `${ASSETS_API_BASE_PATH}/character-visual/jobs`, characterAnimationGenerate: `${ASSETS_API_BASE_PATH}/character-animation/generate`, characterAnimationPublish: `${ASSETS_API_BASE_PATH}/character-animation/publish`, characterAnimationJobs: `${ASSETS_API_BASE_PATH}/character-animation/jobs`, characterAnimationImportVideo: `${ASSETS_API_BASE_PATH}/character-animation/import-video`, characterAnimationTemplates: `${ASSETS_API_BASE_PATH}/character-animation/templates`, } as const; export const EDITOR_ITEM_CATALOG_API_PATH = `${EDITOR_API_BASE_PATH}/catalog/items`; export function buildEditorJsonApiPath(resourceId: EditorJsonResourceId) { return `${EDITOR_API_BASE_PATH}/json/${resourceId}`; } export function fetchEditorJsonResource( resourceId: EditorJsonResourceId, fallbackMessage = '读取失败', ) { return fetchJson(buildEditorJsonApiPath(resourceId), fallbackMessage); } export function saveEditorJsonResource( resourceId: EditorJsonResourceId, payload: Record, fallbackMessage = '保存失败', ) { return saveJsonObject( buildEditorJsonApiPath(resourceId), payload, fallbackMessage, ); } export async function postApiJson( url: string, payload: Record, fallbackMessage: string, ) { const response = await fetch(url, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(payload), }); const responseText = await response.text(); if (!response.ok) { throw new Error(parseApiErrorMessage(responseText, fallbackMessage)); } return responseText ? (JSON.parse(responseText) as T) : ({} as T); }