baseui
Version:
A React Component library implementing the Base design language
199 lines (196 loc) • 7.82 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var React = _interopRequireWildcard(require("react"));
var _overrides = require("../helpers/overrides");
var _styledComponents = require("./styled-components");
var _focusVisible = require("../utils/focusVisible");
var _constants = require("./constants");
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } /*
Copyright (c) Uber Technologies, Inc.
This source code is licensed under the MIT license found in the
LICENSE file in the root directory of this source tree.
*/
const stopPropagation = e => e.stopPropagation();
const Switch = props => {
const {
overrides = {},
checked = false,
containsInteractiveElement = false,
disabled = false,
autoFocus = false,
showIcon = false,
labelPlacement = _constants.LABEL_PLACEMENT.right,
size = _constants.SIZE.default,
onChange = () => {},
onMouseEnter = () => {},
onMouseLeave = () => {},
onMouseDown = () => {},
onMouseUp = () => {},
onFocus = () => {},
onBlur = () => {},
onKeyDown,
// don't add fallback no-op to allow native keydown behavior if not customized.
onKeyUp,
// don't add fallback no-op to allow native keyup behavior if not customized.
value,
id,
name,
children,
required,
title,
inputRef
} = props;
const [isFocused, setIsFocused] = React.useState(autoFocus);
const [isFocusVisible, setIsFocusVisible] = React.useState(false);
const [isHovered, setIsHovered] = React.useState(false);
const [isActive, setIsActive] = React.useState(false);
const fallbackInputRef = React.useRef(null);
const internalInputRef = inputRef || fallbackInputRef;
React.useEffect(() => {
if (autoFocus) {
internalInputRef.current?.focus();
}
}, [autoFocus, internalInputRef]);
const onMouseEnterHandler = React.useCallback(e => {
setIsHovered(true);
onMouseEnter(e);
}, [onMouseEnter]);
const onMouseLeaveHandler = React.useCallback(e => {
setIsHovered(false);
setIsActive(false);
onMouseLeave(e);
}, [onMouseLeave]);
const onMouseDownHandler = React.useCallback(e => {
setIsActive(true);
onMouseDown(e);
}, [onMouseDown]);
const onMouseUpHandler = React.useCallback(e => {
setIsActive(false);
onMouseUp(e);
}, [onMouseUp]);
const onFocusHandler = React.useCallback(e => {
setIsFocused(true);
onFocus(e);
if ((0, _focusVisible.isFocusVisible)(e)) {
setIsFocusVisible(true);
}
}, [onFocus]);
const onBlurHandler = React.useCallback(e => {
setIsFocused(false);
onBlur(e);
if (!(0, _focusVisible.isFocusVisible)(e)) {
setIsFocusVisible(false);
}
}, [onBlur]);
const onKeyUpHandler = React.useCallback(event => {
/**
* Handles 'Enter' key press to toggle the switch.
*/
if (event.key === ' ') {
setIsActive(false);
}
if (event.key === 'Enter') {
setIsActive(false);
onChange?.({
...event,
currentTarget: {
...event.currentTarget,
checked: !checked
},
target: {
...event.target,
checked: !checked
}
});
}
onKeyUp?.(event);
}, [onKeyUp, onChange, checked]);
const onKeyDownHandler = React.useCallback(event => {
/**
* Handles 'Enter' key press to toggle the switch.
*/
if (event.key === 'Enter') {
setIsActive(true);
}
if (event.key === ' ') {
setIsActive(true);
}
onKeyDown?.(event);
}, [onKeyDown]);
const {
Root: RootOverride,
Toggle: ToggleOverride,
Label: LabelOverride,
Input: InputOverride,
ToggleTrack: ToggleTrackOverride
} = overrides;
const Root = (0, _overrides.getOverride)(RootOverride) || _styledComponents.Root;
const ToggleTrack = (0, _overrides.getOverride)(ToggleTrackOverride) || _styledComponents.ToggleTrack;
const Toggle = (0, _overrides.getOverride)(ToggleOverride) || _styledComponents.Toggle;
const Label = (0, _overrides.getOverride)(LabelOverride) || _styledComponents.Label;
const Input = (0, _overrides.getOverride)(InputOverride) || _styledComponents.Input;
const inputEvents = {
onChange,
onFocus: onFocusHandler,
onBlur: onBlurHandler,
onKeyDown: onKeyDownHandler,
onKeyUp: onKeyUpHandler
};
const mouseEvents = {
onMouseEnter: onMouseEnterHandler,
onMouseLeave: onMouseLeaveHandler,
onMouseDown: onMouseDownHandler,
onMouseUp: onMouseUpHandler
};
const sharedProps = {
$isFocused: isFocused,
$isFocusVisible: isFocusVisible,
$isHovered: isHovered,
$isActive: isActive,
$checked: checked,
$required: required,
$disabled: disabled,
$value: value,
$showIcon: showIcon,
$size: size
};
const labelComponent = children && /*#__PURE__*/React.createElement(Label, _extends({
$labelPlacement: labelPlacement
}, sharedProps, (0, _overrides.getOverrideProps)(LabelOverride)), containsInteractiveElement ?
/*#__PURE__*/
// Prevents the event from bubbling up to the label and moving focus to the switch control.
// eslint-disable-next-line jsx-a11y/click-events-have-key-events, jsx-a11y/no-static-element-interactions
React.createElement("div", {
onClick: e => e.preventDefault()
}, children) : children);
return /*#__PURE__*/React.createElement(Root, _extends({
"data-baseweb": "switch",
title: title || null,
$labelPlacement: labelPlacement
}, sharedProps, mouseEvents, (0, _overrides.getOverrideProps)(RootOverride)), labelPlacement === _constants.LABEL_PLACEMENT.left && labelComponent, /*#__PURE__*/React.createElement(ToggleTrack, _extends({}, sharedProps, (0, _overrides.getOverrideProps)(ToggleTrackOverride)), /*#__PURE__*/React.createElement(Toggle, _extends({}, sharedProps, (0, _overrides.getOverrideProps)(ToggleOverride)))), /*#__PURE__*/React.createElement(Input, _extends({
value: value,
id: id,
name: name,
checked: checked,
required: required,
"aria-label": props['aria-label'] || props.ariaLabel,
"aria-describedby": props['aria-describedby'],
"aria-errormessage": props['aria-errormessage'],
"aria-invalid": props['aria-invalid'],
"aria-required": required || null,
disabled: disabled,
type: "checkbox",
role: "switch",
ref: internalInputRef
// Prevent a second click event from firing when label is clicked.
// See https://github.com/uber/baseweb/issues/3847
,
onClick: stopPropagation
}, sharedProps, inputEvents, (0, _overrides.getOverrideProps)(InputOverride))), labelPlacement === _constants.LABEL_PLACEMENT.right && labelComponent);
};
var _default = exports.default = Switch;