UNPKG

ra-core

Version:

Core components of react-admin, a frontend Framework for building admin applications on top of REST services, using ES6, React

86 lines (81 loc) 2.34 kB
import { RaRecord, Identifier } from '../types'; import { UseGetManyHookValue, useGetManyAggregate } from '../dataProvider'; import { UseQueryOptions } from '@tanstack/react-query'; interface UseReferenceProps< RecordType extends RaRecord = any, ErrorType = Error, > { id: Identifier; reference: string; options?: Omit< UseQueryOptions<RecordType[], ErrorType>, 'queryFn' | 'queryKey' > & { meta?: any; }; } export interface UseReferenceResult< RecordType extends RaRecord = any, ErrorType = Error, > { isLoading: boolean; isPending: boolean; isFetching: boolean; referenceRecord?: RecordType; error?: ErrorType | null; refetch: UseGetManyHookValue<RecordType, ErrorType>['refetch']; } /** * @typedef UseReferenceResult * @type {Object} * @property {boolean} isFetching: boolean indicating if the reference is loading * @property {boolean} isLoading: boolean indicating if the reference has loaded at least once * @property {Object} referenceRecord: the referenced record. */ /** * Fetch reference record, and return it when available * * The reference prop should be the name of one of the <Resource> components * added as <Admin> child. * * @example * * const { isLoading, referenceRecord } = useReference({ * id: 7, * reference: 'users', * }); * * @param {Object} option * @param {string} option.reference The linked resource name * @param {string} option.id The id of the reference * @param {Object} option.options Options passed to the dataProvider * * @returns {UseReferenceResult} The reference record */ export const useReference = < RecordType extends RaRecord = RaRecord, ErrorType = Error, >({ reference, id, options = {}, }: UseReferenceProps<RecordType, ErrorType>): UseReferenceResult< RecordType, ErrorType > => { const { meta, ...otherQueryOptions } = options; const { data, error, isLoading, isFetching, isPending, refetch } = useGetManyAggregate<RecordType, ErrorType>( reference, { ids: [id], meta }, otherQueryOptions ); return { referenceRecord: error ? undefined : data ? data[0] : undefined, refetch, error, isLoading, isFetching, isPending, }; };