rescribet/link-redux

View on GitHub
src/hooks/useDataFetching.ts

Summary

Maintainability
A
0 mins
Test Coverage
A
100%
import { NamedNode } from "@ontologies/core";
import { normalizeType } from "link-lib";
import React from "react";
import { useMemoizedDataSubjects } from "../helpers";
import { LaxNode } from "../types";

import { useDataInvalidation } from "./useDataInvalidation";

import { useLRS } from "./useLRS";

/**
 * Fetches the {props.subject} if it has no data or is expired.
 *
 * @param resources The resources to fetch.
 * @return The last update stamp, useful in a hook dependency list.
 *
 * @see {LinkedRenderStore#shouldLoadResource} for the triggering mechanism.
 */
export function useDataFetching(resources: LaxNode | LaxNode[]): number {
    const lrs = useLRS();
    const lastUpdate = useDataInvalidation(resources);

    React.useEffect(
        () => {
            const toCheck = normalizeType(resources);
            for (const resource of toCheck) {
              if (resource && lrs.shouldLoadResource(resource)) {
                  lrs.queueEntity(resource as NamedNode);
              }
            }
        },
        [
          lrs,
          useMemoizedDataSubjects(resources),
          lastUpdate,
        ],
    );

    return lastUpdate;
}