pankod/refine

View on GitHub
packages/core/src/hooks/auth/useGetIdentity/index.ts

Summary

Maintainability
A
55 mins
Test Coverage
A
100%
import { getXRay } from "@refinedev/devtools-internal";
import {
  UseQueryOptions,
  UseQueryResult,
  useQuery,
} from "@tanstack/react-query";

import { useAuthBindingsContext, useLegacyAuthContext } from "@contexts/auth";
import { useKeys } from "@hooks/useKeys";

import { IdentityResponse } from "../../../contexts/auth/types";

export type UseGetIdentityLegacyProps<TData> = {
  v3LegacyAuthProviderCompatible: true;
  queryOptions?: UseQueryOptions<TData>;
};

export type UseGetIdentityProps<TData = IdentityResponse> = {
  v3LegacyAuthProviderCompatible?: false;
  queryOptions?: UseQueryOptions<TData>;
};

export type UseGetIdentityCombinedProps<TData = any> = {
  v3LegacyAuthProviderCompatible: boolean;
  queryOptions?: UseQueryOptions<TData> | UseQueryOptions<IdentityResponse>;
};

export type UseGetIdentityLegacyReturnType<TData> = UseQueryResult<
  TData,
  unknown
>;

export type UseGetIdentityReturnType<TData = IdentityResponse> = UseQueryResult<
  TData,
  unknown
>;

export type UsePermissionsCombinedReturnType<TData = any> =
  | UseQueryResult<TData, unknown>
  | UseQueryResult<IdentityResponse, unknown>;

export function useGetIdentity<TData = any>(
  props: UseGetIdentityLegacyProps<TData>,
): UseGetIdentityLegacyReturnType<TData>;

export function useGetIdentity<TData = IdentityResponse>(
  props?: UseGetIdentityProps<TData>,
): UseGetIdentityReturnType<TData>;

export function useGetIdentity<TData = any>(
  props?: UseGetIdentityCombinedProps<TData>,
): UsePermissionsCombinedReturnType<TData>;

/**
 * `useGetIdentity` calls the `getUserIdentity` method from the {@link https://refine.dev/docs/core/providers/auth-provider `authProvider`} under the hood.
 *
 * @see {@link https://refine.dev/docs/api-reference/core/hooks/auth/useGetIdentity} for more details.
 *
 * @typeParam TData - Result data of the query
 *
 */
export function useGetIdentity<TData = any>({
  v3LegacyAuthProviderCompatible = false,
  queryOptions,
}: UseGetIdentityProps<TData> | UseGetIdentityLegacyProps<TData> = {}):
  | UseGetIdentityReturnType<TData>
  | UseGetIdentityLegacyReturnType<TData> {
  const { getUserIdentity: legacyGetUserIdentity } = useLegacyAuthContext();
  const { getIdentity } = useAuthBindingsContext();
  const { keys, preferLegacyKeys } = useKeys();

  const queryResponse = useQuery<TData>({
    queryKey: keys().auth().action("identity").get(preferLegacyKeys),
    // Enabled check for `getIdentity` is enough to be sure that it's defined in the query function but TS is not smart enough to know that.
    queryFn:
      (getIdentity as (params?: unknown) => Promise<TData>) ??
      (() => Promise.resolve({})),
    enabled: !v3LegacyAuthProviderCompatible && !!getIdentity,
    retry: false,
    ...(v3LegacyAuthProviderCompatible === true ? {} : queryOptions),
    meta: {
      ...(v3LegacyAuthProviderCompatible === true ? {} : queryOptions?.meta),
      ...getXRay("useGetIdentity", preferLegacyKeys),
    },
  });

  const legacyQueryResponse = useQuery<TData>({
    queryKey: [
      ...keys().auth().action("identity").get(preferLegacyKeys),
      "v3LegacyAuthProviderCompatible",
    ],
    // Enabled check for `getUserIdentity` is enough to be sure that it's defined in the query function but TS is not smart enough to know that.
    queryFn: legacyGetUserIdentity ?? (() => Promise.resolve({})),
    enabled: v3LegacyAuthProviderCompatible && !!legacyGetUserIdentity,
    retry: false,
    ...(v3LegacyAuthProviderCompatible ? queryOptions : {}),
    meta: {
      ...(v3LegacyAuthProviderCompatible ? queryOptions?.meta : {}),
      ...getXRay("useGetIdentity", preferLegacyKeys),
    },
  });

  return v3LegacyAuthProviderCompatible ? legacyQueryResponse : queryResponse;
}