UNPKG

@styra/opa-react

Version:

Styra-supported React hooks and components for frontend authorization based on @styra/opa

49 lines 1.87 kB
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