Refactor Ena Planner to iframe settings and harden save ack flow
This commit is contained in:
@@ -1275,7 +1275,7 @@ select.input { cursor: pointer; }
|
||||
<div class="tip-box" style="margin-bottom: 16px;">
|
||||
<i class="fa-solid fa-info-circle"></i>
|
||||
<div>
|
||||
<strong>试用音色</strong> — 无需配置,使用插件服务器(11个音色)<br>
|
||||
<strong>试用音色</strong> — 无需配置,使用插件服务器(21个音色)<br>
|
||||
<strong>鉴权音色</strong> — 需配置火山引擎 API(200+ 音色 + 复刻)
|
||||
</div>
|
||||
</div>
|
||||
@@ -1719,6 +1719,7 @@ let selectedTrialVoiceValue = '';
|
||||
let selectedAuthVoiceValue = '';
|
||||
let editingVoiceValue = null;
|
||||
let activeSaveBtn = null;
|
||||
let pendingSaveRequest = null;
|
||||
|
||||
const TRIAL_VOICES = [
|
||||
{ key: 'female_1', name: '晓晓', tag: '温暖百变', gender: 'female' },
|
||||
@@ -1791,6 +1792,25 @@ function handleSaveResult(success) {
|
||||
}
|
||||
}
|
||||
|
||||
function requestSaveConfig(form, btn = null) {
|
||||
const requestId = `tts_save_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;
|
||||
|
||||
if (pendingSaveRequest?.timer) clearTimeout(pendingSaveRequest.timer);
|
||||
if (btn) setSavingState(btn);
|
||||
|
||||
pendingSaveRequest = {
|
||||
requestId,
|
||||
timer: setTimeout(() => {
|
||||
if (!pendingSaveRequest || pendingSaveRequest.requestId !== requestId) return;
|
||||
pendingSaveRequest = null;
|
||||
handleSaveResult(false);
|
||||
post('xb-tts:toast', { type: 'error', message: '保存超时(3秒)' });
|
||||
}, 3000),
|
||||
};
|
||||
|
||||
post('xb-tts:save-config', { requestId, patch: form });
|
||||
}
|
||||
|
||||
function setTestStatus(elId, status, text) {
|
||||
const el = $(elId);
|
||||
if (!el) return;
|
||||
@@ -2060,7 +2080,7 @@ function bindMyVoiceEvents(listEl) {
|
||||
const input = btn.closest('.voice-item').querySelector('.voice-edit-input');
|
||||
if (item && input?.value?.trim()) {
|
||||
item.name = input.value.trim();
|
||||
post('xb-tts:save-config', collectForm());
|
||||
requestSaveConfig(collectForm());
|
||||
}
|
||||
editingVoiceValue = null;
|
||||
renderMyVoiceList();
|
||||
@@ -2090,7 +2110,7 @@ function bindMyVoiceEvents(listEl) {
|
||||
renderTrialVoiceList();
|
||||
renderAuthVoiceList();
|
||||
updateCurrentVoiceDisplay();
|
||||
post('xb-tts:save-config', collectForm());
|
||||
requestSaveConfig(collectForm());
|
||||
}
|
||||
});
|
||||
});
|
||||
@@ -2313,11 +2333,17 @@ window.addEventListener('message', ev => {
|
||||
fillForm(payload);
|
||||
break;
|
||||
case 'xb-tts:config-saved':
|
||||
if (pendingSaveRequest?.requestId && payload?.requestId && pendingSaveRequest.requestId !== payload.requestId) break;
|
||||
if (pendingSaveRequest?.timer) clearTimeout(pendingSaveRequest.timer);
|
||||
pendingSaveRequest = null;
|
||||
fillForm(payload);
|
||||
handleSaveResult(true);
|
||||
post('xb-tts:toast', { type: 'success', message: '配置已保存' });
|
||||
break;
|
||||
case 'xb-tts:config-save-error':
|
||||
if (pendingSaveRequest?.requestId && payload?.requestId && pendingSaveRequest.requestId !== payload.requestId) break;
|
||||
if (pendingSaveRequest?.timer) clearTimeout(pendingSaveRequest.timer);
|
||||
pendingSaveRequest = null;
|
||||
handleSaveResult(false);
|
||||
post('xb-tts:toast', { type: 'error', message: payload?.message || '保存失败' });
|
||||
break;
|
||||
@@ -2432,7 +2458,7 @@ document.addEventListener('DOMContentLoaded', () => {
|
||||
$$('.voice-tab')[0].classList.add('active');
|
||||
$('panel-myVoice').classList.add('active');
|
||||
|
||||
post('xb-tts:save-config', collectForm());
|
||||
requestSaveConfig(collectForm());
|
||||
post('xb-tts:toast', { type: 'success', message: `已添加:${name}` });
|
||||
});
|
||||
|
||||
@@ -2456,7 +2482,7 @@ document.addEventListener('DOMContentLoaded', () => {
|
||||
$$('.voice-tab')[0].classList.add('active');
|
||||
$('panel-myVoice').classList.add('active');
|
||||
|
||||
post('xb-tts:save-config', collectForm());
|
||||
requestSaveConfig(collectForm());
|
||||
post('xb-tts:toast', { type: 'success', message: `已添加:${name}` });
|
||||
});
|
||||
|
||||
@@ -2475,12 +2501,12 @@ document.addEventListener('DOMContentLoaded', () => {
|
||||
|
||||
renderMyVoiceList();
|
||||
updateCurrentVoiceDisplay();
|
||||
post('xb-tts:save-config', collectForm());
|
||||
requestSaveConfig(collectForm());
|
||||
post('xb-tts:toast', { type: 'success', message: `已添加:${name || id}` });
|
||||
});
|
||||
|
||||
['saveConfigBtn', 'saveVoiceBtn', 'saveAdvancedBtn', 'saveCacheBtn'].forEach(id => {
|
||||
$(id)?.addEventListener('click', () => { setSavingState($(id)); post('xb-tts:save-config', collectForm()); });
|
||||
$(id)?.addEventListener('click', () => { requestSaveConfig(collectForm(), $(id)); });
|
||||
});
|
||||
|
||||
$('cacheRefreshBtn').addEventListener('click', () => post('xb-tts:cache-refresh'));
|
||||
|
||||
Reference in New Issue
Block a user