@1771technologies/lytenyte-pro
Version:
Blazingly fast headless React data grid with 100s of features.
56 lines (55 loc) • 2.18 kB
JavaScript
import { useMemo, useRef } from "react";
export function useFlattenedPiece({ leafsTop, leafsCenter, leafsBot, groupFlat, centerIndices, }) {
const rowByIdRef = useRef(null);
const rowByIndexRef = useRef(null);
const rowIdToRowIndexRef = useRef(null);
const [flatten] = useMemo(() => {
const flat = [];
const byId = new Map();
const byIndex = new Map();
const byIdToIndex = new Map();
for (let i = 0; i < leafsTop.length; i++) {
const node = leafsTop[i];
flat.push(node);
byIndex.set(i, node);
byId.set(node.id, node);
byIdToIndex.set(node.id, i);
}
const offset = leafsTop.length;
if (groupFlat) {
for (let i = 0; i < groupFlat.length; i++) {
const rowIndex = i + offset;
const node = groupFlat[i];
flat.push(node);
byIndex.set(rowIndex, node);
byId.set(node.id, node);
byIdToIndex.set(node.id, rowIndex);
}
}
else {
for (let i = 0; i < centerIndices.length; i++) {
const rowIndex = i + offset;
const srcIndex = centerIndices[i];
const node = leafsCenter[srcIndex];
flat.push(node);
byIndex.set(rowIndex, node);
byId.set(node.id, node);
byIdToIndex.set(node.id, rowIndex);
}
}
const botOffset = offset + (groupFlat ? groupFlat.length : centerIndices.length);
for (let i = 0; i < leafsBot.length; i++) {
const rowIndex = i + botOffset;
const node = leafsBot[i];
flat.push(node);
byIndex.set(rowIndex, node);
byId.set(node.id, node);
byIdToIndex.set(node.id, rowIndex);
}
rowByIdRef.current = byId;
rowByIndexRef.current = byIndex;
rowIdToRowIndexRef.current = byIdToIndex;
return [flat];
}, [centerIndices, groupFlat, leafsBot, leafsCenter, leafsTop]);
return { flatten, rowByIdRef, rowByIndexRef, rowIdToRowIndexRef };
}