@wordpress/components
Version:
UI components for WordPress.
131 lines (119 loc) • 3.66 kB
JavaScript
import _extends from "@babel/runtime/helpers/esm/extends";
import { createElement, Fragment } from "@wordpress/element";
/**
* External dependencies
*/
// eslint-disable-next-line no-restricted-imports
import { Radio } from 'reakit';
/**
* WordPress dependencies
*/
import { useInstanceId } from '@wordpress/compose';
/**
* Internal dependencies
*/
import { contextConnect, useContextSystem } from '../../ui/context';
import { useToggleGroupControlContext } from '../context';
import * as styles from './styles';
import { useCx } from '../../utils/hooks';
import Tooltip from '../../tooltip';
const {
ButtonContentView,
LabelView
} = styles;
const WithToolTip = _ref => {
let {
showTooltip,
text,
children
} = _ref;
if (showTooltip && text) {
return createElement(Tooltip, {
text: text,
position: "top center"
}, children);
}
return createElement(Fragment, null, children);
};
function ToggleGroupControlOptionBase(props, forwardedRef) {
const toggleGroupControlContext = useToggleGroupControlContext();
const id = useInstanceId(ToggleGroupControlOptionBase, toggleGroupControlContext.baseId || 'toggle-group-control-option-base');
const buttonProps = useContextSystem({ ...props,
id
}, 'ToggleGroupControlOptionBase');
const {
isBlock = false,
isDeselectable = false,
size = 'default',
...otherContextProps
/* context props for Ariakit Radio */
} = toggleGroupControlContext;
const {
className,
isIcon = false,
value,
children,
showTooltip = false,
...otherButtonProps
} = buttonProps;
const isPressed = otherContextProps.state === value;
const cx = useCx();
const labelViewClasses = cx(isBlock && styles.labelBlock);
const classes = cx(styles.buttonView({
isDeselectable,
isIcon,
isPressed,
size
}), className);
const buttonOnClick = () => {
if (isDeselectable && isPressed) {
otherContextProps.setState(undefined);
} else {
otherContextProps.setState(value);
}
};
const commonProps = { ...otherButtonProps,
className: classes,
'data-value': value,
ref: forwardedRef
};
return createElement(LabelView, {
className: labelViewClasses
}, createElement(WithToolTip, {
showTooltip: showTooltip,
text: otherButtonProps['aria-label']
}, isDeselectable ? createElement("button", _extends({}, commonProps, {
"aria-pressed": isPressed,
type: "button",
onClick: buttonOnClick
}), createElement(ButtonContentView, null, children)) : createElement(Radio, _extends({}, commonProps, otherContextProps
/* these are only for Ariakit Radio */
, {
as: "button",
value: value
}), createElement(ButtonContentView, null, children))));
}
/**
* `ToggleGroupControlOptionBase` is a form component and is meant to be used as an internal,
* generic component for any children of `ToggleGroupControl`.
*
* @example
* ```jsx
* import {
* __experimentalToggleGroupControl as ToggleGroupControl,
* __experimentalToggleGroupControlOptionBase as ToggleGroupControlOptionBase,
* } from '@wordpress/components';
*
* function Example() {
* return (
* <ToggleGroupControl label="my label" value="vertical" isBlock>
* <ToggleGroupControlOption value="horizontal" label="Horizontal" />
* <ToggleGroupControlOption value="vertical" label="Vertical" />
* </ToggleGroupControl>
* );
* }
* ```
*/
const ConnectedToggleGroupControlOptionBase = contextConnect(ToggleGroupControlOptionBase, 'ToggleGroupControlOptionBase');
export default ConnectedToggleGroupControlOptionBase;
//# sourceMappingURL=component.js.map