UNPKG

ra-core

Version:

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

155 lines 6.49 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.useDataProvider = void 0; var react_1 = require("react"); var react_query_1 = require("@tanstack/react-query"); var DataProviderContext_1 = __importDefault(require("./DataProviderContext")); var defaultDataProvider_1 = require("./defaultDataProvider"); var validateResponseFormat_1 = __importDefault(require("./validateResponseFormat")); var useLogoutIfAccessDenied_1 = __importDefault(require("../auth/useLogoutIfAccessDenied")); var dataFetchActions_1 = require("./dataFetchActions"); var populateQueryCache_1 = require("./populateQueryCache"); /** * Hook for getting a dataProvider * * Gets a dataProvider object, which behaves just like the real dataProvider * (same methods returning a Promise). But it's actually a Proxy object, * which validates the response format, and logs the user out upon error * if authProvider.checkError() rejects. * * @return dataProvider * * @example Basic usage * * import * as React from 'react'; * import { useState } from 'react'; * import { useDataProvider } from 'react-admin'; * * const PostList = () => { * const [posts, setPosts] = useState([]) * const dataProvider = useDataProvider(); * useEffect(() => { * dataProvider.getList('posts', { filter: { status: 'pending' }}) * .then(({ data }) => setPosts(data)); * }, []) * * return ( * <Fragment> * {posts.map((post, key) => <PostDetail post={post} key={key} />)} * </Fragment> * ); * } * * @example Handling all states (loading, error, success) * * import { useState, useEffect } from 'react'; * import { useDataProvider } from 'react-admin'; * * const UserProfile = ({ userId }) => { * const dataProvider = useDataProvider(); * const [user, setUser] = useState(); * const [loading, setLoading] = useState(true); * const [error, setError] = useState(); * useEffect(() => { * dataProvider.getOne('users', { id: userId }) * .then(({ data }) => { * setUser(data); * setLoading(false); * }) * .catch(error => { * setError(error); * setLoading(false); * }) * }, []); * * if (loading) return <Loading />; * if (error) return <Error /> * if (!user) return null; * * return ( * <ul> * <li>Name: {user.name}</li> * <li>Email: {user.email}</li> * </ul> * ) * } */ var arrayReturnTypes = ['getList', 'getMany', 'getManyReference']; var useDataProvider = function () { var dataProvider = ((0, react_1.useContext)(DataProviderContext_1.default) || defaultDataProvider_1.defaultDataProvider); var queryClient = (0, react_query_1.useQueryClient)(); var logoutIfAccessDenied = (0, useLogoutIfAccessDenied_1.default)(); var dataProviderProxy = (0, react_1.useMemo)(function () { return new Proxy(dataProvider, { get: function (_, name) { if (typeof name === 'symbol' || name === 'then') { return; } if (name === 'supportAbortSignal') { return dataProvider.supportAbortSignal; } return function () { var args = []; for (var _i = 0; _i < arguments.length; _i++) { args[_i] = arguments[_i]; } var type = name.toString(); if (typeof dataProvider[type] !== 'function') { throw new Error("Unknown dataProvider function: ".concat(type)); } try { return dataProvider[type] .apply(dataProvider, args) .then(function (response) { var _a; if (process.env.NODE_ENV === 'development' && dataFetchActions_1.reactAdminFetchActions.includes(type)) { (0, validateResponseFormat_1.default)(response, type); } if ((_a = response === null || response === void 0 ? void 0 : response.meta) === null || _a === void 0 ? void 0 : _a.prefetched) { (0, populateQueryCache_1.populateQueryCache)({ data: response === null || response === void 0 ? void 0 : response.meta.prefetched, queryClient: queryClient, }); } return response; }) .catch(function (error) { if (process.env.NODE_ENV !== 'production' && // do not log AbortErrors !isAbortError(error)) { console.error(error); } return logoutIfAccessDenied(error).then(function (loggedOut) { if (loggedOut) return { data: arrayReturnTypes.includes(type) ? [] : {}, }; throw error; }); }); } catch (e) { if (process.env.NODE_ENV !== 'production') { console.error(e); } throw new Error('The dataProvider threw an error. It should return a rejected Promise instead.'); } }; }, }); }, [dataProvider, logoutIfAccessDenied, queryClient]); return dataProviderProxy; }; exports.useDataProvider = useDataProvider; var isAbortError = function (error) { return error instanceof DOMException && error.name === 'AbortError'; }; //# sourceMappingURL=useDataProvider.js.map