[object Object]

← 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 →