@@ -4,6 +4,7 @@ import { EMPTY_ARRAY } from 'app/store/constants';
4
4
import { useAppStore } from 'app/store/storeHooks' ;
5
5
import { buildZodTypeGuard } from 'common/util/zodUtils' ;
6
6
import { getOutputImageName } from 'features/controlLayers/components/SimpleSession/shared' ;
7
+ import { canvasQueueItemDiscarded , selectDiscardedItems } from 'features/controlLayers/store/canvasStagingAreaSlice' ;
7
8
import type { ProgressImage } from 'features/nodes/types/common' ;
8
9
import type { Atom , MapStore , StoreValue , WritableAtom } from 'nanostores' ;
9
10
import { atom , computed , effect , map , subscribeKeys } from 'nanostores' ;
@@ -104,6 +105,7 @@ type CanvasSessionContextValue = {
104
105
selectFirst : ( ) => void ;
105
106
selectLast : ( ) => void ;
106
107
onImageLoad : ( itemId : number ) => void ;
108
+ discard : ( itemId : number ) => void ;
107
109
} ;
108
110
109
111
const CanvasSessionContext = createContext < CanvasSessionContextValue | null > ( null ) ;
@@ -138,14 +140,7 @@ export const CanvasSessionContextProvider = memo(
138
140
* Manually-synced atom containing queue items for the current session. This is populated from the RTK Query cache
139
141
* and kept in sync with it via a redux subscription.
140
142
*/
141
- const $allItems = useState ( ( ) => atom < S [ 'SessionQueueItem' ] [ ] > ( [ ] ) ) [ 0 ] ;
142
-
143
- /**
144
- * All queue items for the current session, excluding canceled and failed items.
145
- */
146
- const $items = useState ( ( ) =>
147
- computed ( [ $allItems ] , ( allItems ) => allItems . filter ( ( { status } ) => status !== 'canceled' && status !== 'failed' ) )
148
- ) [ 0 ] ;
143
+ const $items = useState ( ( ) => atom < S [ 'SessionQueueItem' ] [ ] > ( [ ] ) ) [ 0 ] ;
149
144
150
145
/**
151
146
* Whether auto-switch is enabled.
@@ -239,12 +234,27 @@ export const CanvasSessionContextProvider = memo(
239
234
*/
240
235
const selectQueueItems = useMemo (
241
236
( ) =>
242
- createSelector ( queueApi . endpoints . listAllQueueItems . select ( { destination : session . id } ) , ( { data } ) => {
243
- return data ?? EMPTY_ARRAY ;
244
- } ) ,
237
+ createSelector (
238
+ [ queueApi . endpoints . listAllQueueItems . select ( { destination : session . id } ) , selectDiscardedItems ] ,
239
+ ( { data } , discardedItems ) => {
240
+ if ( ! data ) {
241
+ return EMPTY_ARRAY ;
242
+ }
243
+ return data . filter (
244
+ ( { status, item_id } ) => status !== 'canceled' && status !== 'failed' && ! discardedItems . includes ( item_id )
245
+ ) ;
246
+ }
247
+ ) ,
245
248
[ session . id ]
246
249
) ;
247
250
251
+ const discard = useCallback (
252
+ ( itemId : number ) => {
253
+ store . dispatch ( canvasQueueItemDiscarded ( { itemId } ) ) ;
254
+ } ,
255
+ [ store ]
256
+ ) ;
257
+
248
258
const selectNext = useCallback ( ( ) => {
249
259
const selectedItemId = $selectedItemId . get ( ) ;
250
260
if ( selectedItemId === null ) {
@@ -350,22 +360,20 @@ export const CanvasSessionContextProvider = memo(
350
360
351
361
// Set up state subscriptions and effects
352
362
useEffect ( ( ) => {
353
- let _prevAllItems : readonly S [ 'SessionQueueItem' ] [ ] = [ ] ;
354
- // Seed the $allItems atom with the initial query cache state
355
- $allItems . set ( selectQueueItems ( store . getState ( ) ) ) ;
363
+ let _prevItems : readonly S [ 'SessionQueueItem' ] [ ] = [ ] ;
364
+ // Seed the $items atom with the initial query cache state
365
+ $items . set ( selectQueueItems ( store . getState ( ) ) ) ;
356
366
357
- // Manually keep the $allItems atom in sync as the query cache is updated
367
+ // Manually keep the $items atom in sync as the query cache is updated
358
368
const unsubReduxSyncToItemsAtom = store . subscribe ( ( ) => {
359
- const prevItems = $allItems . get ( ) ;
369
+ const prevItems = $items . get ( ) ;
360
370
const items = selectQueueItems ( store . getState ( ) ) ;
361
371
if ( items !== prevItems ) {
362
- _prevAllItems = prevItems ;
363
- $allItems . set ( items ) ;
372
+ _prevItems = prevItems ;
373
+ $items . set ( items ) ;
364
374
}
365
375
} ) ;
366
376
367
- let _prevItems : readonly S [ 'SessionQueueItem' ] [ ] = [ ] ;
368
-
369
377
// Handle cases that could result in a nonexistent queue item being selected.
370
378
const unsubEnsureSelectedItemIdExists = effect (
371
379
[ $items , $selectedItemId , $lastStartedItemId ] ,
@@ -500,14 +508,13 @@ export const CanvasSessionContextProvider = memo(
500
508
unsubReduxSyncToItemsAtom ( ) ;
501
509
unsubEnsureSelectedItemIdExists ( ) ;
502
510
unsubCleanUpProgressData ( ) ;
503
- $allItems . set ( [ ] ) ;
511
+ $items . set ( [ ] ) ;
504
512
$progressData . set ( { } ) ;
505
513
$selectedItemId . set ( null ) ;
506
514
} ;
507
515
} , [
508
- $allItems ,
509
- $autoSwitch ,
510
516
$items ,
517
+ $autoSwitch ,
511
518
$lastLoadedItemId ,
512
519
$lastStartedItemId ,
513
520
$progressData ,
@@ -535,6 +542,7 @@ export const CanvasSessionContextProvider = memo(
535
542
selectFirst,
536
543
selectLast,
537
544
onImageLoad,
545
+ discard,
538
546
} ) ,
539
547
[
540
548
$autoSwitch ,
@@ -553,6 +561,7 @@ export const CanvasSessionContextProvider = memo(
553
561
selectFirst ,
554
562
selectLast ,
555
563
onImageLoad ,
564
+ discard ,
556
565
]
557
566
) ;
558
567
0 commit comments