feat: Implement prepare-and-create endpoint for voice design creation and update related API and frontend logic

This commit is contained in:
2026-03-06 14:23:15 +08:00
parent 5e1e3e0668
commit ad90e5f96c
5 changed files with 119 additions and 16 deletions

View File

@@ -145,28 +145,27 @@ const VoiceDesignForm = forwardRef<VoiceDesignFormHandle>((_props, ref) => {
return
}
const backend = preferences?.default_backend || 'local'
const text = watch('text')
const designData = {
name: saveDesignName,
instruct: instruct,
backend_type: backend,
preview_text: text || `${saveDesignName}的声音`
}
try {
const backend = preferences?.default_backend || 'local'
const text = watch('text')
const design = await voiceDesignApi.create({
name: saveDesignName,
instruct: instruct,
backend_type: backend,
preview_text: text || `${saveDesignName}的声音`
})
toast.success(t('designSaved'))
if (backend === 'local') {
setIsPreparing(true)
try {
await voiceDesignApi.prepareClone(design.id)
toast.success(t('clonePrepared'))
} catch (error) {
toast.error(t('clonePrepareFailed'))
await voiceDesignApi.prepareAndCreate(designData)
toast.success(t('designSaved'))
} finally {
setIsPreparing(false)
}
} else {
await voiceDesignApi.create(designData)
toast.success(t('designSaved'))
}
setShowSaveDialog(false)

View File

@@ -432,6 +432,14 @@ export const voiceDesignApi = {
return response.data
},
prepareAndCreate: async (data: VoiceDesignCreate): Promise<VoiceDesign> => {
const response = await apiClient.post<VoiceDesign>(
API_ENDPOINTS.VOICE_DESIGNS.PREPARE_AND_CREATE,
data
)
return response.data
},
prepareClone: async (id: number): Promise<{ message: string; cache_id: number; ref_text: string }> => {
const response = await apiClient.post<{ message: string; cache_id: number; ref_text: string }>(
API_ENDPOINTS.VOICE_DESIGNS.PREPARE_CLONE(id)

View File

@@ -30,6 +30,7 @@ export const API_ENDPOINTS = {
VOICE_DESIGNS: {
LIST: '/voice-designs',
CREATE: '/voice-designs',
PREPARE_AND_CREATE: '/voice-designs/prepare-and-create',
PREPARE_CLONE: (id: number) => `/voice-designs/${id}/prepare-clone`,
},
} as const