summaryrefslogtreecommitdiff
path: root/spec/frontend/helpers/scroll_into_view_promise.js
blob: 0edea2103da0b220cf0de0b96c7290953d62a38e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
export default function scrollIntoViewPromise(intersectionTarget, timeout = 100, maxTries = 5) {
  return new Promise((resolve, reject) => {
    let intersectionObserver;
    let retry = 0;

    const intervalId = setInterval(() => {
      if (retry >= maxTries) {
        intersectionObserver.disconnect();
        clearInterval(intervalId);
        reject(new Error(`Could not scroll target into viewPort within ${timeout * maxTries} ms`));
      }
      retry += 1;
      intersectionTarget.scrollIntoView();
    }, timeout);

    intersectionObserver = new IntersectionObserver(entries => {
      if (entries[0].isIntersecting) {
        intersectionObserver.disconnect();
        clearInterval(intervalId);
        resolve();
      }
    });

    intersectionObserver.observe(intersectionTarget);

    intersectionTarget.scrollIntoView();
  });
}