useDeleteEntity: support onSuccess callback

This commit is contained in:
Alex Gleason 2023-03-23 10:45:49 -05:00
parent 1949651b9a
commit 4783a41b78
No known key found for this signature in database
GPG key ID: 7211D1F99744FBB7

View file

@ -4,16 +4,23 @@ import { deleteEntities, importEntities } from '../actions';
type DeleteFn<T> = (entityId: string) => Promise<T> | T;
interface EntityCallbacks {
onSuccess?(): void
}
/**
* Optimistically deletes an entity from the store.
* This hook should be used to globally delete an entity from all lists.
* To remove an entity from a single list, see `useDismissEntity`.
*/
function useDeleteEntity<T = unknown>(entityType: string, deleteFn: DeleteFn<T>) {
function useDeleteEntity<T = unknown>(
entityType: string,
deleteFn: DeleteFn<T>,
) {
const dispatch = useAppDispatch();
const getState = useGetState();
return async function deleteEntity(entityId: string): Promise<T> {
return async function deleteEntity(entityId: string, callbacks: EntityCallbacks = {}): Promise<T> {
// Get the entity before deleting, so we can reverse the action if the API request fails.
const entity = getState().entities[entityType]?.store[entityId];
@ -24,6 +31,11 @@ function useDeleteEntity<T = unknown>(entityType: string, deleteFn: DeleteFn<T>)
const result = await deleteFn(entityId);
// Success - finish deleting entity from the state.
dispatch(deleteEntities([entityId], entityType));
if (callbacks.onSuccess) {
callbacks.onSuccess();
}
return result;
} catch (e) {
if (entity) {