diff --git a/packages/core-data/src/reducer.js b/packages/core-data/src/reducer.js index f78e6fd76eff9d..9b9c5ee1012cb1 100644 --- a/packages/core-data/src/reducer.js +++ b/packages/core-data/src/reducer.js @@ -266,6 +266,15 @@ function entity( entityConfig ) { ...state, [ action.recordId ]: nextEdits, }; + case 'REMOVE_ITEMS': + // Remove edits for deleted items. + const updatedEdits = { + ...state, + }; + for ( const recordId of action.itemIds ) { + delete updatedEdits[ recordId ]; + } + return updatedEdits; } return state; @@ -498,6 +507,11 @@ export function undo( state = UNDO_INITIAL_STATE, action ) { } ); } return nextState; + case 'REMOVE_ITEMS': + // Remove undo records for a deleted entity. + return state.filter( + ( undoRecord ) => undoRecord.recordId !== action.recordId + ); } return state; diff --git a/packages/core-data/src/test/reducer.js b/packages/core-data/src/test/reducer.js index e3665d619d668f..f2abb897a489c6 100644 --- a/packages/core-data/src/test/reducer.js +++ b/packages/core-data/src/test/reducer.js @@ -185,6 +185,8 @@ describe( 'undo', () => { }; } else if ( args[ 0 ] === 'isCreate' ) { action = { type: 'CREATE_UNDO_LEVEL' }; + } else if ( args[ 0 ] === 'isRemoveItems' ) { + action = { type: 'REMOVE_ITEMS', ...createEditActionPart() }; } else if ( args.length ) { action = createNextEditAction( ...args ); } @@ -343,6 +345,15 @@ describe( 'undo', () => { expectedUndoState.push( createEditActionPart( { value } ) ); expect( undoState ).toEqual( expectedUndoState ); } ); + + it( 'removes undo records when an entity is deleted', () => { + undoState = createNextUndoState(); + undoState = createNextUndoState( { value: 1 } ); + undoState = createNextUndoState( { value: 2 } ); + undoState = createNextUndoState( { value: 3 } ); + undoState = createNextUndoState( 'isRemoveItems' ); + expect( undoState ).toEqual( [] ); + } ); } ); describe( 'embedPreviews()', () => {