import { useCallback, ReactEventHandler } from 'react';
import { UseMutationOptions } from 'react-query';
import { useDelete } from '../../dataProvider';
import { useUnselect } from '../../controller';
import { useRedirect, RedirectionSideEffect } from '../../routing';
import { useNotify } from '../../notification';
import { RaRecord, DeleteParams } from '../../types';
import { useResourceContext } from '../../core';
/**
* Prepare callback for a Delete button with undo support
*
* @example
*
* import React from 'react';
* import ActionDelete from '@mui/icons-material/Delete';
* import { Button, useDeleteWithUndoController } from 'mv-tmp';
*
* const DeleteButton = ({
* resource,
* record,
* redirect,
* onClick,
* ...rest
* }) => {
* const { isLoading, handleDelete } = useDeleteWithUndoController({
* resource,
* record,
* redirect,
* onClick,
* });
*
* return (
*
* );
* };
*/
const useDeleteWithUndoController = (
props: UseDeleteWithUndoControllerParams
): UseDeleteWithUndoControllerReturn => {
const {
record,
redirect: redirectTo = 'list',
onClick,
mutationOptions = {},
} = props;
const { meta: mutationMeta, ...otherMutationOptions } = mutationOptions;
const resource = useResourceContext(props);
const notify = useNotify();
const unselect = useUnselect(resource);
const redirect = useRedirect();
const [deleteOne, { isLoading }] = useDelete();
const handleDelete = useCallback(
event => {
event.stopPropagation();
deleteOne(
resource,
{
id: record.id,
previousData: record,
meta: mutationMeta,
},
{
onSuccess: () => {
notify('ra.notification.deleted', {
type: 'info',
messageArgs: { smart_count: 1 },
undoable: true,
});
unselect([record.id]);
redirect(redirectTo, resource);
},
onError: (error: Error) => {
notify(
typeof error === 'string'
? error
: error.message || 'ra.notification.http_error',
{
type: 'error',
messageArgs: {
_:
typeof error === 'string'
? error
: error && error.message
? error.message
: undefined,
},
}
);
},
mutationMode: 'undoable',
...otherMutationOptions,
}
);
if (typeof onClick === 'function') {
onClick(event);
}
},
[
deleteOne,
mutationMeta,
otherMutationOptions,
notify,
onClick,
record,
redirect,
redirectTo,
resource,
unselect,
]
);
return { isLoading, handleDelete };
};
export interface UseDeleteWithUndoControllerParams<
RecordType extends RaRecord = any,
MutationOptionsError = unknown
> {
record?: RecordType;
redirect?: RedirectionSideEffect;
// @deprecated. This hook get the resource from the context
resource?: string;
onClick?: ReactEventHandler;
mutationOptions?: UseMutationOptions<
RecordType,
MutationOptionsError,
DeleteParams
>;
}
export interface UseDeleteWithUndoControllerReturn {
isLoading: boolean;
handleDelete: ReactEventHandler;
}
export default useDeleteWithUndoController;