From 0ea35b1e3d8495ae9eb5ccddd48b284d43bd45cc Mon Sep 17 00:00:00 2001
From: psychedelicious <4822129+psychedelicious@users.noreply.github.com>
Date: Fri, 26 May 2023 16:59:13 +1000
Subject: [PATCH] feat(ui): improve session canceled handling

---
 .../middleware/listenerMiddleware/index.ts    | 24 +++++++---
 .../listeners/sessionCanceled.ts              | 48 +++++++++++++++++++
 .../web/src/services/thunks/gallery.ts        |  1 -
 .../web/src/services/thunks/session.ts        | 32 +++++++------
 4 files changed, 83 insertions(+), 22 deletions(-)
 create mode 100644 invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/sessionCanceled.ts

diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/index.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/index.ts
index 2996b0f34a..1fbc2f978c 100644
--- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/index.ts
+++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/index.ts
@@ -54,6 +54,11 @@ import {
   addSessionInvokedPendingListener,
   addSessionInvokedRejectedListener,
 } from './listeners/sessionInvoked';
+import {
+  addSessionCanceledFulfilledListener,
+  addSessionCanceledPendingListener,
+  addSessionCanceledRejectedListener,
+} from './listeners/sessionCanceled';
 import {
   addReceivedResultImagesPageFulfilledListener,
   addReceivedResultImagesPageRejectedListener,
@@ -101,18 +106,13 @@ addImageMetadataReceivedRejectedListener();
 addImageUrlsReceivedFulfilledListener();
 addImageUrlsReceivedRejectedListener();
 
-// Invoking on tabs
+// User Invoked
 addUserInvokedCanvasListener();
 addUserInvokedNodesListener();
 addUserInvokedTextToImageListener();
 addUserInvokedImageToImageListener();
 addSessionReadyToInvokeListener();
 
-// Actual session invoking
-addSessionInvokedPendingListener();
-addSessionInvokedFulfilledListener();
-addSessionInvokedRejectedListener();
-
 // Canvas actions
 addCanvasSavedToGalleryListener();
 addCanvasDownloadedAsImageListener();
@@ -130,11 +130,21 @@ addSocketDisconnectedListener();
 addSocketSubscribedListener();
 addSocketUnsubscribedListener();
 
-// Sessions
+// Session Created
 addSessionCreatedPendingListener();
 addSessionCreatedFulfilledListener();
 addSessionCreatedRejectedListener();
 
+// Session Invoked
+addSessionInvokedPendingListener();
+addSessionInvokedFulfilledListener();
+addSessionInvokedRejectedListener();
+
+// Session Canceled
+addSessionCanceledPendingListener();
+addSessionCanceledFulfilledListener();
+addSessionCanceledRejectedListener();
+
 // Gallery pages
 addReceivedResultImagesPageFulfilledListener();
 addReceivedResultImagesPageRejectedListener();
diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/sessionCanceled.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/sessionCanceled.ts
new file mode 100644
index 0000000000..6274ad4dc8
--- /dev/null
+++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/sessionCanceled.ts
@@ -0,0 +1,48 @@
+import { log } from 'app/logging/useLogger';
+import { startAppListening } from '..';
+import { sessionCanceled } from 'services/thunks/session';
+import { serializeError } from 'serialize-error';
+
+const moduleLog = log.child({ namespace: 'session' });
+
+export const addSessionCanceledPendingListener = () => {
+  startAppListening({
+    actionCreator: sessionCanceled.pending,
+    effect: (action, { getState, dispatch }) => {
+      //
+    },
+  });
+};
+
+export const addSessionCanceledFulfilledListener = () => {
+  startAppListening({
+    actionCreator: sessionCanceled.fulfilled,
+    effect: (action, { getState, dispatch }) => {
+      const { sessionId } = action.meta.arg;
+      moduleLog.debug(
+        { data: { sessionId } },
+        `Session canceled (${sessionId})`
+      );
+    },
+  });
+};
+
+export const addSessionCanceledRejectedListener = () => {
+  startAppListening({
+    actionCreator: sessionCanceled.rejected,
+    effect: (action, { getState, dispatch }) => {
+      if (action.payload) {
+        const { arg, error } = action.payload;
+        moduleLog.error(
+          {
+            data: {
+              arg,
+              error: serializeError(error),
+            },
+          },
+          `Problem canceling session`
+        );
+      }
+    },
+  });
+};
diff --git a/invokeai/frontend/web/src/services/thunks/gallery.ts b/invokeai/frontend/web/src/services/thunks/gallery.ts
index 8a6505b6c2..11960e00d2 100644
--- a/invokeai/frontend/web/src/services/thunks/gallery.ts
+++ b/invokeai/frontend/web/src/services/thunks/gallery.ts
@@ -1,4 +1,3 @@
-import { log } from 'app/logging/useLogger';
 import { createAppAsyncThunk } from 'app/store/storeUtils';
 import { ImagesService, PaginatedResults_ImageDTO_ } from 'services/api';
 
diff --git a/invokeai/frontend/web/src/services/thunks/session.ts b/invokeai/frontend/web/src/services/thunks/session.ts
index efab401520..cf87fb30f5 100644
--- a/invokeai/frontend/web/src/services/thunks/session.ts
+++ b/invokeai/frontend/web/src/services/thunks/session.ts
@@ -49,7 +49,7 @@ const isErrorWithStatus = (error: unknown): error is { status: number } =>
  * `SessionsService.invokeSession()` thunk
  */
 export const sessionInvoked = createAppAsyncThunk<
-  any,
+  void,
   SessionInvokedArg,
   SessionInvokedThunkConfig
 >('api/sessionInvoked', async (arg, { rejectWithValue }) => {
@@ -72,24 +72,28 @@ export const sessionInvoked = createAppAsyncThunk<
 type SessionCanceledArg = Parameters<
   (typeof SessionsService)['cancelSessionInvoke']
 >[0];
-
+type SessionCanceledThunkConfig = {
+  rejectValue: {
+    arg: SessionCanceledArg;
+    error: unknown;
+  };
+};
 /**
  * `SessionsService.cancelSession()` thunk
  */
-export const sessionCanceled = createAppAsyncThunk(
-  'api/sessionCanceled',
-  async (arg: SessionCanceledArg, _thunkApi) => {
-    const { sessionId } = arg;
+export const sessionCanceled = createAppAsyncThunk<
+  void,
+  SessionCanceledArg,
+  SessionCanceledThunkConfig
+>('api/sessionCanceled', async (arg: SessionCanceledArg, _thunkApi) => {
+  const { sessionId } = arg;
 
-    const response = await SessionsService.cancelSessionInvoke({
-      sessionId,
-    });
+  const response = await SessionsService.cancelSessionInvoke({
+    sessionId,
+  });
 
-    sessionLog.info({ arg, response }, `Session canceled (${sessionId})`);
-
-    return response;
-  }
-);
+  return response;
+});
 
 type SessionsListedArg = Parameters<
   (typeof SessionsService)['listSessions']