37 lines · 1.2 KB · TypeScript
RawDownload
import { useAtomValue } from "@effect/atom-react";import * as Cause from "effect/Cause";import * as Effect from "effect/Effect";import * as Option from "effect/Option";import { AsyncResult, Atom } from "effect/unstable/reactivity";import { useCallback } from "react"; import { appAtomRegistry } from "../../rpc/atomRegistry";import { fetchSessionState } from "./auth"; const primarySessionStateAtom = Atom.make(Effect.promise(fetchSessionState)).pipe(  Atom.swr({ staleTime: 5_000, revalidateOnMount: true }),  Atom.setIdleTTL(5 * 60_000),  Atom.withLabel("primary-environment:session"),); function refreshPrimarySessionState(): void {  appAtomRegistry.refresh(primarySessionStateAtom);} export function usePrimarySessionState() {  const result = useAtomValue(primarySessionStateAtom);  const refresh = useCallback(() => {    refreshPrimarySessionState();  }, []);  let error: string | null = null;  if (result._tag === "Failure") {    const cause = Cause.squash(result.cause);    error = cause instanceof Error ? cause.message : "Could not read environment session.";  }  return {    data: Option.getOrNull(AsyncResult.value(result)),    error,    isPending: result.waiting,    refresh,  };}