← back to Wallco Ai
wallco.ai · nav saved-count chip auto-refreshes via custom event · introduces window 'wallco-saved-changed' (detail:{saved_count,design_id,saved}); dispatched from PDP ♥ Save toggle AND /me/saved Remove button; nav script listens, updates #trade-nav-saved-count + window.__tradeMe.saved_count in one place. Removes the prior direct-poke-from-PDP wiring (was duplicated, hard to extend). Future surfaces (autocomplete ♥ flip, basket add, etc.) just dispatch the same event. Verified PDP 2 refs (dispatch+listener), /me/saved 2 refs, home 1 ref (listener only)
11c49ab80824b4b0e51cd84ed8c7d38d2c4a68dd · 2026-05-12 10:52:29 -0700 · SteveStudio2
Files touched
Diff
commit 11c49ab80824b4b0e51cd84ed8c7d38d2c4a68dd
Author: SteveStudio2 <stevestudio2@SteveStacStudio.lan>
Date: Tue May 12 10:52:29 2026 -0700
wallco.ai · nav saved-count chip auto-refreshes via custom event · introduces window 'wallco-saved-changed' (detail:{saved_count,design_id,saved}); dispatched from PDP ♥ Save toggle AND /me/saved Remove button; nav script listens, updates #trade-nav-saved-count + window.__tradeMe.saved_count in one place. Removes the prior direct-poke-from-PDP wiring (was duplicated, hard to extend). Future surfaces (autocomplete ♥ flip, basket add, etc.) just dispatch the same event. Verified PDP 2 refs (dispatch+listener), /me/saved 2 refs, home 1 ref (listener only)
---
server.js | 16 +++++++++++++---
1 file changed, 13 insertions(+), 3 deletions(-)
diff --git a/server.js b/server.js
index f2386e4..3497c1c 100644
--- a/server.js
+++ b/server.js
@@ -1111,6 +1111,8 @@ ${FOOTER}
.then(function(r){ return r.json(); })
.then(function(j){
if (j.ok && !j.saved) {
+ if (window.__tradeMe) window.__tradeMe.saved_count = j.saved_count;
+ try { window.dispatchEvent(new CustomEvent('wallco-saved-changed', { detail: { saved_count: j.saved_count, design_id: id, saved: false } })); } catch(e){}
var wrap = btn.closest('.saved-card-wrap');
if (wrap) {
wrap.style.transition = 'opacity .25s, transform .25s';
@@ -1431,6 +1433,15 @@ function htmlHeader(active) {
try { window.dispatchEvent(new CustomEvent('trade-me-loaded', { detail: j })); } catch(e){}
})
.catch(function(){});
+ // Listen for save-state changes from any surface (PDP toggle, /me/saved Remove,
+ // future autocomplete heart, etc.) and re-sync the nav pill count without a fetch.
+ window.addEventListener('wallco-saved-changed', function(ev){
+ var countEl = document.getElementById('trade-nav-saved-count');
+ var n = ev && ev.detail && typeof ev.detail.saved_count === 'number' ? ev.detail.saved_count : null;
+ if (n === null) return; // fallback: ignore; nav can still hydrate on next page load
+ if (countEl) countEl.textContent = n;
+ if (window.__tradeMe) window.__tradeMe.saved_count = n;
+ });
})();
</script>
<span id="main-content" tabindex="-1"></span>`;
@@ -4353,10 +4364,9 @@ ${htmlHeader('/designs')}
if (j.ok) {
setSavedState(j.saved);
updateCount(j.saved_count);
- // bump header count, too
- var nav = document.getElementById('trade-nav-saved-count');
- if (nav) nav.textContent = j.saved_count;
if (window.__tradeMe) window.__tradeMe.saved_count = j.saved_count;
+ // Broadcast — nav listener (and any other surfaces) sync without re-fetching.
+ try { window.dispatchEvent(new CustomEvent('wallco-saved-changed', { detail: { saved_count: j.saved_count, design_id: thisId, saved: j.saved } })); } catch(e){}
} else {
alert(j.error || 'Save failed.');
}
← 84478a0 wallco.ai · /compare gets ?view=grid image-comparison mode (
·
back to Wallco Ai
·
fix /api/room: read fresh local_path from DB; add parallel r 78f4fe2 →