UNPKG

choerodon-ui

Version:

An enterprise-class UI design language and React-based implementation

132 lines (122 loc) 4.15 kB
import _slicedToArray from "@babel/runtime/helpers/slicedToArray"; import _defineProperty from "@babel/runtime/helpers/defineProperty"; import React, { memo, useCallback, useEffect, useRef, useState } from 'react'; import classNames from 'classnames'; import isString from 'lodash/isString'; import scrollTo from '../../../es/_util/scrollTo'; import Button from '../button/Button'; import { FuncType } from '../button/enum'; import Picture from './Picture'; import { stopPropagation } from '../_util/EventManager'; var MAX = 5; var SIZE = 60; var GUTTER = 8; var NavItem = function NavItem(props) { var prefixCls = props.prefixCls, index = props.index, onClick = props.onClick, active = props.active, src = props.src; var handleClick = useCallback(function () { onClick(index); }, [index, onClick]); return /*#__PURE__*/React.createElement(Picture, { className: classNames("".concat(prefixCls, "-item"), _defineProperty({}, "".concat(prefixCls, "-current"), active)), src: src, objectFit: "cover", objectPosition: "top left", status: "loaded", preview: false, lazy: false, draggable: false, width: SIZE, height: SIZE, onClick: handleClick }); }; NavItem.displayName = 'NavItem'; var MemoNavItem = /*#__PURE__*/memo(NavItem); var Navbar = function Navbar(props) { var prefixCls = props.prefixCls, value = props.value, list = props.list, onChange = props.onChange; var containerRef = useRef(null); var _useState = useState(value), _useState2 = _slicedToArray(_useState, 2), currentIndex = _useState2[0], setCurrentIndex = _useState2[1]; var navBarPrefixCls = "".concat(prefixCls, "-navbar"); var length = list.length; var disabled = length <= MAX; var handlePrev = useCallback(function () { setCurrentIndex(function (prevCurrentIndex) { return Math.max(prevCurrentIndex - MAX, 0); }); }, []); var handleNext = useCallback(function () { setCurrentIndex(function (prevCurrentIndex) { return Math.min(prevCurrentIndex + MAX, length - 1); }); }, [length]); useEffect(function () { var current = containerRef.current; if (current) { scrollTo(currentIndex * (SIZE + GUTTER), { getContainer: function getContainer() { return current; }, top: false }); } }, [currentIndex]); useEffect(function () { if (value < currentIndex || value >= currentIndex + MAX) { setCurrentIndex(value); } }, [value]); var renderList = function renderList() { return list.map(function (item, index) { return /*#__PURE__*/React.createElement(MemoNavItem, { key: String(index), prefixCls: navBarPrefixCls, active: index === value, src: isString(item) ? item : item.src, onClick: onChange, index: index }); }); }; return /*#__PURE__*/React.createElement("div", { className: navBarPrefixCls }, /*#__PURE__*/React.createElement(Button, { icon: "navigate_before", disabled: disabled || currentIndex === 0, funcType: FuncType.link, onClick: handlePrev, onMouseDown: stopPropagation, className: "".concat(prefixCls, "-btn ").concat(prefixCls, "-btn-nav") }), /*#__PURE__*/React.createElement("div", { ref: containerRef, className: "".concat(navBarPrefixCls, "-scroll-container"), style: disabled ? undefined : { width: SIZE * MAX + GUTTER * (MAX - 1) }, onMouseDown: stopPropagation }, /*#__PURE__*/React.createElement("div", { className: "".concat(navBarPrefixCls, "-scroll"), style: disabled ? undefined : { width: SIZE * length + GUTTER * (length - 1) } }, renderList())), /*#__PURE__*/React.createElement(Button, { icon: "navigate_next", disabled: disabled || currentIndex > length - MAX, funcType: FuncType.link, onClick: handleNext, onMouseDown: stopPropagation, className: "".concat(prefixCls, "-btn ").concat(prefixCls, "-btn-nav") })); }; Navbar.displayName = 'Navbar'; export default /*#__PURE__*/memo(Navbar); //# sourceMappingURL=Navbar.js.map