f87e4c0d6b
Generalise printer-only monitoring to every configured device. New DeviceMonitor polls all enabled devices each tick (default 8s): printers via rich readStatus(), relays/readers/cameras via the generic healthCheck() reachability probe, flattened to one traffic-light (ready/degraded/offline) + detail, deduped (emit on change only), fail-toward-offline. - device-status bus event + GET /api/devices/status snapshot. - Pushed over the existing /api/ws (hello carries the initial set; device-status frame per change). - Web: live-store devices map, WS handler, DeviceFooter chip-per-device (role label not vendor; click a degraded/offline chip for an issues panel). Verified roleKind resolution + change-only emit on a fresh DB. Note: the footer's UI surface (api type, router mount, i18n devices) rides in the subsequent subscription commit due to shared-file overlap. Claude-Session: https://claude.ai/code/session_01Xcm6ikLgGoCxxHrxtjkk5V
31 lines
1.1 KiB
TypeScript
31 lines
1.1 KiB
TypeScript
import { QueryClient } from "@tanstack/react-query";
|
|
|
|
// Single QueryClient for the app. TanStack Query owns SERVER state (fetch, cache,
|
|
// refetch, loading/error) — wrapping the existing thin api.ts fetchers. Client/UI
|
|
// state (live feed, WS status) lives in Zustand, not here. The WS layer invalidates
|
|
// these caches on live events so Query stays the source of truth for server data.
|
|
//
|
|
// Defaults tuned for a single-appliance booth: no window-focus refetch (it's a
|
|
// kiosk, not a tab someone switches to), and a short staleTime since the WS is the
|
|
// real freshness mechanism — queries are the fallback/initial load.
|
|
export const queryClient = new QueryClient({
|
|
defaultOptions: {
|
|
queries: {
|
|
refetchOnWindowFocus: false,
|
|
staleTime: 5_000,
|
|
retry: 1,
|
|
},
|
|
},
|
|
});
|
|
|
|
/** Stable query keys — referenced by both the screens and the WS invalidator. */
|
|
export const qk = {
|
|
me: ["me"] as const,
|
|
occupancy: ["occupancy"] as const,
|
|
events: ["events"] as const,
|
|
activeSessions: ["active-sessions"] as const,
|
|
siteConfig: ["site-config"] as const,
|
|
shift: ["shift"] as const,
|
|
deviceStatus: ["device-status"] as const,
|
|
} as const;
|