@wordpress/block-editor
Version:
55 lines (45 loc) • 1.32 kB
JavaScript
/**
* WordPress dependencies
*/
import { useContext, useMemo } from '@wordpress/element';
import {
privateApis,
__experimentalToolbarContext as ToolbarContext,
ToolbarGroup,
__experimentalUseSlotFills as useSlotFills,
} from '@wordpress/components';
import warning from '@wordpress/warning';
/**
* Internal dependencies
*/
import groups from './groups';
import { unlock } from '../../lock-unlock';
const { ComponentsContext } = unlock( privateApis );
export default function BlockControlsSlot( { group = 'default', ...props } ) {
const toolbarState = useContext( ToolbarContext );
const contextState = useContext( ComponentsContext );
const fillProps = useMemo(
() => ( {
forwardedContext: [
[ ToolbarContext.Provider, { value: toolbarState } ],
[ ComponentsContext.Provider, { value: contextState } ],
],
} ),
[ toolbarState, contextState ]
);
const slotFill = groups[ group ];
const fills = useSlotFills( slotFill.name );
if ( ! slotFill ) {
warning( `Unknown BlockControls group "${ group }" provided.` );
return null;
}
if ( ! fills?.length ) {
return null;
}
const { Slot } = slotFill;
const slot = <Slot { ...props } bubblesVirtually fillProps={ fillProps } />;
if ( group === 'default' ) {
return slot;
}
return <ToolbarGroup>{ slot }</ToolbarGroup>;
}