react-native-sortables
Version:
Powerful Sortable Components for Flexible Content Reordering in React Native
62 lines (57 loc) • 1.84 kB
JavaScript
;
import { getCrossIndex, getMainIndex } from './helpers';
export const calculateLayout = ({
gaps,
indexToKey,
isVertical,
itemDimensions,
mainGroupSize,
numGroups
}) => {
'worklet';
if (!mainGroupSize) {
return null;
}
const crossAxisOffsets = [0];
const itemPositions = {};
let crossDimension;
let mainCoordinate;
let crossCoordinate;
if (isVertical) {
// grid with specified number of columns (vertical orientation)
crossDimension = 'height'; // items can grow vertically
mainCoordinate = 'x';
crossCoordinate = 'y';
} else {
// grid with specified number of rows (horizontal orientation)
crossDimension = 'width'; // items can grow horizontally
mainCoordinate = 'y';
crossCoordinate = 'x';
}
for (const [itemIndex, itemKey] of indexToKey.entries()) {
const crossItemSize = itemDimensions[itemKey]?.[crossDimension];
// Return if the item is not yet measured
if (crossItemSize === undefined) {
return null;
}
const mainIndex = getMainIndex(itemIndex, numGroups);
const crossIndex = getCrossIndex(itemIndex, numGroups);
const crossAxisOffset = crossAxisOffsets[crossIndex] ?? 0;
// Update offset of the next group
crossAxisOffsets[crossIndex + 1] = Math.max(crossAxisOffsets[crossIndex + 1] ?? 0, crossAxisOffset + crossItemSize + gaps.cross);
// Update item position
itemPositions[itemKey] = {
[crossCoordinate]: crossAxisOffset,
[mainCoordinate]: mainIndex * (mainGroupSize + gaps.main)
};
}
const lastCrossOffset = crossAxisOffsets[crossAxisOffsets.length - 1];
return {
calculatedDimensions: {
[crossDimension]: lastCrossOffset ? Math.max(lastCrossOffset - gaps.cross, 0) : 0
},
crossAxisOffsets,
itemPositions
};
};
//# sourceMappingURL=layout.js.map