| 
									
										
										
										
											2018-01-21 14:31:59 -08:00
										 |  |  | <div class="virtual-list {{shown ? '' : 'hidden'}}" style="height: {{$height}}px;"> | 
					
						
							| 
									
										
										
										
											2018-02-11 19:15:21 -08:00
										 |  |  |   <VirtualListHeader component="{{headerComponent}}" virtualProps="{{headerProps}}" shown="{{$showHeader}}"/> | 
					
						
							| 
									
										
										
										
											2018-02-08 18:54:48 -08:00
										 |  |  |   {{#if $visibleItems}} | 
					
						
							|  |  |  |     {{#each $visibleItems as visibleItem @key}} | 
					
						
							|  |  |  |       <VirtualListLazyItem :component | 
					
						
							|  |  |  |                            offset="{{visibleItem.offset}}" | 
					
						
							|  |  |  |                            makeProps="{{makeProps}}" | 
					
						
							|  |  |  |                            key="{{visibleItem.key}}" | 
					
						
							|  |  |  |                            index="{{visibleItem.index}}" | 
					
						
							|  |  |  |       /> | 
					
						
							|  |  |  |     {{/each}} | 
					
						
							|  |  |  |   {{/if}} | 
					
						
							| 
									
										
										
										
											2018-01-21 16:07:11 -08:00
										 |  |  |   {{#if $showFooter}} | 
					
						
							|  |  |  |     <VirtualListFooter component="{{footerComponent}}"/> | 
					
						
							|  |  |  |   {{/if}} | 
					
						
							| 
									
										
										
										
											2018-01-15 10:54:02 -08:00
										 |  |  | </div> | 
					
						
							|  |  |  | <style> | 
					
						
							|  |  |  |   .virtual-list { | 
					
						
							|  |  |  |     position: relative; | 
					
						
							| 
									
										
										
										
											2018-01-21 14:31:59 -08:00
										 |  |  |     transition: opacity 0.25s linear; | 
					
						
							| 
									
										
										
										
											2018-01-15 10:54:02 -08:00
										 |  |  |   } | 
					
						
							|  |  |  | </style> | 
					
						
							|  |  |  | <script> | 
					
						
							| 
									
										
										
										
											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-01-18 21:52:58 -08:00
										 |  |  |   import throttle from 'lodash/throttle' | 
					
						
							| 
									
										
										
										
											2018-01-25 08:23:14 -08:00
										 |  |  |   import { mark, stop } from '../../_utils/marks' | 
					
						
							| 
									
										
										
										
											2018-01-15 10:54:02 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-18 21:52:58 -08:00
										 |  |  |   const DISTANCE_FROM_BOTTOM_TO_FIRE = 400 | 
					
						
							| 
									
										
										
										
											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-01-27 08:13:28 -08: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-02-11 19:15:21 -08: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-11 20:12:15 -08:00
										 |  |  |       this.observe('itemsStringified', (itemsStringified) => { | 
					
						
							|  |  |  |         let items = typeof itemsStringified === 'undefined' ? undefined : | 
					
						
							|  |  |  |           JSON.parse(itemsStringified) | 
					
						
							| 
									
										
										
										
											2018-01-17 00:59:15 -08:00
										 |  |  |         mark('set items') | 
					
						
							| 
									
										
										
										
											2018-01-27 08:13:28 -08:00
										 |  |  |         this.store.setForRealm({items: items}) | 
					
						
							| 
									
										
										
										
											2018-01-17 00:59:15 -08:00
										 |  |  |         stop('set items') | 
					
						
							| 
									
										
										
										
											2018-01-15 10:54:02 -08:00
										 |  |  |       }) | 
					
						
							| 
									
										
										
										
											2018-02-11 14:17:17 -08:00
										 |  |  |       this.observe('allVisibleItemsHaveHeight', allVisibleItemsHaveHeight => { | 
					
						
							| 
									
										
										
										
											2018-01-24 19:26:08 -08:00
										 |  |  |         if (allVisibleItemsHaveHeight) { | 
					
						
							|  |  |  |           this.fire('initializedVisibleItems') | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       }) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-17 00:06:24 -08:00
										 |  |  |       let observedOnce = false | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-11 14:17:17 -08:00
										 |  |  |       this.observe('distanceFromBottom', (distanceFromBottom) => { | 
					
						
							| 
									
										
										
										
											2018-01-17 00:06:24 -08:00
										 |  |  |         if (!observedOnce) { | 
					
						
							|  |  |  |           observedOnce = true // TODO: the first time is always 0... need better way to handle this | 
					
						
							|  |  |  |           return | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         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-02-11 19:15:21 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |       this.observe('distanceFromTop', (distanceFromTop) => { | 
					
						
							|  |  |  |         if (distanceFromTop === 0) { | 
					
						
							|  |  |  |           this.fireScrollToTop() | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       }) | 
					
						
							| 
									
										
										
										
											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-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: { | 
					
						
							|  |  |  |       distanceFromBottom: ($scrollHeight, $scrollTop, $offsetHeight) => { | 
					
						
							|  |  |  |         return $scrollHeight - $scrollTop - $offsetHeight | 
					
						
							| 
									
										
										
										
											2018-01-24 19:26:08 -08:00
										 |  |  |       }, | 
					
						
							| 
									
										
										
										
											2018-02-11 19:15:21 -08:00
										 |  |  |       distanceFromTop: ($scrollTop) => $scrollTop, | 
					
						
							| 
									
										
										
										
											2018-01-24 19:26:08 -08:00
										 |  |  |       // TODO: bug in svelte store, shouldn't need to do this | 
					
						
							| 
									
										
										
										
											2018-02-11 20:12:15 -08:00
										 |  |  |       allVisibleItemsHaveHeight: ($allVisibleItemsHaveHeight) => $allVisibleItemsHaveHeight, | 
					
						
							|  |  |  |       // hack to avoid getting called too often | 
					
						
							|  |  |  |       itemsStringified: (items) => JSON.stringify(items) | 
					
						
							| 
									
										
										
										
											2018-01-15 10:54:02 -08:00
										 |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | </script> |