/* global React */ /** * PharmacySummary — Live pharmacy ops widget (M2 data wiring) * GET /api/v1/public/pharmacy/summary (unauthenticated, 5-min refresh) * DATA_CONTRACTS: pharmacy.json */ const { useState, useEffect } = React; const API = "https://api.conceptualhealth.com/api/v1/public/pharmacy/summary"; const REFRESH_MS = 5 * 60 * 1000; const DEMO = { skus_on_hand: 2847, refills_pending: 14, adherence_pdc_pct: 83.2, csm_alerts_open: 0, nutrition_rxs_active: 126 }; function Tile({ label, value, sub, accent }) { return (
{label}
{value}
{sub &&
{sub}
}
); } function PharmacySummary() { const [data, setData] = useState(null); const [live, setLive] = useState(false); const fetch_ = () => fetch(API).then(r => r.ok ? r.json() : null).then(j => { if (j) { setData(j); setLive(true); } else { setData(DEMO); setLive(false); } }).catch(() => { setData(DEMO); setLive(false); }); useEffect(() => { fetch_(); const id = setInterval(fetch_, REFRESH_MS); return () => clearInterval(id); }, []); if (!data) return null; const badge = { display: "inline-flex", alignItems: "center", gap: 5, fontSize: 9, fontFamily: "var(--font-mono,monospace)", padding: "3px 9px", borderRadius: 20, background: live ? "rgba(16,185,129,0.12)" : "rgba(156,163,175,0.12)", color: live ? "#10b981" : "#9ca3af", border: live ? "1px solid rgba(16,185,129,0.25)" : "1px solid rgba(156,163,175,0.2)" }; return (
Pharmacy live data
{live ? "LIVE" : "DEMO"}
0 ? "#fbbf24" : undefined} sub="awaiting fill" /> 0 ? "#ef4444" : undefined} sub="controlled substance" />
); } window.PharmacySummary = PharmacySummary;