amarorn / frontend /src /infrastructure /api /dataPulseStore.ts
beAnalytic's picture
feat: sync main with feature/superbet-live-inplay
16c19b8 verified
Raw
History Blame Contribute Delete
1.46 kB
import { useSyncExternalStore } from "react";
export interface DataPulse {
pulseAt: string;
articlesSilver: number;
fixtures: number;
wcModelsReady: boolean;
collectionsLastRun: string | null;
latestSilverAt: string | null;
}
let snapshot: DataPulse | null = null;
const listeners = new Set<() => void>();
function emit() {
listeners.forEach((fn) => fn());
}
export function applyDataPulseFromHeaders(headers: Headers): void {
const pulseAt = headers.get("X-Data-Pulse-At");
const articles = headers.get("X-Articles-Silver");
if (!pulseAt || articles === null) return;
const fixtures = headers.get("X-Fixtures");
const lastRun = headers.get("X-Collections-Last-Run");
const latestSilver = headers.get("X-Latest-Silver-At");
snapshot = {
pulseAt,
articlesSilver: Number.parseInt(articles, 10) || 0,
fixtures: Number.parseInt(fixtures ?? "0", 10) || 0,
wcModelsReady: headers.get("X-WC-Models-Ready") === "true",
collectionsLastRun: lastRun && lastRun.length > 0 ? lastRun : null,
latestSilverAt: latestSilver && latestSilver.length > 0 ? latestSilver : null,
};
emit();
}
export function getDataPulseSnapshot(): DataPulse | null {
return snapshot;
}
export function useDataPulse(): DataPulse | null {
return useSyncExternalStore(
(onStoreChange) => {
listeners.add(onStoreChange);
return () => listeners.delete(onStoreChange);
},
() => snapshot,
() => snapshot,
);
}