UNPKG

@dnb/eufemia

Version:

DNB Eufemia Design System UI Library

218 lines (217 loc) 9 kB
"use strict"; "use client"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = Switch; var _react = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _componentHelper = require("../../shared/component-helper.js"); var _filterValidProps = require("../../shared/helpers/filterValidProps.js"); var _AlignmentHelper2 = _interopRequireDefault(require("../../shared/AlignmentHelper.js")); var _SpacingHelper = require("../space/SpacingHelper.js"); var _SkeletonHelper = require("../skeleton/SkeletonHelper.js"); var _Context = _interopRequireDefault(require("../../shared/Context.js")); var _Suffix = _interopRequireDefault(require("../../shared/helpers/Suffix.js")); var _FormLabel = _interopRequireDefault(require("../form-label/FormLabel.js")); var _FormStatus = _interopRequireDefault(require("../form-status/FormStatus.js")); var _withSnakeCaseProps = require("../../shared/helpers/withSnakeCaseProps.js"); var _useId = _interopRequireDefault(require("../../shared/helpers/useId.js")); var _AlignmentHelper, _span; function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; } function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); } function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); } const defaultProps = { statusState: 'error' }; function Switch(props) { const context = (0, _react.useContext)(_Context.default); const allProps = extractPropsFromContext(); const { value, size, status, statusState, statusProps, globalStatus, statusNoAnimation, suffix, label, labelPosition, labelSrOnly, title, disabled, readOnly, skeleton, className, id: idProp, checked: checkedProp, onChange, onChangeEnd, onClick, innerRef: innerRefProp, ...rest } = allProps; const [, forceUpdate] = (0, _react.useReducer)(() => ({}), {}); const id = (0, _useId.default)(idProp); const isFn = typeof innerRefProp === 'function'; const refHook = (0, _react.useRef)(); const innerRef = !isFn && innerRefProp || refHook; const preventChangeRef = (0, _react.useRef)(false); const isCheckedRef = (0, _react.useRef)(checkedProp !== null && checkedProp !== void 0 ? checkedProp : false); const prevCheckedRef = (0, _react.useRef)(checkedProp); (0, _react.useEffect)(() => { if (isFn) { innerRefProp === null || innerRefProp === void 0 || innerRefProp(refHook.current); } }, [innerRefProp, isFn, refHook]); (0, _react.useEffect)(() => { if (checkedProp !== prevCheckedRef.current) { isCheckedRef.current = !!checkedProp; prevCheckedRef.current = !!checkedProp; forceUpdate(); } }, [checkedProp]); const callOnChange = (0, _react.useCallback)(({ checked, event }) => { onChange === null || onChange === void 0 || onChange({ checked, event }); }, [onChange]); const onChangeHandler = (0, _react.useCallback)(event => { if (preventChangeRef.current) { return; } const updatedChecked = !isCheckedRef.current; isCheckedRef.current = updatedChecked; forceUpdate(); callOnChange({ checked: updatedChecked, event }); if (onChangeEnd) { if (event && event.persist) { event.persist(); } setTimeout(() => onChangeEnd({ checked: updatedChecked, event }), 500); } if (innerRef.current) { innerRef.current.focus(); } }, [callOnChange, innerRef, onChangeEnd]); const onClickHandler = (0, _react.useCallback)(event => { const preventDefault = () => { event.preventDefault(); if (event.target['checked'] !== isCheckedRef.current) { preventChangeRef.current = true; isCheckedRef.current = !isCheckedRef.current; forceUpdate(); } }; if (readOnly) { return preventDefault(); } onClick === null || onClick === void 0 || onClick({ checked: isCheckedRef.current, preventDefault, event, ...event }); }, [onClick, readOnly]); const onKeyDownHandler = (0, _react.useCallback)(event => { switch (event.code) { case 'Enter': onChangeHandler(event); break; } }, [onChangeHandler]); const showStatus = (0, _react.useMemo)(() => (0, _componentHelper.getStatusState)(status), [status]); const mainParams = { className: (0, _classnames.default)(`dnb-switch dnb-switch--label-position-${labelPosition || 'right'} dnb-form-component`, (0, _SkeletonHelper.createSkeletonClass)(null, skeleton), (0, _SpacingHelper.createSpacingClasses)(props), className, size && `dnb-switch--${size}`, status && `dnb-switch__status--${statusState}`) }; const inputParams = { disabled, checked: isCheckedRef.current, ...rest }; if (showStatus || suffix) { inputParams['aria-describedby'] = (0, _componentHelper.combineDescribedBy)(inputParams, showStatus ? id + '-status' : null, suffix ? id + '-suffix' : null); } if (readOnly) { inputParams['aria-readonly'] = readOnly; } (0, _SkeletonHelper.skeletonDOMAttributes)(inputParams, skeleton, context); (0, _componentHelper.validateDOMAttributes)(props, inputParams); const helperParams = (0, _react.useMemo)(() => ({ onMouseDown: e => e.preventDefault() }), []); const labelComp = (0, _react.useMemo)(() => label && _react.default.createElement(_FormLabel.default, { id: id + '-label', forId: id, text: label, disabled: disabled, skeleton: skeleton, srOnly: labelSrOnly }), [disabled, id, label, labelSrOnly, skeleton]); return _react.default.createElement("span", mainParams, _react.default.createElement("span", { className: "dnb-switch__order" }, labelPosition === 'left' && labelComp, _react.default.createElement("span", { className: "dnb-switch__inner" }, _AlignmentHelper || (_AlignmentHelper = _react.default.createElement(_AlignmentHelper2.default, null)), _react.default.createElement(_FormStatus.default, _extends({ show: showStatus, id: id + '-form-status', globalStatus: globalStatus, label: label, width_selector: id + ', ' + id + '-label', text: status, state: statusState, skeleton: skeleton, no_animation: statusNoAnimation }, statusProps)), _react.default.createElement("span", { className: "dnb-switch__shell" }, (labelPosition === 'right' || !labelPosition) && labelComp, _react.default.createElement("span", { className: "dnb-switch__row" }, _react.default.createElement("input", _extends({ id: id, name: id, type: "checkbox", role: "switch", title: title, "aria-checked": isCheckedRef.current, className: "dnb-switch__input", value: isCheckedRef.current ? value || '' : '', ref: innerRef }, inputParams, { onChange: onChangeHandler, onClick: onClickHandler, onKeyDown: onKeyDownHandler })), _react.default.createElement("span", _extends({ draggable: true, "aria-hidden": true, className: "dnb-switch__background", onDragStart: onChangeHandler }, helperParams)), _react.default.createElement("span", { className: (0, _classnames.default)('dnb-switch__button', (0, _SkeletonHelper.createSkeletonClass)('shape', skeleton, context)), "aria-hidden": true }, _span || (_span = _react.default.createElement("span", { className: "dnb-switch__focus" }, _react.default.createElement("span", { className: "dnb-switch__focus__inner" }))))), suffix && _react.default.createElement(_Suffix.default, { className: "dnb-switch__suffix", id: id + '-suffix', context: props }, suffix))))); function extractPropsFromContext() { return (0, _componentHelper.extendPropsWithContext)((0, _withSnakeCaseProps.convertSnakeCaseProps)(props), defaultProps, { skeleton: context === null || context === void 0 ? void 0 : context.skeleton }, (0, _filterValidProps.pickFormElementProps)(context === null || context === void 0 ? void 0 : context.FormRow), (0, _filterValidProps.pickFormElementProps)(context === null || context === void 0 ? void 0 : context.formElement), context.Switch); } } //# sourceMappingURL=Switch.js.map