You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
31 lines
979 B
31 lines
979 B
import { useMemo, useEffect, useRef } from "react";
|
|
import type {
|
|
Container,
|
|
ContainerUri,
|
|
LeafUri,
|
|
Resource,
|
|
Leaf,
|
|
} from "@ldo/solid";
|
|
import { useLdo } from "./SolidLdoProvider";
|
|
import { useForceReload } from "./util/useForceReload";
|
|
|
|
export function useResource(uri: ContainerUri): Container;
|
|
export function useResource(uri: LeafUri): Leaf;
|
|
export function useResource(uri: string): Leaf | Container;
|
|
export function useResource(uri: string): Leaf | Container {
|
|
const { getResource } = useLdo();
|
|
const resource = useMemo(() => getResource(uri), [getResource, uri]);
|
|
const pastResource = useRef<Resource | undefined>();
|
|
const forceReload = useForceReload();
|
|
useEffect(() => {
|
|
if (pastResource.current) {
|
|
pastResource.current.off("update", forceReload);
|
|
}
|
|
pastResource.current = resource;
|
|
resource.on("update", forceReload);
|
|
return () => {
|
|
resource.off("update", forceReload);
|
|
};
|
|
}, [resource]);
|
|
return resource;
|
|
}
|
|
|