( instance: Virtualizer<T, any>, cb: ObserveOffsetCallBack, )
| 139 | type ObserveOffsetCallBack = (offset: number, isScrolling: boolean) => void |
| 140 | |
| 141 | export const observeElementOffset = <T extends Element>( |
| 142 | instance: Virtualizer<T, any>, |
| 143 | cb: ObserveOffsetCallBack, |
| 144 | ) => { |
| 145 | const element = instance.scrollElement |
| 146 | if (!element) { |
| 147 | return |
| 148 | } |
| 149 | const targetWindow = instance.targetWindow |
| 150 | if (!targetWindow) { |
| 151 | return |
| 152 | } |
| 153 | |
| 154 | let offset = 0 |
| 155 | const fallback = |
| 156 | instance.options.useScrollendEvent && supportsScrollend |
| 157 | ? () => undefined |
| 158 | : debounce( |
| 159 | targetWindow, |
| 160 | () => { |
| 161 | cb(offset, false) |
| 162 | }, |
| 163 | instance.options.isScrollingResetDelay, |
| 164 | ) |
| 165 | |
| 166 | const createHandler = (isScrolling: boolean) => () => { |
| 167 | const { horizontal, isRtl } = instance.options |
| 168 | offset = horizontal |
| 169 | ? element['scrollLeft'] * ((isRtl && -1) || 1) |
| 170 | : element['scrollTop'] |
| 171 | fallback() |
| 172 | cb(offset, isScrolling) |
| 173 | } |
| 174 | const handler = createHandler(true) |
| 175 | const endHandler = createHandler(false) |
| 176 | endHandler() |
| 177 | |
| 178 | element.addEventListener('scroll', handler, addEventListenerOptions) |
| 179 | const registerScrollendEvent = |
| 180 | instance.options.useScrollendEvent && supportsScrollend |
| 181 | if (registerScrollendEvent) { |
| 182 | element.addEventListener('scrollend', endHandler, addEventListenerOptions) |
| 183 | } |
| 184 | return () => { |
| 185 | element.removeEventListener('scroll', handler) |
| 186 | if (registerScrollendEvent) { |
| 187 | element.removeEventListener('scrollend', endHandler) |
| 188 | } |
| 189 | } |
| 190 | } |
| 191 | |
| 192 | export const observeWindowOffset = ( |
| 193 | instance: Virtualizer<Window, any>, |
nothing calls this directly
no test coverage detected