65 lines
1.2 KiB
TypeScript
65 lines
1.2 KiB
TypeScript
|
/**
|
||
|
* External dependencies
|
||
|
*/
|
||
|
import { select } 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 );
|
||
|
};
|
||
|
|
||
|
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 );
|
||
|
};
|