<div class="container" on:scroll="onScroll(event)" on:fullscreen="onFullscreenChange()" ref:node> <slot></slot> </div> <script> import { virtualListStore } from './virtualListStore' import throttle from 'lodash/throttle' import { isFullscreen, attachFullscreenListener, detachFullscreenListener } from '../../_utils/fullscreen' import { mark, stop } from '../../_utils/marks' const SCROLL_EVENT_DELAY = 300 export default { oncreate() { mark('onCreate VirtualListContainer') let node = this.refs.node let realm = this.get('realm') this.store.set({currentRealm: realm}) let scrollTop = this.store.get('scrollTop') if (scrollTop > 0) { this.observe('allVisibleItemsHaveHeight', allVisibleItemsHaveHeight => { console.log('allVisibleItemsHaveHeight', allVisibleItemsHaveHeight) if (!this.get('initializedScrollTop') && allVisibleItemsHaveHeight && node) { this.set({'initializedScrollTop': true}) requestAnimationFrame(() => { mark('set scrollTop') console.log('forcing scroll top to ', scrollTop) node.scrollTop = scrollTop stop('set scrollTop') }) } }) } else { this.store.setForRealm({ scrollHeight: node.scrollHeight, offsetHeight: node.offsetHeight }) } stop('onCreate VirtualListContainer') }, store: () => virtualListStore, events: { scroll(node, callback) { const onScroll = throttle(event => { mark('onScroll') if (this.get('fullscreen')) { return } callback(event) stop('onScroll') }, SCROLL_EVENT_DELAY, { leading: true, trailing: true }) node.addEventListener('scroll', onScroll) return { teardown() { node.removeEventListener('scroll', onScroll) } } }, fullscreen(node, callback) { const onFullscreen = (() => { callback() }) attachFullscreenListener(onFullscreen) return { teardown() { detachFullscreenListener(onFullscreen) } } } }, methods: { onScroll(event) { this.store.setForRealm({ scrollTop: event.target.scrollTop, scrollHeight: event.target.scrollHeight }) }, onFullscreenChange() { mark('onFullscreenChange') console.log('is fullscreen? ', isFullscreen()) this.set({ fullscreen: isFullscreen() }) stop('onFullscreenChange') } }, computed: { // TODO: bug in svelte/store – the observer in oncreate() never get removed without this hack allVisibleItemsHaveHeight: ($allVisibleItemsHaveHeight) => $allVisibleItemsHaveHeight } }; </script>