ra-core
Version:
Core components of react-admin, a frontend Framework for building admin applications on top of REST services, using ES6, React
68 lines • 2.54 kB
JavaScript
import get from 'lodash/get.js';
import { useRecordContext } from "../record/index.js";
import { useGetManyReference } from "../../dataProvider/index.js";
import { useNotify } from "../../notification/index.js";
/**
* Fetch a reference record in a one-to-one relationship, and return it when available
*
* The reference prop should be the name of one of the <Resource> components
* added as <Admin> child.
*
* @example
*
* const { data, isPending, error } = useReferenceOneFieldController({
* record: { id: 7, name: 'James Joyce'}
* reference: 'bios',
* target: 'author_id',
* });
*
* @typedef {Object} UseReferenceOneFieldControllerParams
* @prop {Object} props.record The current resource record
* @prop {string} props.reference The linked resource name
* @prop {string} props.target The target resource key
* @prop {string} props.source The key current record identifier ('id' by default)
* @prop {Object} props.sort The sort to apply to the referenced records
* @prop {Object} props.filter The filter to apply to the referenced records
* @returns {UseReferenceResult} The request state. Destructure as { referenceRecord, isPending, error }.
*/
export const useReferenceOneFieldController = (props) => {
const { reference, target, source = 'id', sort = { field: 'id', order: 'ASC' }, filter = {}, queryOptions = {}, } = props;
const record = useRecordContext(props);
const notify = useNotify();
const { meta, ...otherQueryOptions } = queryOptions;
const { data, error, isFetching, isLoading, isPaused, isPending, isPlaceholderData, refetch, } = useGetManyReference(reference, {
target,
id: get(record, source),
pagination: { page: 1, perPage: 1 },
sort,
filter,
meta,
}, {
enabled: !!record,
onError: error => notify(typeof error === 'string'
? error
: error.message ||
'ra.notification.http_error', {
type: 'error',
messageArgs: {
_: typeof error === 'string'
? error
: error?.message
? error.message
: undefined,
},
}),
...otherQueryOptions,
});
return {
referenceRecord: data ? data[0] : undefined,
error,
isFetching,
isLoading,
isPaused,
isPending,
isPlaceholderData,
refetch,
};
};
//# sourceMappingURL=useReferenceOneFieldController.js.map