react-dynamic-virtual-tree
Version:
Library for visualizing nested lists with dynamically changing sizes.
62 lines (61 loc) • 2.53 kB
JavaScript
var __assign = (this && this.__assign) || function () {
__assign = Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
import { useContext, useMemo } from "react";
import { VirtualTreeContext } from "./virtualTreeContext";
export var getLevel = function (layer, level) {
if (level === void 0) { level = 0; }
if (layer.parent) {
return getLevel(layer.parent, level + 1);
}
else {
return level;
}
};
export var LayerComponent = function (_a) {
var children = _a.children, layer = _a.layer, listItem = _a.listItem, getComponentProps = _a.getComponentProps;
var _b = useContext(VirtualTreeContext), offset = _b.offset, root = _b.root, ready = _b.ready;
var onInitHeight = function (height) {
var level = getLevel(layer);
var layers = layer.getLayersByLevel(level + 1);
layers.forEach(function (layer) {
layer.listItem.height = height;
});
};
var visibleSlice = useMemo(function () {
return root.getSlice.apply(root, offset);
}, [offset]);
var getProps = function (index) {
return {
layer: layer.children[index],
listItem: listItem.children[index],
props: getComponentProps ? getComponentProps(index) : undefined,
onInitHeight: onInitHeight,
sample: false,
};
};
var getSampleProps = function () {
return __assign(__assign({}, getProps(0)), { sample: true });
};
var isVisible = function (item) {
return !!visibleSlice.find(function (visibleItem) { return visibleItem.compare(item); });
};
var noProps = function (index) {
return getComponentProps !== undefined && getComponentProps(index) === undefined;
};
var Component = useMemo(function () {
return children;
}, []);
return (_jsxs(_Fragment, { children: [!ready && layer.children.length !== 0 && children(getSampleProps()), layer.children.map(function (item, index) {
return isVisible(item.listItem) && !noProps(index) && item.listItem.height > 0 ? (_jsx(Component, __assign({}, getProps(index)), item.listItem.id)) : null;
})] }));
};