UNPKG

@wordpress/components

Version:
198 lines (193 loc) 5.6 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.Button = Button; exports.default = void 0; var _reactNative = require("react-native"); var _reactNativeGestureHandler = require("react-native-gesture-handler"); var _element = require("@wordpress/element"); var _compose = require("@wordpress/compose"); var _tooltip = _interopRequireDefault(require("../tooltip")); var _icon = _interopRequireDefault(require("../icon")); var _style = _interopRequireDefault(require("./style.scss")); var _jsxRuntime = require("react/jsx-runtime"); /** * External dependencies */ /** * WordPress dependencies */ /** * Internal dependencies */ const isAndroid = _reactNative.Platform.OS === 'android'; const marginBottom = isAndroid ? -0.5 : 0; const marginLeft = -3; const styles = _reactNative.StyleSheet.create({ container: { flex: 1, padding: 3, justifyContent: 'center', alignItems: 'center' }, buttonInactive: { flex: 1, flexDirection: 'row', justifyContent: 'center', alignItems: 'center' }, fixedRatio: { aspectRatio: 1 }, buttonActive: { flex: 1, flexDirection: 'row', justifyContent: 'center', alignItems: 'center', borderRadius: 6 }, subscriptInactive: { color: '#7b9ab1', // $toolbar-button. fontWeight: 'bold', fontSize: 13, alignSelf: 'flex-end', marginLeft, marginBottom }, subscriptInactiveDark: { color: '#a7aaad' // $gray_20. }, subscriptActive: { color: 'white', fontWeight: 'bold', fontSize: 13, alignSelf: 'flex-end', marginLeft, marginBottom } }); function Button(props) { const { children, onClick, onLongPress, disabled, hint, fixedRatio = true, isPressed, 'aria-disabled': ariaDisabled, 'data-subscript': subscript, testID, icon, iconSize, showTooltip, label, shortcut, tooltipPosition, isActiveStyle, customContainerStyles, hitSlop } = props; const preferredColorScheme = (0, _compose.usePreferredColorScheme)(); const isDisabled = ariaDisabled || disabled; const containerStyle = [styles.container, customContainerStyles && { ...customContainerStyles }]; const buttonActiveColorStyles = (0, _compose.usePreferredColorSchemeStyle)(_style.default['components-button-light--active'], _style.default['components-button-dark--active']); const buttonViewStyle = { opacity: isDisabled ? 0.3 : 1, ...(fixedRatio && styles.fixedRatio), ...(isPressed ? styles.buttonActive : styles.buttonInactive), ...(isPressed ? buttonActiveColorStyles : {}), ...(isPressed && isActiveStyle?.borderRadius && { borderRadius: isActiveStyle.borderRadius }), ...(isActiveStyle?.backgroundColor && { backgroundColor: isActiveStyle.backgroundColor }) }; const states = []; if (isPressed) { states.push('selected'); } if (isDisabled) { states.push('disabled'); } const subscriptInactive = (0, _compose.usePreferredColorSchemeStyle)(styles.subscriptInactive, styles.subscriptInactiveDark); const newChildren = _element.Children.map(children, child => { return child ? (0, _element.cloneElement)(child, { colorScheme: preferredColorScheme, isPressed }) : child; }); // Should show the tooltip if... const shouldShowTooltip = !isDisabled && ( // An explicit tooltip is passed or... showTooltip && label || // There's a shortcut or... shortcut || // There's a label and... !!label && ( // The children are empty and... !children || Array.isArray(children) && !children.length) && // The tooltip is not explicitly disabled. false !== showTooltip); const newIcon = icon ? (0, _element.cloneElement)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_icon.default, { icon: icon, size: iconSize }), { isPressed }) : null; const longPressHandler = (0, _element.useCallback)(({ nativeEvent }) => { if (nativeEvent.state === _reactNativeGestureHandler.State.ACTIVE && onLongPress) { onLongPress(); } }, [onLongPress]); const element = /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.TouchableOpacity, { activeOpacity: 0.7, accessible: true, accessibilityLabel: label, accessibilityStates: states, accessibilityRole: "button", accessibilityHint: hint, onPress: onClick, style: containerStyle, disabled: isDisabled, testID: testID, hitSlop: hitSlop, children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNativeGestureHandler.LongPressGestureHandler, { minDurationMs: 500, maxDist: 150, onHandlerStateChange: longPressHandler, children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, { style: buttonViewStyle, children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, { style: { flexDirection: 'row' }, children: [newIcon, newChildren, subscript && /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, { style: isPressed ? styles.subscriptActive : subscriptInactive, children: subscript })] }) }) }) }); if (!shouldShowTooltip) { return element; } return /*#__PURE__*/(0, _jsxRuntime.jsx)(_tooltip.default, { text: label, shortcut: shortcut, position: tooltipPosition, visible: showTooltip === true, children: element }); } var _default = exports.default = Button; //# sourceMappingURL=index.native.js.map