1import { useAtomValue } from "@effect/atom-react";
2import { useEffect, useMemo } from "react";
3import { AppState } from "react-native";
4
5import { environmentPresentations } from "../state/presentation";
6import { serverEnvironment } from "../state/server";
7import { useAtomCommand } from "../state/use-atom-command";
8import { createWidgetRefresher, WIDGET_REFRESH_INTERVAL } from "./subscriptionUsageSnapshot";
9
10export function useSubscriptionUsage(enabled = true) {
11 const presentations = useAtomValue(environmentPresentations.presentationsAtom);
12 const refreshProviders = useAtomCommand(serverEnvironment.refreshProviders, {
13 reportFailure: false,
14 });
15 const refresh = useMemo(
16 () =>
17 createWidgetRefresher(
18 (environmentId: Parameters<typeof refreshProviders>[0]["environmentId"]) =>
19 refreshProviders({ environmentId, input: {} }),
20 ),
21 [refreshProviders],
22 );
23
24 useEffect(() => {
25 const update = () => {
26 if (!enabled || AppState.currentState !== "active") return;
27 const connected = [...presentations]
28 .filter(([, presentation]) => presentation.connection.phase === "connected")
29 .map(([id]) => id);
30 void refresh(connected, Date.now());
31 };
32 update();
33 const subscription = AppState.addEventListener("change", update);
34 const timer = setInterval(update, WIDGET_REFRESH_INTERVAL);
35 return () => {
36 subscription.remove();
37 clearInterval(timer);
38 };
39 }, [enabled, presentations, refresh]);
40}