ra-core
Version:
Core components of react-admin, a frontend Framework for building admin applications on top of REST services, using ES6, React
124 lines • 4.31 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.useDeleteController = void 0;
const react_1 = require("react");
const useDelete_1 = require("../../dataProvider/useDelete.cjs");
const useUnselect_1 = require("../list/useUnselect.cjs");
const useRecordContext_1 = require("../record/useRecordContext.cjs");
const useRedirect_1 = require("../../routing/useRedirect.cjs");
const useNotify_1 = require("../../notification/useNotify.cjs");
const useResourceContext_1 = require("../../core/useResourceContext.cjs");
const useTranslate_1 = require("../../i18n/useTranslate.cjs");
/**
* Prepare a set of callbacks for a delete button
*
* @example
* const DeleteButton = ({
* redirect,
* ...rest
* }) => {
* const {
* isPending,
* handleDelete,
* } = useDeleteController({
* mutationMode: 'pessimistic',
* redirect,
* });
*
* const [open, setOpen] = useState(false);
*
* return (
* <Fragment>
* <Button
* onClick={() => setOpen(true)}
* label="ra.action.delete"
* {...rest}
* >
* {icon}
* </Button>
* <Confirm
* isOpen={open}
* loading={isPending}
* title="ra.message.delete_title"
* content="ra.message.delete_content"
* titleTranslateOptions={{
* name: resource,
* id: record.id,
* }}
* contentTranslateOptions={{
* name: resource,
* id: record.id,
* }}
* onConfirm={() => handleDelete()}
* onClose={() => setOpen(false)}
* />
* </Fragment>
* );
* };
*/
const useDeleteController = (props) => {
const { redirect: redirectTo = 'list', mutationMode = 'undoable', mutationOptions = {}, successMessage, } = props;
const { meta: mutationMeta, ...otherMutationOptions } = mutationOptions;
const record = (0, useRecordContext_1.useRecordContext)(props);
const resource = (0, useResourceContext_1.useResourceContext)(props);
const notify = (0, useNotify_1.useNotify)();
const unselect = (0, useUnselect_1.useUnselect)(resource);
const redirect = (0, useRedirect_1.useRedirect)();
const translate = (0, useTranslate_1.useTranslate)();
const [deleteOne, { isPending }] = (0, useDelete_1.useDelete)(resource, undefined, {
onSuccess: () => {
notify(successMessage ??
`resources.${resource}.notifications.deleted`, {
type: 'info',
messageArgs: {
smart_count: 1,
_: translate('ra.notification.deleted', {
smart_count: 1,
}),
},
undoable: mutationMode === 'undoable',
});
record && unselect([record.id], true);
redirect(redirectTo, resource);
},
onError: (error) => {
notify(typeof error === 'string'
? error
: error?.message || 'ra.notification.http_error', {
type: 'error',
messageArgs: {
_: typeof error === 'string'
? error
: error?.message,
},
});
},
});
const handleDelete = (0, react_1.useCallback)(() => {
if (!record) {
throw new Error('The record cannot be deleted because no record has been passed');
}
deleteOne(resource, {
id: record.id,
previousData: record,
meta: mutationMeta,
}, {
mutationMode,
...otherMutationOptions,
});
}, [
deleteOne,
mutationMeta,
mutationMode,
otherMutationOptions,
record,
resource,
]);
return (0, react_1.useMemo)(() => ({
isPending,
isLoading: isPending,
handleDelete,
}), [isPending, handleDelete]);
};
exports.useDeleteController = useDeleteController;
//# sourceMappingURL=useDeleteController.js.map