diff --git a/packages/block-editor/src/store/selectors.js b/packages/block-editor/src/store/selectors.js index 03f02965457099..fb431d1a48d0f6 100644 --- a/packages/block-editor/src/store/selectors.js +++ b/packages/block-editor/src/store/selectors.js @@ -1115,7 +1115,7 @@ export const canInsertBlockType = createSelector( * the number of inserts that have occurred. */ function getInsertUsage( state, id ) { - return state.preferences.insertUsage[ id ] || null; + return get( state.preferences.insertUsage, [ id ], null ); } /** diff --git a/packages/block-editor/src/store/test/selectors.js b/packages/block-editor/src/store/test/selectors.js index fde8a74fefa91f..3bbe1abd7f3a85 100644 --- a/packages/block-editor/src/store/test/selectors.js +++ b/packages/block-editor/src/store/test/selectors.js @@ -1927,9 +1927,11 @@ describe( 'selectors', () => { { id: 1, isTemporary: false, clientId: 'block1', title: 'Reusable Block 1' }, ], }, - preferences: { - insertUsage: {}, - }, + // Intentionally include a test case which considers + // `insertUsage` as not present within preferences. + // + // See: https://github.com/WordPress/gutenberg/issues/14580 + preferences: {}, blockListSettings: {}, }; const items = getInserterItems( state ); diff --git a/packages/edit-post/src/store/selectors.js b/packages/edit-post/src/store/selectors.js index c77a3add99e4b7..2430ee41087232 100644 --- a/packages/edit-post/src/store/selectors.js +++ b/packages/edit-post/src/store/selectors.js @@ -139,7 +139,10 @@ export function isEditorPanelEnabled( state, panelName ) { */ export function isEditorPanelOpened( state, panelName ) { const panels = getPreference( state, 'panels' ); - return panels[ panelName ] === true || get( panels, [ panelName, 'opened' ], false ); + return ( + get( panels, [ panelName ] ) === true || + get( panels, [ panelName, 'opened' ] ) === true + ); } /** @@ -163,7 +166,7 @@ export function isModalActive( state, modalName ) { * @return {boolean} Is active. */ export function isFeatureActive( state, feature ) { - return !! state.preferences.features[ feature ]; + return get( state.preferences.features, [ feature ], false ); } /** diff --git a/packages/edit-post/src/store/test/selectors.js b/packages/edit-post/src/store/test/selectors.js index b035169b3044d8..16131bf8eaf8d9 100644 --- a/packages/edit-post/src/store/test/selectors.js +++ b/packages/edit-post/src/store/test/selectors.js @@ -273,6 +273,15 @@ describe( 'selectors', () => { } ); describe( 'isEditorPanelOpened', () => { + it( 'is tolerant to an undefined panels preference', () => { + // See: https://github.com/WordPress/gutenberg/issues/14580 + const state = { + preferences: {}, + }; + + expect( isEditorPanelOpened( state, 'post-status' ) ).toBe( false ); + } ); + it( 'should return false by default', () => { const state = { preferences: { @@ -333,6 +342,15 @@ describe( 'selectors', () => { } ); describe( 'isFeatureActive', () => { + it( 'is tolerant to an undefined features preference', () => { + // See: https://github.com/WordPress/gutenberg/issues/14580 + const state = { + preferences: {}, + }; + + expect( isFeatureActive( state, 'chicken' ) ).toBe( false ); + } ); + it( 'should return true if feature is active', () => { const state = { preferences: { diff --git a/packages/nux/src/store/selectors.js b/packages/nux/src/store/selectors.js index 71669709d42cb2..9225bd97077eee 100644 --- a/packages/nux/src/store/selectors.js +++ b/packages/nux/src/store/selectors.js @@ -2,7 +2,7 @@ * External dependencies */ import createSelector from 'rememo'; -import { includes, difference, keys } from 'lodash'; +import { includes, difference, keys, has } from 'lodash'; /** * An object containing information about a guide. @@ -55,7 +55,7 @@ export function isTipVisible( state, tipId ) { return false; } - if ( state.preferences.dismissedTips[ tipId ] ) { + if ( has( state.preferences.dismissedTips, [ tipId ] ) ) { return false; } diff --git a/packages/nux/src/store/test/selectors.js b/packages/nux/src/store/test/selectors.js index ed63a7fa828de5..546d052958dd5e 100644 --- a/packages/nux/src/store/test/selectors.js +++ b/packages/nux/src/store/test/selectors.js @@ -53,6 +53,26 @@ describe( 'selectors', () => { } ); describe( 'isTipVisible', () => { + it( 'is tolerant to individual preferences being undefined', () => { + // See: https://github.com/WordPress/gutenberg/issues/14580 + const state = { + guides: [], + preferences: {}, + }; + expect( isTipVisible( state, 'test/tip' ) ).toBe( false ); + } ); + + it( 'is tolerant to undefined dismissedTips', () => { + // See: https://github.com/WordPress/gutenberg/issues/14580 + const state = { + guides: [], + preferences: { + areTipsEnabled: true, + }, + }; + expect( isTipVisible( state, 'test/tip' ) ).toBe( true ); + } ); + it( 'should return true by default', () => { const state = { guides: [],