@styra/opa-react
Version:
Styra-supported React hooks and components for frontend authorization based on @styra/opa
49 lines • 1.87 kB
JavaScript
import { useContext, useMemo } from "react";
import { AuthzContext } from "./authz-provider.js";
import merge from "lodash.merge";
import { useQuery, useQueries } from "@tanstack/react-query";
export default function useAuthz(pathOrArray, input, fromResult) {
const context = useContext(AuthzContext);
if (context === undefined) {
throw Error("Authz/useAuthz can only be used inside an AuthzProvider");
}
const { defaultPath, defaultInput, defaultFromResult, queryClient, opaClient, } = context;
if (isString(pathOrArray)) {
const path = pathOrArray;
const queryKey = useMemo(() => [path ?? defaultPath, mergeInput(input, defaultInput)], [path, defaultPath, input, defaultInput]);
const meta = useMemo(() => ({ fromResult: fromResult ?? defaultFromResult }), [fromResult, defaultFromResult]);
const result = useQuery({
queryKey,
meta,
enabled: !!opaClient,
}, queryClient);
return convertResult(result);
}
// multi-query case
const queries = pathOrArray;
return useQueries({
queries: queries.map(({ path, input, fromResult }) => ({
queryKey: [path ?? defaultPath, merge(input, defaultInput)],
meta: { fromResult: fromResult ?? defaultFromResult },
enabled: !!opaClient,
})),
}, queryClient).map(convertResult);
}
function mergeInput(input, defaultInput) {
if (!input)
return defaultInput;
if (!defaultInput)
return input;
return merge(input, defaultInput);
}
function convertResult({ isFetching: isLoading, data: result, error, }) {
return {
isLoading,
result,
error: error != null ? error : undefined,
};
}
function isString(x) {
return x === undefined || typeof x === "string";
}
//# sourceMappingURL=use-authz.js.map