ra-core
Version:
Core components of react-admin, a frontend Framework for building admin applications on top of REST services, using ES6, React
80 lines • 3.15 kB
JavaScript
var __assign = (this && this.__assign) || function () {
__assign = Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.useRedirect = void 0;
var react_1 = require("react");
var react_router_dom_1 = require("react-router-dom");
var useBasename_1 = require("./useBasename");
var useCreatePath_1 = require("./useCreatePath");
/**
* Hook for Redirection Side Effect
*
* @example
*
* const redirect = useRedirect();
* // redirect to list view
* redirect('list', 'posts');
* // redirect to edit view
* redirect('edit', 'posts', 123);
* // redirect to edit view with state data
* redirect('edit', 'comments', 123, {}, { record: { post_id: record.id } });
* // do not redirect
* redirect(false);
* // redirect to the result of a function
* redirect((resource, id, data) => ...)
*/
var useRedirect = function () {
var navigate = (0, react_router_dom_1.useNavigate)();
var basename = (0, useBasename_1.useBasename)();
var createPath = (0, useCreatePath_1.useCreatePath)();
return (0, react_1.useCallback)(function (redirectTo, resource, id, data, state) {
var _a;
if (resource === void 0) { resource = ''; }
if (state === void 0) { state = {}; }
if (!redirectTo) {
return;
}
else if (typeof redirectTo === 'function') {
var target = redirectTo(resource, id, data);
var absoluteTarget = typeof target === 'string'
? "".concat(basename).concat(target.startsWith('/') ? '' : '/').concat(target)
: __assign({ pathname: "".concat(basename).concat(((_a = target.pathname) === null || _a === void 0 ? void 0 : _a.startsWith('/')) ? '' : '/').concat(target.pathname) }, target);
navigate(absoluteTarget, {
state: __assign({ _scrollToTop: true }, state),
});
return;
}
else if (typeof redirectTo === 'string' &&
redirectTo.startsWith('http') &&
window) {
// redirection to an absolute url
// history doesn't handle that case, so we handle it by hand
window.location.href = redirectTo;
return;
}
else {
// redirection to an internal link
navigate(createPath({ resource: resource, id: id, type: redirectTo }), {
state:
// We force the scrollToTop except when navigating to a list
// where this is already done by <RestoreScrollPosition> in <Resource>
redirectTo === 'list'
? state
: __assign({ _scrollToTop: true }, state),
});
return;
}
}, [navigate, basename, createPath]);
};
exports.useRedirect = useRedirect;
//# sourceMappingURL=useRedirect.js.map
;