@wordpress/block-library
Version:
Block library for the WordPress editor.
75 lines (68 loc) • 2.23 kB
JavaScript
/**
* WordPress dependencies
*/
import { Button, VisuallyHidden } from '@wordpress/components';
import { __, isRTL } from '@wordpress/i18n';
import { chevronLeftSmall, chevronRightSmall } from '@wordpress/icons';
import { useInstanceId, useFocusOnMount } from '@wordpress/compose';
/**
* Shared BackButton component for consistent navigation across LinkUI sub-components.
*
* @param {Object} props Component props.
* @param {string} props.className CSS class name for the button.
* @param {Function} props.onBack Callback when user wants to go back.
*/
function BackButton( { className, onBack } ) {
return (
<Button
className={ className }
icon={ isRTL() ? chevronRightSmall : chevronLeftSmall }
onClick={ ( e ) => {
e.preventDefault();
onBack();
} }
size="small"
>
{ __( 'Back' ) }
</Button>
);
}
/**
* Shared DialogWrapper component for consistent dialog structure across LinkUI sub-components.
*
* @param {Object} props Component props.
* @param {string} props.className CSS class name for the dialog container.
* @param {string} props.title Dialog title for accessibility.
* @param {string} props.description Dialog description for accessibility.
* @param {Function} props.onBack Callback when user wants to go back.
* @param {Object} props.children Child components to render inside the dialog.
*/
function DialogWrapper( { className, title, description, onBack, children } ) {
const dialogTitleId = useInstanceId(
DialogWrapper,
'link-ui-dialog-title'
);
const dialogDescriptionId = useInstanceId(
DialogWrapper,
'link-ui-dialog-description'
);
const focusOnMountRef = useFocusOnMount( 'firstElement' );
const backButtonClassName = `${ className }__back`;
return (
<div
className={ className }
role="dialog"
aria-labelledby={ dialogTitleId }
aria-describedby={ dialogDescriptionId }
ref={ focusOnMountRef }
>
<VisuallyHidden>
<h2 id={ dialogTitleId }>{ title }</h2>
<p id={ dialogDescriptionId }>{ description }</p>
</VisuallyHidden>
<BackButton className={ backButtonClassName } onBack={ onBack } />
{ children }
</div>
);
}
export default DialogWrapper;