diff --git a/src/Explorer/Notebook/NotebookComponent/epics.ts b/src/Explorer/Notebook/NotebookComponent/epics.ts index 5b3e83ff6..2914c6d8e 100644 --- a/src/Explorer/Notebook/NotebookComponent/epics.ts +++ b/src/Explorer/Notebook/NotebookComponent/epics.ts @@ -1,4 +1,4 @@ -import { EMPTY, merge, of, timer, concat, Subject, Subscriber, Observable, Observer } from "rxjs"; +import { EMPTY, merge, of, timer, concat, Subject, Subscriber, Observable, Observer, from } from "rxjs"; import { webSocket } from "rxjs/webSocket"; import { StateObservable } from "redux-observable"; import { ofType } from "redux-observable"; @@ -944,6 +944,39 @@ const traceNotebookKernelEpic = ( ); }; +const resetCellStatusOnExecuteCanceledEpic = ( + action$: Observable, + state$: StateObservable +): Observable => { + return action$.pipe( + ofType(actions.EXECUTE_CANCELED), + mergeMap((action) => { + const contentRef = action.payload.contentRef; + const model = state$.value.core.entities.contents.byRef.get(contentRef).model; + let busyCellIds: string[] = []; + + if (model.type === "notebook") { + const cellMap = model.transient.get("cellMap"); + if (cellMap) { + for (const entry of cellMap.toArray()) { + const cellId = entry[0]; + const status = model.transient.getIn(["cellMap", cellId, "status"]); + if (status === "busy") { + busyCellIds.push(cellId); + } + } + } + } + + return from(busyCellIds).pipe( + map((busyCellId) => { + return actions.updateCellStatus({ id: busyCellId, contentRef, status: undefined }); + }) + ); + }) + ); +}; + export const allEpics = [ addInitialCodeCellEpic, focusInitialCodeCellEpic, @@ -960,4 +993,5 @@ export const allEpics = [ traceNotebookTelemetryEpic, traceNotebookInfoEpic, traceNotebookKernelEpic, + resetCellStatusOnExecuteCanceledEpic, ];