woocommerce/plugins/woocommerce-blocks/assets/js/blocks/cart-checkout-shared/view-switcher/utils.ts

86 lines
1.7 KiB
TypeScript

/**
* External dependencies
*/
import { select, dispatch } from '@wordpress/data';
/**
* Internal dependencies
*/
import type { View } from './types';
export const getView = (
viewName: string,
views: View[]
): View | undefined => {
return views.find( ( view ) => view.view === viewName );
};
export const selectView = (
clientId: string,
viewName: string,
selectParent = true
) => {
const { updateBlockAttributes, selectBlock } =
dispatch( 'core/block-editor' );
updateBlockAttributes( clientId, {
currentView: viewName,
} );
if ( selectParent ) {
selectBlock(
select( 'core/block-editor' )
.getBlock( clientId )
?.innerBlocks.find(
( block: { name: string } ) => block.name === viewName
)?.clientId || clientId
);
}
};
const defaultView = {
views: [],
currentView: '',
viewClientId: '',
};
export const findParentBlockEditorViews = (
clientId: string,
maxDepth = 10,
currentDepth = 0
): {
views: View[];
currentView: string;
viewClientId: string;
} => {
const depth = currentDepth + 1;
if ( depth > maxDepth ) {
return defaultView;
}
const { getBlockAttributes, getBlockRootClientId } =
select( 'core/block-editor' );
const rootId = getBlockRootClientId( clientId );
if ( rootId === null || rootId === '' ) {
return defaultView;
}
const rootAttributes = getBlockAttributes( rootId );
if ( ! rootAttributes ) {
return defaultView;
}
if ( rootAttributes.editorViews !== undefined ) {
return {
views: rootAttributes.editorViews,
currentView:
rootAttributes.currentView ||
rootAttributes.editorViews[ 0 ].view,
viewClientId: rootId,
};
}
return findParentBlockEditorViews( rootId, maxDepth, depth );
};