Refactor Ena Planner to iframe settings and harden save ack flow

This commit is contained in:
2026-02-25 10:26:01 +08:00
parent 526054dac8
commit 287abff599
8 changed files with 1221 additions and 1213 deletions

View File

@@ -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> — 需配置火山引擎 API200+ 音色 + 复刻)
</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'));