choerodon-ui
Version:
An enterprise-class UI design language and React-based implementation
132 lines (122 loc) • 4.15 kB
JavaScript
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