{/* ── Wall bar: drill crumbs · KPIs · auto-tour · clock ── */}
- {crumb("Region", !link.inc, true, () => setLink({ inc: null, cam: null, tour: false }))}
+ {crumb("Region", !link.inc, true, () => patchLink({ inc: null, cam: null, tour: false }))}
›
{crumb(selected?.title ? `Incident: ${selected.title.slice(0, 32)}` : "Incident", !!link.inc && !link.cam, !!link.inc,
- () => setLink({ ...link, cam: null, tour: false }))}
+ () => patchLink({ cam: null, tour: false }))}
›
{crumb("Camera", !!link.cam, !!link.cam, () => undefined)}
@@ -268,7 +346,7 @@ export function LiveView() {
- setLink({ ...link, cam: null, tour: !link.tour })}
+ patchLink({ cam: null, tour: !link.tour })}
title="Wall mode: cycle through active incidents, worst first"
className={`px-2 py-0.5 rounded border ${link.tour ? "bg-accent text-white border-accent" : "border-line text-ink-2 hover:text-ink"}`}>
Auto-tour
@@ -278,9 +356,15 @@ export function LiveView() {
)}
+
+ {copied === "ok" ? "Link copied" : copied === "fail" ? "Copy failed — use the address bar" : "Copy view link"}
+
+
{clock}
@@ -288,7 +372,7 @@ export function LiveView() {
{/* Degraded → grey the map and its incident rail (the rail lives inside
MapView, so it is wrapped here rather than edited). */}
- {nodesLoading || callsLoading ? (
+ {nodesLoading || callsLoading || !mapState ? (
Loading map…
) : (
)}
@@ -317,7 +406,7 @@ export function LiveView() {
)}