Skip to content

Commit

Permalink
fix: scrollToItem with center alignment causes infinite loop
Browse files Browse the repository at this point in the history
  • Loading branch information
wellyshen committed Jun 12, 2021
1 parent ac28775 commit 99ffe72
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 23 deletions.
5 changes: 5 additions & 0 deletions .changeset/nine-bananas-pay.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"react-cool-virtual": patch
---

fix: `scrollToItem` with center alignment causes infinite loop
38 changes: 15 additions & 23 deletions src/useVirtual.ts
Original file line number Diff line number Diff line change
Expand Up @@ -243,37 +243,29 @@ export default <
if (!ms) return;

const { start, end, size } = ms;
let { current: scrollOffset } = scrollOffsetRef;
const totalSize = msData[msData.length - 1].end;
const outerSize = outerRectRef.current[sizeKey];
let { current: scrollOffset } = scrollOffsetRef;

if (totalSize <= outerSize) {
if (cb) cb();
return;
}

const endPos = start - outerSize + size;

switch (align) {
case Align.start:
scrollOffset =
totalSize - start <= outerSize ? totalSize - outerSize : start;
break;
case Align.center: {
const to = start - outerSize / 2 + size / 2;
scrollOffset =
totalSize - to <= outerSize ? totalSize - outerSize : to;
break;
}
case Align.end:
scrollOffset = start + size <= outerSize ? 0 : endPos;
break;
default:
if (scrollOffset > start) {
scrollOffset = start;
} else if (scrollOffset + outerSize < end) {
scrollOffset = endPos;
}
if (
align === Align.start ||
(align === Align.auto && scrollOffset > start)
) {
scrollOffset =
totalSize - start <= outerSize ? totalSize - outerSize : start;
} else if (
align === Align.end ||
(align === Align.auto && scrollOffset + outerSize < end)
) {
scrollOffset = start + size <= outerSize ? 0 : start - outerSize + size;
} else if (align === Align.center && start + size / 2 > outerSize / 2) {
const to = start - outerSize / 2 + size / 2;
scrollOffset = totalSize - to <= outerSize ? totalSize - outerSize : to;
}

if (
Expand Down

0 comments on commit 99ffe72

Please sign in to comment.