@perfma/heaven
Version:
An UI Framework base [Ant Design V4](https://ant.design/components/overview-cn/) for React.
173 lines (148 loc) • 6.41 kB
JavaScript
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
import React, { useState, useEffect } from 'react';
import { classNames, nextTick } from '../_util';
import './letter-index-list.less';
var LetterIndexList = function LetterIndexList(props) {
var _props$dataSource = props.dataSource,
dataSource = _props$dataSource === void 0 ? [] : _props$dataSource,
initialValue = props.initialValue,
_props$selectable = props.selectable,
selectable = _props$selectable === void 0 ? true : _props$selectable,
_props$height = props.height,
height = _props$height === void 0 ? 400 : _props$height,
_props$width = props.width,
width = _props$width === void 0 ? 194 : _props$width,
onChange = props.onChange,
itemRender = props.itemRender;
var _useState = useState(0),
_useState2 = _slicedToArray(_useState, 2),
parentOffsetTop = _useState2[0],
setParentOffsetTop = _useState2[1];
var listRef = React.useRef();
useEffect(function () {
setParentOffsetTop(listRef.current.offsetTop);
}, []);
var _useState3 = useState([]),
_useState4 = _slicedToArray(_useState3, 2),
letters = _useState4[0],
setLetters = _useState4[1];
var _useState5 = useState([]),
_useState6 = _slicedToArray(_useState5, 2),
list = _useState6[0],
setList = _useState6[1];
useEffect(function () {
setLetters(dataSource.map(function (val) {
return val.letter;
}));
var trans = [];
dataSource.forEach(function (group) {
trans.push({
isLetter: true,
id: group.letter.toUpperCase(),
name: group.letter.toUpperCase()
});
group.children.forEach(function (item) {
trans.push({
id: item.id,
name: item.name
});
});
});
setList(trans);
nextTick(function () {
var target = document.querySelector("[data-id=\"".concat(initialValue, "\"]"));
if (target) {
var offsetTop = target.offsetTop;
listRef.current.scrollTo({
top: offsetTop - listRef.current.offsetTop - 38 // 38 is sticky Letter's height
});
}
});
}, [dataSource]);
var _useState7 = useState(''),
_useState8 = _slicedToArray(_useState7, 2),
currentGroup = _useState8[0],
setCurrentGroup = _useState8[1];
var handleScroll = function handleScroll() {
var _listRef$current = listRef.current,
scrollTop = _listRef$current.scrollTop,
offsetTop = _listRef$current.offsetTop,
children = _listRef$current.children;
var curr;
for (var i = 0; i < children.length; i++) {
var ele = children[i];
if (scrollTop >= ele.offsetTop - offsetTop) {
if (ele.dataset.letter) {
curr = ele.dataset.letter;
}
} else {
break;
}
}
setParentOffsetTop(offsetTop);
setCurrentGroup(curr);
};
var handleNavgation = function handleNavgation(letter) {
var target = document.querySelector("[data-letter=\"".concat(letter, "\"]"));
if (target) {
var offsetTop = target.offsetTop;
listRef.current.scrollTo({
top: offsetTop - parentOffsetTop
});
}
};
var _useState9 = useState(),
_useState10 = _slicedToArray(_useState9, 2),
selected = _useState10[0],
setSelected = _useState10[1];
var handleSelect = function handleSelect(val) {
if (!selectable) return;
var id = val.id;
setSelected(id);
onChange && onChange({
selected: id,
item: val
});
};
useEffect(function () {
setSelected(initialValue);
}, []);
return /*#__PURE__*/React.createElement("div", {
className: "letter-index-list",
style: {
height: height,
width: width
}
}, /*#__PURE__*/React.createElement("div", {
className: "letter-index-list-nav"
}, letters.map(function (letter) {
return /*#__PURE__*/React.createElement("div", {
key: letter,
className: "letter-index-list-nav-item ".concat(currentGroup === letter && 'is-active'),
onClick: function onClick() {
return handleNavgation(letter);
}
}, letter);
})), /*#__PURE__*/React.createElement("div", {
// @ts-ignore
ref: listRef,
className: "letter-index-list-content",
onScrollCapture: handleScroll
}, list.map(function (item) {
return /*#__PURE__*/React.createElement("div", {
key: item.id,
className: classNames(['letter-index-list-content-item', item.isLetter && 'is-letter', currentGroup === item.name && 'is-sticky', selected === item.id && 'is-selected']),
"data-id": item.id,
"data-letter": item.isLetter ? item.name.toUpperCase() : null,
onClick: function onClick() {
return !item.isLetter && handleSelect(item);
}
}, !item.isLetter && itemRender ? itemRender(item) : item.name);
})));
};
export default LetterIndexList;