UNPKG

@braineet/ui

Version:

Braineet design system

238 lines (237 loc) 8.56 kB
"use strict"; exports.__esModule = true; exports.default = void 0; var _react = _interopRequireWildcard(require("react")); var _formik = require("formik"); var _Character = _interopRequireDefault(require("./Character")); var _styles = require("./styles"); var _jsxRuntime = require("react/jsx-runtime"); var _excluded = ["value", "defaultValue", "field", "form", "count", "allowHalf", "allowClear", "onChange", "rateIconUncheck", "rateIconChecked", "onHoverChange", "onFocus", "onBlur", "onKeyDown", "autoFocus", "disabled", "readOnly"]; function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; } function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(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 && {}.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() { 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); } function _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; } function getClientPosition(elem) { var x; var y; var doc = elem.ownerDocument; var body = doc.body; var docElem = doc && doc.documentElement; var box = elem.getBoundingClientRect(); x = box.left; y = box.top; x -= docElem.clientLeft || body.clientLeft || 0; y -= docElem.clientTop || body.clientTop || 0; return { left: x, top: y }; } function getScroll(w) { var ret = w.pageXOffset; var method = 'scrollLeft'; if (typeof ret !== 'number') { var d = w.document; // ie6,7,8 standard mode ret = d.documentElement[method]; if (typeof ret !== 'number') { // quirks mode ret = d.body[method]; } } return ret; } function getOffsetLeft(el) { var pos = getClientPosition(el); var doc = el.ownerDocument; // Only IE use `parentWindow` var w = doc.defaultView || doc.parentWindow; pos.left += getScroll(w); return pos.left; } var Rate = function Rate(_ref) { var valueProps = _ref.value, defaultValue = _ref.defaultValue, field = _ref.field, form = _ref.form, count = _ref.count, allowHalf = _ref.allowHalf, allowClear = _ref.allowClear, onChange = _ref.onChange, rateIconUncheck = _ref.rateIconUncheck, rateIconChecked = _ref.rateIconChecked, onHoverChange = _ref.onHoverChange, onFocus = _ref.onFocus, onBlur = _ref.onBlur, onKeyDown = _ref.onKeyDown, autoFocus = _ref.autoFocus, disabled = _ref.disabled, readOnly = _ref.readOnly, restProps = _objectWithoutPropertiesLoose(_ref, _excluded); var charactersRef = (0, _react.useRef)([]); var _useState = (0, _react.useState)(form && form.values && (0, _formik.getIn)(form.values, field.name) || valueProps || defaultValue || 0), value = _useState[0], setValue = _useState[1]; var _useState2 = (0, _react.useState)(), hoverValue = _useState2[0], setHoverValue = _useState2[1]; var _useState3 = (0, _react.useState)(false), focused = _useState3[0], setFocused = _useState3[1]; var _useState4 = (0, _react.useState)(null), cleanedValue = _useState4[0], setCleanedValue = _useState4[1]; (0, _react.useEffect)(function () { if (autoFocus && !disabled && !readOnly && charactersRef.current[0]) { var _charactersRef$curren; (_charactersRef$curren = charactersRef.current[0]) == null || _charactersRef$curren.focus == null || _charactersRef$curren.focus(); } }, [autoFocus]); (0, _react.useEffect)(function () { if (form && form.values) { setValue((0, _formik.getIn)(form.values, field.name)); } else { setValue(valueProps); } }, [form && form.values ? form.values : valueProps]); var onHover = function onHover(e, i) { var hoverVal = getCharacterValue(i, e.pageX); if (hoverVal !== cleanedValue) { setHoverValue(hoverVal); setCleanedValue(null); } onHoverChange(hoverVal); }; var onMouseLeave = function onMouseLeave() { setHoverValue(undefined); setCleanedValue(null); onHoverChange(undefined); }; var onClick = function onClick(e, i) { var newValue = getCharacterValue(i, e.pageX); var isReset = false; if (allowClear) { isReset = newValue === value; } onMouseLeave(); changeValue(isReset ? 0 : newValue); setCleanedValue(isReset ? newValue : null); }; var handleFocus = function handleFocus() { setFocused(true); if (onFocus) { onFocus(); } }; var handleBlur = function handleBlur() { setFocused(false); if (onBlur) { onBlur(); } }; var handleKeyDown = function handleKeyDown(e) { var keyCode = e.keyCode; var val = value; if (keyCode === 39 && val < count) { if (allowHalf) { val += 0.5; } else { val += 1; } changeValue(val); e.preventDefault(); if (charactersRef.current[Math.floor(val) - 1]) { charactersRef.current[Math.floor(val) - 1].focus(); } } else if (keyCode === 37 && val > 0) { if (allowHalf) { val -= 0.5; } else { val -= 1; } changeValue(val); e.preventDefault(); if (charactersRef.current[Math.floor(val) - 1]) { charactersRef.current[Math.floor(val) - 1].focus(); } } if (onKeyDown) { onKeyDown(e); } }; var getCharacterDOM = function getCharacterDOM(index) { return charactersRef.current[index]; }; var getCharacterValue = function getCharacterValue(index, x) { var val = index + 1; if (allowHalf) { var characterEle = getCharacterDOM(index); var leftDis = getOffsetLeft(characterEle); var width = characterEle.clientWidth; if (x - leftDis < width / 2) { val -= 0.5; } } return val; }; var saveRef = function saveRef(index) { return function (node) { charactersRef.current[index] = node; }; }; var changeValue = function changeValue(val) { if (!valueProps) setValue(val); if (form && form.setFieldValue) { form.setFieldValue(field.name, val); } onChange(val); }; var nbCharacter = Array.from(Array(count).keys()); return /*#__PURE__*/(0, _jsxRuntime.jsx)(_styles.StyledRate, _extends({ as: "ul", onMouseLeave: disabled || readOnly ? null : onMouseLeave, onFocus: disabled || readOnly ? null : handleFocus, onBlur: disabled || readOnly ? null : handleBlur, onKeyDown: disabled || readOnly ? null : handleKeyDown, role: disabled || readOnly ? null : 'radiogroup', disabled: disabled }, restProps, { children: nbCharacter.map(function (char, index) { return /*#__PURE__*/(0, _jsxRuntime.jsx)(_Character.default, { ref: saveRef(index), index: index, count: count, disabled: disabled, readOnly: readOnly, allowHalf: allowHalf, value: hoverValue === undefined || disabled ? value : hoverValue, onClick: disabled || readOnly ? null : onClick, onHover: disabled || readOnly ? null : onHover, focused: focused, rateIconChecked: rateIconChecked, rateIconUncheck: rateIconUncheck }, "character-" + char); }) })); }; Rate.defaultProps = { defaultValue: 0, count: 5, value: 0, autoFocus: false, allowHalf: false, allowClear: true, field: null, form: null, readOnly: false, disabled: false, rateIconUncheck: 'star_full', rateIconChecked: 'star_full', onFocus: function onFocus() {}, onBlur: function onBlur() {}, onKeyDown: function onKeyDown() {}, onChange: function onChange() {}, onHoverChange: function onHoverChange() {} }; var _default = exports.default = Rate;