mirror of
https://github.com/invoke-ai/InvokeAI
synced 2024-08-30 20:32:17 +00:00
feat(ui): improve image delete handling
This commit is contained in:
parent
0d5f44b153
commit
6059db4f15
@ -12,7 +12,12 @@ import {
|
|||||||
addImageUploadedFulfilledListener,
|
addImageUploadedFulfilledListener,
|
||||||
addImageUploadedRejectedListener,
|
addImageUploadedRejectedListener,
|
||||||
} from './listeners/imageUploaded';
|
} from './listeners/imageUploaded';
|
||||||
import { addRequestedImageDeletionListener } from './listeners/imageDeleted';
|
import {
|
||||||
|
addImageDeletedFulfilledListener,
|
||||||
|
addImageDeletedPendingListener,
|
||||||
|
addImageDeletedRejectedListener,
|
||||||
|
addRequestedImageDeletionListener,
|
||||||
|
} from './listeners/imageDeleted';
|
||||||
import { addUserInvokedCanvasListener } from './listeners/userInvokedCanvas';
|
import { addUserInvokedCanvasListener } from './listeners/userInvokedCanvas';
|
||||||
import { addUserInvokedNodesListener } from './listeners/userInvokedNodes';
|
import { addUserInvokedNodesListener } from './listeners/userInvokedNodes';
|
||||||
import { addUserInvokedTextToImageListener } from './listeners/userInvokedTextToImage';
|
import { addUserInvokedTextToImageListener } from './listeners/userInvokedTextToImage';
|
||||||
@ -50,13 +55,17 @@ export type AppListenerEffect = ListenerEffect<
|
|||||||
AppDispatch
|
AppDispatch
|
||||||
>;
|
>;
|
||||||
|
|
||||||
// Image uploads
|
// Image uploaded
|
||||||
addImageUploadedFulfilledListener();
|
addImageUploadedFulfilledListener();
|
||||||
addImageUploadedRejectedListener();
|
addImageUploadedRejectedListener();
|
||||||
|
|
||||||
addInitialImageSelectedListener();
|
addInitialImageSelectedListener();
|
||||||
|
|
||||||
|
// Image deleted
|
||||||
addRequestedImageDeletionListener();
|
addRequestedImageDeletionListener();
|
||||||
|
addImageDeletedPendingListener();
|
||||||
|
addImageDeletedFulfilledListener();
|
||||||
|
addImageDeletedRejectedListener();
|
||||||
|
|
||||||
// Invoking stuff
|
// Invoking stuff
|
||||||
addUserInvokedCanvasListener();
|
addUserInvokedCanvasListener();
|
||||||
|
@ -4,9 +4,14 @@ import { imageDeleted } from 'services/thunks/image';
|
|||||||
import { log } from 'app/logging/useLogger';
|
import { log } from 'app/logging/useLogger';
|
||||||
import { clamp } from 'lodash-es';
|
import { clamp } from 'lodash-es';
|
||||||
import { imageSelected } from 'features/gallery/store/gallerySlice';
|
import { imageSelected } from 'features/gallery/store/gallerySlice';
|
||||||
|
import { uploadsAdapter } from 'features/gallery/store/uploadsSlice';
|
||||||
|
import { resultsAdapter } from 'features/gallery/store/resultsSlice';
|
||||||
|
|
||||||
const moduleLog = log.child({ namespace: 'addRequestedImageDeletionListener' });
|
const moduleLog = log.child({ namespace: 'addRequestedImageDeletionListener' });
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called when the user requests an image deletion
|
||||||
|
*/
|
||||||
export const addRequestedImageDeletionListener = () => {
|
export const addRequestedImageDeletionListener = () => {
|
||||||
startAppListening({
|
startAppListening({
|
||||||
actionCreator: requestedImageDeletion,
|
actionCreator: requestedImageDeletion,
|
||||||
@ -19,11 +24,6 @@ export const addRequestedImageDeletionListener = () => {
|
|||||||
|
|
||||||
const { image_name, image_type } = image;
|
const { image_name, image_type } = image;
|
||||||
|
|
||||||
if (image_type !== 'uploads' && image_type !== 'results') {
|
|
||||||
moduleLog.warn({ data: image }, `Invalid image type ${image_type}`);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const selectedImageName = getState().gallery.selectedImage?.image_name;
|
const selectedImageName = getState().gallery.selectedImage?.image_name;
|
||||||
|
|
||||||
if (selectedImageName === image_name) {
|
if (selectedImageName === image_name) {
|
||||||
@ -57,3 +57,49 @@ export const addRequestedImageDeletionListener = () => {
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called when the actual delete request is sent to the server
|
||||||
|
*/
|
||||||
|
export const addImageDeletedPendingListener = () => {
|
||||||
|
startAppListening({
|
||||||
|
actionCreator: imageDeleted.pending,
|
||||||
|
effect: (action, { dispatch, getState }) => {
|
||||||
|
const { imageName, imageType } = action.meta.arg;
|
||||||
|
// Preemptively remove the image from the gallery
|
||||||
|
if (imageType === 'uploads') {
|
||||||
|
uploadsAdapter.removeOne(getState().uploads, imageName);
|
||||||
|
}
|
||||||
|
if (imageType === 'results') {
|
||||||
|
resultsAdapter.removeOne(getState().results, imageName);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called on successful delete
|
||||||
|
*/
|
||||||
|
export const addImageDeletedFulfilledListener = () => {
|
||||||
|
startAppListening({
|
||||||
|
actionCreator: imageDeleted.fulfilled,
|
||||||
|
effect: (action, { dispatch, getState }) => {
|
||||||
|
moduleLog.info({ data: { image: action.meta.arg } }, 'Image deleted');
|
||||||
|
},
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called on failed delete
|
||||||
|
*/
|
||||||
|
export const addImageDeletedRejectedListener = () => {
|
||||||
|
startAppListening({
|
||||||
|
actionCreator: imageDeleted.rejected,
|
||||||
|
effect: (action, { dispatch, getState }) => {
|
||||||
|
moduleLog.warn(
|
||||||
|
{ data: { image: action.meta.arg } },
|
||||||
|
'Unable to delete image'
|
||||||
|
);
|
||||||
|
},
|
||||||
|
});
|
||||||
|
};
|
||||||
|
@ -97,18 +97,6 @@ const resultsSlice = createSlice({
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
/**
|
|
||||||
* Delete Image - PENDING
|
|
||||||
* Pre-emptively remove the image from the gallery
|
|
||||||
*/
|
|
||||||
builder.addCase(imageDeleted.pending, (state, action) => {
|
|
||||||
const { imageType, imageName } = action.meta.arg;
|
|
||||||
|
|
||||||
if (imageType === 'results') {
|
|
||||||
resultsAdapter.removeOne(state, imageName);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -83,18 +83,6 @@ const uploadsSlice = createSlice({
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
/**
|
|
||||||
* Delete Image - pending
|
|
||||||
* Pre-emptively remove the image from the gallery
|
|
||||||
*/
|
|
||||||
builder.addCase(imageDeleted.pending, (state, action) => {
|
|
||||||
const { imageType, imageName } = action.meta.arg;
|
|
||||||
|
|
||||||
if (imageType === 'uploads') {
|
|
||||||
uploadsAdapter.removeOne(state, imageName);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -67,9 +67,6 @@ export const imageDeleted = createAppAsyncThunk(
|
|||||||
'api/imageDeleted',
|
'api/imageDeleted',
|
||||||
async (arg: ImageDeletedArg) => {
|
async (arg: ImageDeletedArg) => {
|
||||||
const response = await ImagesService.deleteImage(arg);
|
const response = await ImagesService.deleteImage(arg);
|
||||||
|
|
||||||
imagesLog.debug({ arg, response }, 'Image deleted');
|
|
||||||
|
|
||||||
return response;
|
return response;
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
@ -77,7 +74,7 @@ export const imageDeleted = createAppAsyncThunk(
|
|||||||
type ImageUpdatedArg = Parameters<(typeof ImagesService)['updateImage']>[0];
|
type ImageUpdatedArg = Parameters<(typeof ImagesService)['updateImage']>[0];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* `ImagesService.deleteImage()` thunk
|
* `ImagesService.updateImage()` thunk
|
||||||
*/
|
*/
|
||||||
export const imageUpdated = createAppAsyncThunk(
|
export const imageUpdated = createAppAsyncThunk(
|
||||||
'api/imageUpdated',
|
'api/imageUpdated',
|
||||||
|
Loading…
Reference in New Issue
Block a user