ra-core
Version:
Core components of react-admin, a frontend Framework for building admin applications on top of REST services, using ES6, React
114 lines • 3.8 kB
JavaScript
import { useCallback, useMemo } from 'react';
import { useUpdate } from "../../dataProvider/useUpdate.js";
import { useRedirect } from "../../routing/useRedirect.js";
import { useNotify } from "../../notification/useNotify.js";
import { useRecordContext } from "../record/useRecordContext.js";
import { useResourceContext } from "../../core/useResourceContext.js";
import { useTranslate } from "../../i18n/useTranslate.js";
/**
* Prepare a set of callbacks for an update button
*
* @example
* const UpdateButton = ({
* resource,
* record,
* redirect,
* ...rest
* }) => {
* const {
* isPending,
* handleUpdate,
* } = useUpdateController({
* mutationMode: 'pessimistic',
* resource,
* record,
* redirect,
* });
*
* const [open, setOpen] = useState(false);
*
* return (
* <Fragment>
* <Button
* onClick={() => setOpen(true)}
* label="ra.action.update"
* {...rest}
* >
* {icon}
* </Button>
* <Confirm
* isOpen={open}
* loading={isPending}
* title="ra.message.update_title"
* content="ra.message.update_content"
* titleTranslateOptions={{
* name: resource,
* id: record.id,
* }}
* contentTranslateOptions={{
* name: resource,
* id: record.id,
* }}
* onConfirm={() => handleUpdate()}
* onClose={() => setOpen(false)}
* />
* </Fragment>
* );
* };
*/
export const useUpdateController = (props) => {
const { redirect: redirectTo = false, mutationMode = 'undoable', mutationOptions = {}, successMessage, } = props;
const { meta: mutationMeta, ...otherMutationOptions } = mutationOptions;
const record = useRecordContext(props);
const resource = useResourceContext(props);
const notify = useNotify();
const redirect = useRedirect();
const translate = useTranslate();
const [updateOne, { isPending }] = useUpdate(resource, undefined, {
onSuccess: () => {
notify(successMessage ??
`resources.${resource}.notifications.updated`, {
type: 'info',
messageArgs: {
smart_count: 1,
_: translate('ra.notification.updated', {
smart_count: 1,
}),
},
undoable: mutationMode === 'undoable',
});
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,
},
});
},
mutationMode,
...otherMutationOptions,
});
const handleUpdate = useCallback((data) => {
if (!record) {
throw new Error('The record cannot be updated because no record has been passed');
}
updateOne(resource, {
id: record.id,
data,
previousData: record,
meta: mutationMeta,
});
}, [updateOne, mutationMeta, record, resource]);
return useMemo(() => ({
isPending,
isLoading: isPending,
handleUpdate,
}), [isPending, handleUpdate]);
};
//# sourceMappingURL=useUpdateController.js.map