UNPKG

epn-ui

Version:

Дизайн система кабинета ВМ

73 lines (70 loc) 3.5 kB
import React, { useRef, useState, useEffect } from 'react'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { faAngleLeft } from '@fortawesome/pro-regular-svg-icons/faAngleLeft'; import { faAngleRight } from '@fortawesome/pro-regular-svg-icons/faAngleRight'; import debounce from 'lodash/debounce'; import Button from '../Button/index.js'; var IconButton = function (_a) { var icon = _a.icon, onClick = _a.onClick, _b = _a.disabled, disabled = _b === void 0 ? false : _b; return (React.createElement(Button, { type: "default", onClick: onClick, disabled: disabled, className: "epn-slider-button" }, React.createElement(FontAwesomeIcon, { icon: icon }))); }; var ITEMS_MARGIN = 24; var DEBOUNCE_VALUE = 100; var ItemsSlider = function (_a) { var title = _a.title, children = _a.children; var containerRef = useRef(null); var childRefs = useRef([]); var _b = useState(true), leftButtonDisabled = _b[0], setLeftButtonDisabled = _b[1]; var _c = useState(false), rightButtonDisabled = _c[0], setRightButtonDisabled = _c[1]; var scrollRight = function () { if (containerRef.current && childRefs.current[0]) { containerRef.current.scrollLeft += childRefs.current[0].clientWidth + ITEMS_MARGIN; } }; var scrollLeft = function () { if (containerRef.current && childRefs.current[0]) { containerRef.current.scrollLeft -= childRefs.current[0].clientWidth + ITEMS_MARGIN; } }; useEffect(function () { if (containerRef.current) { if (containerRef.current.offsetWidth + containerRef.current.scrollLeft === containerRef.current.scrollWidth) { setRightButtonDisabled(true); } else { setRightButtonDisabled(false); } } }, [children]); var handleScroll = debounce(function () { if (containerRef.current) { if (containerRef.current.scrollLeft === 0) { setLeftButtonDisabled(true); } else { setLeftButtonDisabled(false); } if (containerRef.current.offsetWidth + containerRef.current.scrollLeft === containerRef.current.scrollWidth) { setRightButtonDisabled(true); } else { setRightButtonDisabled(false); } } }, DEBOUNCE_VALUE); return (React.createElement("div", { className: "epn-slider" }, React.createElement("div", { className: "epn-slider__head" }, React.createElement("h2", { className: "epn-slider__title" }, title), React.createElement("div", { className: "epn-slider__buttons" }, React.createElement(IconButton, { disabled: leftButtonDisabled, icon: faAngleLeft, onClick: scrollLeft }), React.createElement(IconButton, { disabled: rightButtonDisabled, icon: faAngleRight, onClick: scrollRight }))), React.createElement("div", { ref: containerRef, className: "epn-slider__body smooth hide-scrollbar", onScroll: handleScroll }, React.Children.map(children, function (child, index) { return (React.createElement("div", { ref: function (el) { childRefs.current[index] = el; }, className: "epn-slider__item" }, child)); })))); }; export { ItemsSlider as default };