@wordpress/components
Version:
UI components for WordPress.
96 lines (83 loc) • 2.35 kB
JavaScript
import { createElement } from "@wordpress/element";
/**
* External dependencies
*/
import classnames from 'classnames';
/**
* WordPress dependencies
*/
import { Component } from '@wordpress/element';
import { ESCAPE } from '@wordpress/keycodes';
import { useFocusReturn, useFocusOnMount, useConstrainedTabbing, useMergeRefs } from '@wordpress/compose';
/**
* Internal dependencies
*/
import withFocusOutside from '../higher-order/with-focus-outside';
function ModalFrameContent({
overlayClassName,
contentLabel,
aria: {
describedby,
labelledby
},
children,
className,
role,
style,
focusOnMount,
shouldCloseOnEsc,
onRequestClose
}) {
function handleEscapeKeyDown(event) {
if (shouldCloseOnEsc && event.keyCode === ESCAPE) {
event.stopPropagation();
if (onRequestClose) {
onRequestClose(event);
}
}
}
const focusOnMountRef = useFocusOnMount(focusOnMount);
const constrainedTabbingRef = useConstrainedTabbing();
const focusReturnRef = useFocusReturn();
return (// eslint-disable-next-line jsx-a11y/no-static-element-interactions
createElement("div", {
className: classnames('components-modal__screen-overlay', overlayClassName),
onKeyDown: handleEscapeKeyDown
}, createElement("div", {
className: classnames('components-modal__frame', className),
style: style,
ref: useMergeRefs([constrainedTabbingRef, focusReturnRef, focusOnMountRef]),
role: role,
"aria-label": contentLabel,
"aria-labelledby": contentLabel ? null : labelledby,
"aria-describedby": describedby,
tabIndex: "-1"
}, children))
);
}
class ModalFrame extends Component {
constructor() {
super(...arguments);
this.handleFocusOutside = this.handleFocusOutside.bind(this);
}
/**
* Callback function called when clicked outside the modal.
*
* @param {Object} event Mouse click event.
*/
handleFocusOutside(event) {
if (this.props.shouldCloseOnClickOutside && this.props.onRequestClose) {
this.props.onRequestClose(event);
}
}
/**
* Renders the modal frame element.
*
* @return {WPElement} The modal frame element.
*/
render() {
return createElement(ModalFrameContent, this.props);
}
}
export default withFocusOutside(ModalFrame);
//# sourceMappingURL=frame.js.map