From 0dc98ec9b9af98199260cfca3d0e96b2b58c7258 Mon Sep 17 00:00:00 2001 From: holden093 Date: Thu, 2 Jul 2026 17:05:55 +0200 Subject: [PATCH] fix(ui): prevent race condition in default chat model dropdown init (#5024) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Setting epSel.value triggered an async change event whose handler called refreshModels('') — wiping the correct model selection that refreshModels(settings.default_model) had just applied moments earlier. The dropdown silently fell back to the alphabetically-first model (deepseek-v4-flash instead of qwen-3.6-35B-A3B). Moved the change listener registration to after the settings block so the async change event fires before any listener exists. The utility and teacher sections already followed this pattern. --- static/js/settings.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/static/js/settings.js b/static/js/settings.js index 4bff7ad8c..656ef65de 100644 --- a/static/js/settings.js +++ b/static/js/settings.js @@ -542,6 +542,9 @@ async function initDefaultChat() { renderFallbacks(); } catch (e) { console.warn('Failed to load default chat settings', e); } + epSel.addEventListener('change', function() { refreshModels(''); saveDefault(); }); + modelSel.addEventListener('change', saveDefault); + async function saveDefault() { try { var clean = _fallbacks.filter(function(f) { return f.endpoint_id && f.model; }); @@ -558,8 +561,6 @@ async function initDefaultChat() { } catch (e) { msg.textContent = 'Failed to save'; msg.style.color = 'var(--red)'; } } - epSel.addEventListener('change', function() { refreshModels(''); saveDefault(); }); - modelSel.addEventListener('change', saveDefault); if (addFbBtn) addFbBtn.addEventListener('click', function() { var first = enabledEndpoints()[0]; _fallbacks.push({ endpoint_id: first ? first.id : '', model: '' });