rescribet/link-redux

View on GitHub
src/hooks/useRecordStatus.ts

Summary

Maintainability
A
0 mins
Test Coverage
A
100%
import { RecordState, RecordStatus, SomeNode } from "link-lib";
import React from "react";

import { useDataInvalidation } from "./useDataInvalidation";
import { useLinkRenderContext } from "./useLinkRenderContext";
import { useLRS } from "./useLRS";

export function isBackgroundLoading(status: RecordStatus): boolean {
  const { current, previous } = status;

  return current !== RecordState.Present && (previous === RecordState.Present && current !== RecordState.Absent);
}

export function isFullyLoaded(status: RecordStatus): boolean {
  return status.current === RecordState.Present;
}

export const useRecordStatus = (id: SomeNode | undefined = undefined): RecordStatus => {
  const lrs = useLRS();
  const { subject } = useLinkRenderContext();
  const target = id ?? subject;

  const [status, setStatus] = React.useState(() => lrs.getState(target.value));
  const update = useDataInvalidation(target);

  React.useEffect(() => {
    setStatus(lrs.getState(target.value));
  }, [target, update]);

  return status;
};