[object Object]

← back to Commercialrealestate

CRCP: soften dev-facing load errors + one-shot auto-retry on ranked.json & broker leads

00b81923aaaa200e403fb39baf080e50b9fa981e · 2026-08-06 16:17:18 -0700 · Steve Abrams

Files touched

Diff

commit 00b81923aaaa200e403fb39baf080e50b9fa981e
Author: Steve Abrams <steve@designerwallcoverings.com>
Date:   Thu Aug 6 16:17:18 2026 -0700

    CRCP: soften dev-facing load errors + one-shot auto-retry on ranked.json & broker leads
---
 public/index.html | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/public/index.html b/public/index.html
index e60fdb5..529d57d 100644
--- a/public/index.html
+++ b/public/index.html
@@ -584,10 +584,10 @@
         return '<a class="figli" href="'+esc(p.permalink)+'" target="_blank" rel="noopener noreferrer">'+thumb+'<span class="figb"><span class="figc">'+vid+cap+' ↗</span><span class="figm">'+(when?when+' · ':'')+'♥ '+(p.likes||0)+' · 💬 '+(p.comments||0)+'</span></span></a>'; }).join('');
       return '<div class="figwrap"><div class="fighd">📷 @'+esc(h)+' · firm’s latest 3</div>'+items+'</div>'; }
     // Ranked top brokers — expandable to spreadsheet-style current listings + Sold + per-address history.
-    fetch('/api/leads/top?limit=40').then(r=>r.json()).then(async d=>{
+    (function loadBkLeads(_retry){ fetch('/api/leads/top?limit=40').then(r=>{ if(!r.ok) throw new Error('HTTP '+r.status); return r.json(); }).then(async d=>{
       await firmIgReady;
       const leads=d.leads||[];
-      if(!leads.length){ bq('#bkleads').innerHTML='<div class="gate">no brokers (broker DB unavailable)</div>'; return; }
+      if(!leads.length){ bq('#bkleads').innerHTML='<div class="gate">No brokers to show yet.</div>'; return; }
       bq('#bkleads').innerHTML=leads.map((l,i)=>{
         const rows=(l.listings_json||[]).map(p=>'<tr class="mrow" data-addr="'+esc(p.address)+'" data-city="'+esc(p.city||'')+'">'
           +'<td>'+esc(p.address)+'<div style="color:var(--mut);font-size:11px">'+esc(p.city||'')+(p.zip?' '+esc(p.zip):'')+'</div></td>'
@@ -609,7 +609,7 @@
         const act=e.target.closest('[data-act]'); if(act){ if(act.dataset.act==='contact') openContact(lead.dataset.name, lead.dataset.id); else brokerSold(lead.dataset.id, act); return; }
         if(e.target.closest('.lhead')) lead.classList.toggle('open');
       };
-    }).catch(()=>{ bq('#bkleads').innerHTML='<div class="gate">broker DB unavailable</div>'; });
+    }).catch(e=>{ if(_retry>0){ setTimeout(()=>loadBkLeads(_retry-1),1500); return; } bq('#bkleads').innerHTML='<div class="gate">Broker data is temporarily unavailable — please refresh.</div>'; console.warn('leads/top load failed:',e); }); })(1);
   })();
   </script>
   <div class="bar">
@@ -1888,7 +1888,7 @@ function mapCondo(c){
     beds:c.beds, baths:c.baths, sqft:c.sqft, hoa:c.hoa, broker_name:c.broker_name,
     project_name:c.project_name, upside_note:null, qwen:null };
 }
-fetch('data/ranked.json').then(r=>r.json()).then(async d=>{
+function loadRanked(_retry){ fetch('data/ranked.json').then(r=>{ if(!r.ok) throw new Error('HTTP '+r.status); return r.json(); }).then(async d=>{
   DATA=d; if(window.__comps) DATA.comps=window.__comps;
   // Merge condo inventory in-grid (best-effort; explorer still works if the API is down).
   let condoN=0; try{ const cd=await (await fetch('/api/condos')).json(); const cs=(cd.condos||[]).map(mapCondo); condoN=cs.length; DATA.ranked=DATA.ranked.concat(cs); }catch(e){}
@@ -2011,7 +2011,7 @@ fetch('data/ranked.json').then(r=>r.json()).then(async d=>{
 
   window.DATA_READY = true;
   recompute(); syncChips(); render();
-}).catch(e=>{ $('#sub').textContent='Failed to load data/ranked.json — run: npm run analyze'; });
+}).catch(e=>{ if(_retry>0){ setTimeout(()=>loadRanked(_retry-1),1500); return; } $('#sub').textContent='Listings are still loading — refresh in a moment if this persists.'; console.warn('ranked.json load failed:',e); }); } loadRanked(1);
 </script>
   <script src="/col-resize.js" defer></script>
   <script src="/global-search.js" defer></script>

← bd5c023 Polish corner nav: type-to-filter search, focus-on-open, cur  ·  back to Commercialrealestate  ·  CRCP: retry ranked.json fetch-only so success body (12 event f05ff59 →