| |
| |
| |
| |
| |
| |
| |
| export function waitForSmoothScrollEnd( |
| target: Window | HTMLElement, |
| expectedTop: number, |
| onDone: () => void, |
| maxWaitMs = 2000 |
| ): () => void { |
| let settled = false; |
| let timeoutId = 0; |
|
|
| const getTop = () => |
| target === window ? window.scrollY : (target as HTMLElement).scrollTop; |
|
|
| const settle = () => { |
| if (settled) return; |
| settled = true; |
| dispose(); |
| onDone(); |
| }; |
|
|
| const check = () => { |
| if (Math.abs(getTop() - expectedTop) < 1) settle(); |
| }; |
|
|
| const onScrollEnd = () => settle(); |
|
|
| const dispose = () => { |
| if (timeoutId) window.clearTimeout(timeoutId); |
| target.removeEventListener('scroll', check); |
| target.removeEventListener('scrollend', onScrollEnd); |
| }; |
|
|
| target.addEventListener('scroll', check, { passive: true }); |
| target.addEventListener('scrollend', onScrollEnd, { once: true }); |
| check(); |
| if (!settled) timeoutId = window.setTimeout(settle, maxWaitMs); |
|
|
| return () => { |
| settled = true; |
| dispose(); |
| }; |
| } |
|
|