| 
									
										
										
										
											2018-11-17 18:06:49 -08:00
										 |  |  | <VirtualListContainer {realm} on:initialized on:noNeedToScroll > | 
					
						
							| 
									
										
										
										
											2018-03-29 23:16:53 -07:00
										 |  |  |   <div class="virtual-list" | 
					
						
							| 
									
										
										
										
											2018-05-01 17:05:36 -07:00
										 |  |  |        style="height: {$height}px;" | 
					
						
							| 
									
										
										
										
											2018-03-22 17:33:42 -07:00
										 |  |  |        ref:node > | 
					
						
							| 
									
										
										
										
											2018-05-01 17:05:36 -07:00
										 |  |  |     <VirtualListHeader component={headerComponent} virtualProps={headerProps} shown={$showHeader}/> | 
					
						
							|  |  |  |     {#if $visibleItems} | 
					
						
							|  |  |  |       {#each $visibleItems as visibleItem (visibleItem.key)} | 
					
						
							|  |  |  |         <VirtualListLazyItem {component} | 
					
						
							|  |  |  |                              offset={visibleItem.offset} | 
					
						
							|  |  |  |                              {makeProps} | 
					
						
							|  |  |  |                              key={visibleItem.key} | 
					
						
							|  |  |  |                              index={visibleItem.index} | 
					
						
							| 
									
										
										
										
											2018-02-12 22:06:05 -08:00
										 |  |  |         /> | 
					
						
							| 
									
										
										
										
											2018-05-01 17:05:36 -07:00
										 |  |  |       {/each} | 
					
						
							|  |  |  |     {/if} | 
					
						
							|  |  |  |     {#if $showFooter} | 
					
						
							|  |  |  |       <VirtualListFooter component={footerComponent} /> | 
					
						
							|  |  |  |     {/if} | 
					
						
							| 
									
										
										
										
											2018-02-12 22:06:05 -08:00
										 |  |  |   </div> | 
					
						
							|  |  |  | </VirtualListContainer> | 
					
						
							| 
									
										
										
										
											2018-01-15 10:54:02 -08:00
										 |  |  | <style> | 
					
						
							|  |  |  |   .virtual-list { | 
					
						
							|  |  |  |     position: relative; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | </style> | 
					
						
							|  |  |  | <script> | 
					
						
							| 
									
										
										
										
											2018-02-12 22:06:05 -08:00
										 |  |  |   import VirtualListContainer from './VirtualListContainer.html' | 
					
						
							| 
									
										
										
										
											2018-01-23 18:15:14 -08:00
										 |  |  |   import VirtualListLazyItem from './VirtualListLazyItem' | 
					
						
							| 
									
										
										
										
											2018-01-21 16:07:11 -08:00
										 |  |  |   import VirtualListFooter from './VirtualListFooter.html' | 
					
						
							| 
									
										
										
										
											2018-02-11 19:15:21 -08:00
										 |  |  |   import VirtualListHeader from './VirtualListHeader.html' | 
					
						
							| 
									
										
										
										
											2018-01-25 08:23:14 -08:00
										 |  |  |   import { virtualListStore } from './virtualListStore' | 
					
						
							| 
									
										
										
										
											2018-04-05 17:57:36 -07:00
										 |  |  |   import throttle from 'lodash-es/throttle' | 
					
						
							| 
									
										
										
										
											2018-01-25 08:23:14 -08:00
										 |  |  |   import { mark, stop } from '../../_utils/marks' | 
					
						
							| 
									
										
										
										
											2018-04-05 17:57:36 -07:00
										 |  |  |   import isEqual from 'lodash-es/isEqual' | 
					
						
							| 
									
										
										
										
											2018-04-30 08:29:04 -07:00
										 |  |  |   import { observe } from 'svelte-extras' | 
					
						
							| 
									
										
										
										
											2018-01-15 10:54:02 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-20 20:28:53 -07:00
										 |  |  |   const DISTANCE_FROM_BOTTOM_TO_FIRE = 800 | 
					
						
							| 
									
										
										
										
											2018-02-11 19:15:21 -08:00
										 |  |  |   const SCROLL_EVENT_THROTTLE = 1000 | 
					
						
							| 
									
										
										
										
											2018-01-15 17:25:32 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-15 10:54:02 -08:00
										 |  |  |   export default { | 
					
						
							| 
									
										
										
										
											2018-01-15 17:25:32 -08:00
										 |  |  |     oncreate () { | 
					
						
							| 
									
										
										
										
											2018-02-11 20:12:15 -08:00
										 |  |  |       this.fireScrollToBottom = throttle(() => { | 
					
						
							|  |  |  |         this.fire('scrollToBottom') | 
					
						
							|  |  |  |       }, SCROLL_EVENT_THROTTLE) | 
					
						
							|  |  |  |       this.fireScrollToTop = throttle(() => { | 
					
						
							|  |  |  |         this.fire('scrollToTop') | 
					
						
							|  |  |  |       }, SCROLL_EVENT_THROTTLE) | 
					
						
							| 
									
										
										
										
											2018-02-11 14:17:17 -08:00
										 |  |  |       this.observe('showFooter', showFooter => { | 
					
						
							| 
									
										
										
										
											2018-02-11 20:12:15 -08:00
										 |  |  |         mark('set showFooter') | 
					
						
							| 
									
										
										
										
											2018-08-29 21:42:57 -07:00
										 |  |  |         this.store.setForRealm({ showFooter: showFooter }) | 
					
						
							| 
									
										
										
										
											2018-02-11 20:12:15 -08:00
										 |  |  |         mark('set showFooter') | 
					
						
							| 
									
										
										
										
											2018-01-21 16:07:11 -08:00
										 |  |  |       }) | 
					
						
							| 
									
										
										
										
											2018-02-11 19:15:21 -08:00
										 |  |  |       this.observe('showHeader', showHeader => { | 
					
						
							| 
									
										
										
										
											2018-02-11 20:12:15 -08:00
										 |  |  |         mark('set showHeader') | 
					
						
							| 
									
										
										
										
											2018-08-29 21:42:57 -07:00
										 |  |  |         this.store.setForRealm({ showHeader: showHeader }) | 
					
						
							| 
									
										
										
										
											2018-02-11 20:12:15 -08:00
										 |  |  |         stop('set showHeader') | 
					
						
							| 
									
										
										
										
											2018-02-11 19:15:21 -08:00
										 |  |  |       }) | 
					
						
							| 
									
										
										
										
											2018-02-25 10:50:04 -08:00
										 |  |  |       this.observe('items', (newItems, oldItems) => { | 
					
						
							|  |  |  |         if (!newItems || isEqual(newItems, oldItems)) { | 
					
						
							|  |  |  |           return | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2018-01-17 00:59:15 -08:00
										 |  |  |         mark('set items') | 
					
						
							| 
									
										
										
										
											2018-08-29 21:42:57 -07:00
										 |  |  |         this.store.setForRealm({ items: newItems }) | 
					
						
							| 
									
										
										
										
											2018-01-17 00:59:15 -08:00
										 |  |  |         stop('set items') | 
					
						
							| 
									
										
										
										
											2018-01-15 10:54:02 -08:00
										 |  |  |       }) | 
					
						
							| 
									
										
										
										
											2018-12-02 14:25:35 -08:00
										 |  |  |       this.store.observe('allVisibleItemsHaveHeight', allVisibleItemsHaveHeight => { | 
					
						
							| 
									
										
										
										
											2018-01-24 19:26:08 -08:00
										 |  |  |         if (allVisibleItemsHaveHeight) { | 
					
						
							|  |  |  |           this.fire('initializedVisibleItems') | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       }) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-11 14:17:17 -08:00
										 |  |  |       this.observe('distanceFromBottom', (distanceFromBottom) => { | 
					
						
							| 
									
										
										
										
											2018-01-17 00:06:24 -08:00
										 |  |  |         if (distanceFromBottom >= 0 && | 
					
						
							| 
									
										
										
										
											2018-01-16 21:43:31 -08:00
										 |  |  |             distanceFromBottom <= DISTANCE_FROM_BOTTOM_TO_FIRE) { | 
					
						
							| 
									
										
										
										
											2018-01-18 21:52:58 -08:00
										 |  |  |           this.fireScrollToBottom() | 
					
						
							| 
									
										
										
										
											2018-01-16 21:43:31 -08:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2018-12-02 14:25:35 -08:00
										 |  |  |       }, { init: false }) | 
					
						
							| 
									
										
										
										
											2018-02-11 19:15:21 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-02 14:25:35 -08:00
										 |  |  |       this.store.observe('scrollTop', (scrollTop) => { | 
					
						
							| 
									
										
										
										
											2018-02-13 09:15:10 -08:00
										 |  |  |         this.fire('scrollTopChanged', scrollTop) | 
					
						
							|  |  |  |         if (scrollTop === 0) { | 
					
						
							| 
									
										
										
										
											2018-02-11 19:15:21 -08:00
										 |  |  |           this.fireScrollToTop() | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2018-03-22 17:33:42 -07:00
										 |  |  |         this.calculateListOffset() | 
					
						
							| 
									
										
										
										
											2018-02-11 19:15:21 -08:00
										 |  |  |       }) | 
					
						
							| 
									
										
										
										
											2018-01-15 18:29:28 -08:00
										 |  |  |     }, | 
					
						
							| 
									
										
										
										
											2018-01-15 10:54:02 -08:00
										 |  |  |     data: () => ({ | 
					
						
							| 
									
										
										
										
											2018-01-15 12:23:28 -08:00
										 |  |  |       component: null | 
					
						
							| 
									
										
										
										
											2018-01-15 10:54:02 -08:00
										 |  |  |     }), | 
					
						
							| 
									
										
										
										
											2018-01-15 12:23:28 -08:00
										 |  |  |     store: () => virtualListStore, | 
					
						
							| 
									
										
										
										
											2018-01-15 10:54:02 -08:00
										 |  |  |     components: { | 
					
						
							| 
									
										
										
										
											2018-02-12 22:06:05 -08:00
										 |  |  |       VirtualListContainer, | 
					
						
							| 
									
										
										
										
											2018-01-23 18:15:14 -08:00
										 |  |  |       VirtualListLazyItem, | 
					
						
							| 
									
										
										
										
											2018-02-11 19:15:21 -08:00
										 |  |  |       VirtualListFooter, | 
					
						
							|  |  |  |       VirtualListHeader | 
					
						
							| 
									
										
										
										
											2018-01-16 23:16:15 -08:00
										 |  |  |     }, | 
					
						
							|  |  |  |     computed: { | 
					
						
							| 
									
										
										
										
											2018-05-01 17:05:36 -07:00
										 |  |  |       distanceFromBottom: ({ $scrollHeight, $scrollTop, $offsetHeight }) => { | 
					
						
							| 
									
										
										
										
											2018-01-16 23:16:15 -08:00
										 |  |  |         return $scrollHeight - $scrollTop - $offsetHeight | 
					
						
							| 
									
										
										
										
											2018-12-02 14:25:35 -08:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2018-03-22 17:33:42 -07:00
										 |  |  |     }, | 
					
						
							|  |  |  |     methods: { | 
					
						
							| 
									
										
										
										
											2018-04-30 08:29:04 -07:00
										 |  |  |       observe, | 
					
						
							| 
									
										
										
										
											2018-04-19 21:38:01 -07:00
										 |  |  |       calculateListOffset () { | 
					
						
							| 
									
										
										
										
											2018-03-22 17:33:42 -07:00
										 |  |  |         // TODO: better way to get the offset top? | 
					
						
							|  |  |  |         let node = this.refs.node | 
					
						
							|  |  |  |         if (!node) { | 
					
						
							|  |  |  |           return | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         mark('calculateListOffset') | 
					
						
							|  |  |  |         let listOffset = node.offsetParent.offsetTop | 
					
						
							| 
									
										
										
										
											2018-08-29 21:42:57 -07:00
										 |  |  |         this.store.setForRealm({ listOffset }) | 
					
						
							| 
									
										
										
										
											2018-03-22 17:33:42 -07:00
										 |  |  |         stop('calculateListOffset') | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2018-01-15 10:54:02 -08:00
										 |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2018-12-02 14:25:35 -08:00
										 |  |  | </script> |