| 
									
										
										
										
											2018-01-27 10:46:52 -08:00
										 |  |  | <div class="timeline" role="feed" aria-label="{{label}}"> | 
					
						
							| 
									
										
										
										
											2018-01-30 22:21:31 -08:00
										 |  |  |   {{#if !$initialized}} | 
					
						
							|  |  |  |     <div class="loading-page"> | 
					
						
							|  |  |  |       <LoadingSpinner /> | 
					
						
							|  |  |  |     </div> | 
					
						
							|  |  |  |   {{/if}} | 
					
						
							| 
									
										
										
										
											2018-02-03 18:06:02 -08:00
										 |  |  |   {{#if timelineType === 'notifications'}} | 
					
						
							|  |  |  |     <VirtualList component="{{NotificationVirtualListItem}}" | 
					
						
							|  |  |  |                  :makeProps | 
					
						
							|  |  |  |                  items="{{$timelineItemIds}}" | 
					
						
							|  |  |  |                  on:scrollToBottom="onScrollToBottom()" | 
					
						
							|  |  |  |                  shown="{{$initialized}}" | 
					
						
							|  |  |  |                  footerComponent="{{LoadingFooter}}" | 
					
						
							|  |  |  |                  showFooter="{{$initialized && $runningUpdate}}" | 
					
						
							|  |  |  |                  realm="{{$currentInstance + '/' + timeline}}" | 
					
						
							|  |  |  |                  on:initializedVisibleItems="initialize()" | 
					
						
							|  |  |  |   /> | 
					
						
							|  |  |  |   {{elseif virtual}} | 
					
						
							| 
									
										
										
										
											2018-01-29 19:22:28 -08:00
										 |  |  |     <VirtualList component="{{StatusVirtualListItem}}" | 
					
						
							|  |  |  |                  :makeProps | 
					
						
							| 
									
										
										
										
											2018-02-03 18:06:02 -08:00
										 |  |  |                  items="{{$timelineItemIds}}" | 
					
						
							| 
									
										
										
										
											2018-01-29 19:22:28 -08:00
										 |  |  |                  on:scrollToBottom="onScrollToBottom()" | 
					
						
							|  |  |  |                  shown="{{$initialized}}" | 
					
						
							|  |  |  |                  footerComponent="{{LoadingFooter}}" | 
					
						
							|  |  |  |                  showFooter="{{$initialized && $runningUpdate}}" | 
					
						
							|  |  |  |                  realm="{{$currentInstance + '/' + timeline}}" | 
					
						
							|  |  |  |                  on:initializedVisibleItems="initialize()" | 
					
						
							|  |  |  |     /> | 
					
						
							|  |  |  |   {{else}} | 
					
						
							|  |  |  |     <!-- if this is a status thread, it's easier to just render the
 | 
					
						
							|  |  |  |          whole thing rather than use a virtual list --> | 
					
						
							|  |  |  |     <PseudoVirtualList component="{{StatusVirtualListItem}}" | 
					
						
							|  |  |  |                        :makeProps | 
					
						
							| 
									
										
										
										
											2018-02-03 18:06:02 -08:00
										 |  |  |                        items="{{$timelineItemIds}}" | 
					
						
							| 
									
										
										
										
											2018-01-29 19:22:28 -08:00
										 |  |  |                        shown="{{$initialized}}" | 
					
						
							|  |  |  |                        on:initializedVisibleItems="initialize()" | 
					
						
							|  |  |  |                        scrollToItem="{{timelineValue}}" | 
					
						
							| 
									
										
										
										
											2018-01-30 18:26:13 -08:00
										 |  |  |                        realm="{{$currentInstance + '/' + timeline}}" | 
					
						
							| 
									
										
										
										
											2018-01-29 19:22:28 -08:00
										 |  |  |     /> | 
					
						
							|  |  |  |   {{/if}} | 
					
						
							| 
									
										
										
										
											2018-01-15 10:54:02 -08:00
										 |  |  | </div> | 
					
						
							| 
									
										
										
										
											2018-01-16 20:34:09 -08:00
										 |  |  | <style> | 
					
						
							|  |  |  |   .timeline { | 
					
						
							| 
									
										
										
										
											2018-01-19 00:51:51 -08:00
										 |  |  |     min-height: 60vh; | 
					
						
							| 
									
										
										
										
											2018-01-30 22:21:31 -08:00
										 |  |  |     position: relative; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   .loading-page { | 
					
						
							|  |  |  |     position: absolute; | 
					
						
							|  |  |  |     top: 0; | 
					
						
							|  |  |  |     left: 0; | 
					
						
							|  |  |  |     right: 0; | 
					
						
							| 
									
										
										
										
											2018-01-30 22:46:35 -08:00
										 |  |  |     height: 150px; | 
					
						
							| 
									
										
										
										
											2018-01-30 22:21:31 -08:00
										 |  |  |     display: flex; | 
					
						
							|  |  |  |     align-items: center; | 
					
						
							|  |  |  |     justify-content: center; | 
					
						
							|  |  |  |     z-index: 50; | 
					
						
							| 
									
										
										
										
											2018-01-16 20:34:09 -08:00
										 |  |  |   } | 
					
						
							|  |  |  | </style> | 
					
						
							| 
									
										
										
										
											2018-01-08 18:14:21 -08:00
										 |  |  | <script> | 
					
						
							| 
									
										
										
										
											2018-01-28 13:09:39 -08:00
										 |  |  |   import { store } from '../../_store/store' | 
					
						
							| 
									
										
										
										
											2018-01-29 19:22:28 -08:00
										 |  |  |   import StatusVirtualListItem from './StatusVirtualListItem.html' | 
					
						
							| 
									
										
										
										
											2018-02-03 18:06:02 -08:00
										 |  |  |   import NotificationVirtualListItem from './NotificationVirtualListItem.html' | 
					
						
							| 
									
										
										
										
											2018-01-29 19:22:28 -08:00
										 |  |  |   import Status from '../status/Status.html' | 
					
						
							|  |  |  |   import PseudoVirtualList from '../pseudoVirtualList/PseudoVirtualList.html' | 
					
						
							| 
									
										
										
										
											2018-01-21 16:07:11 -08:00
										 |  |  |   import LoadingFooter from './LoadingFooter.html' | 
					
						
							| 
									
										
										
										
											2018-01-27 16:35:44 -08:00
										 |  |  |   import VirtualList from '../virtualList/VirtualList.html' | 
					
						
							|  |  |  |   import { timelines } from '../../_static/timelines' | 
					
						
							|  |  |  |   import { database } from '../../_utils/database/database' | 
					
						
							| 
									
										
										
										
											2018-02-03 18:06:02 -08:00
										 |  |  |   import { initializeTimeline, fetchTimelineItemsOnScrollToBottom, setupTimeline } from '../../_actions/timeline' | 
					
						
							| 
									
										
										
										
											2018-01-30 22:21:31 -08:00
										 |  |  |   import LoadingSpinner from '../LoadingSpinner.html' | 
					
						
							| 
									
										
										
										
											2018-01-18 20:25:34 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-08 18:14:21 -08:00
										 |  |  |   export default { | 
					
						
							| 
									
										
										
										
											2018-01-17 18:35:27 -08:00
										 |  |  |     async oncreate() { | 
					
						
							| 
									
										
										
										
											2018-01-29 19:22:28 -08:00
										 |  |  |       console.log('timeline oncreate()') | 
					
						
							| 
									
										
										
										
											2018-01-27 17:34:08 -08:00
										 |  |  |       setupTimeline() | 
					
						
							| 
									
										
										
										
											2018-01-24 09:47:31 -08:00
										 |  |  |     }, | 
					
						
							| 
									
										
										
										
											2018-01-08 18:14:21 -08:00
										 |  |  |     data: () => ({ | 
					
						
							| 
									
										
										
										
											2018-01-29 19:22:28 -08:00
										 |  |  |       StatusVirtualListItem, | 
					
						
							| 
									
										
										
										
											2018-02-03 18:06:02 -08:00
										 |  |  |       NotificationVirtualListItem, | 
					
						
							| 
									
										
										
										
											2018-01-29 19:22:28 -08:00
										 |  |  |       LoadingFooter, | 
					
						
							|  |  |  |       Status | 
					
						
							| 
									
										
										
										
											2018-01-08 18:14:21 -08:00
										 |  |  |     }), | 
					
						
							| 
									
										
										
										
											2018-01-17 18:35:27 -08:00
										 |  |  |     computed: { | 
					
						
							| 
									
										
										
										
											2018-02-03 18:06:02 -08:00
										 |  |  |       makeProps: ($currentInstance, timelineType, timelineValue) => async (itemId) => { | 
					
						
							|  |  |  |         let res = { timelineType, timelineValue } | 
					
						
							|  |  |  |         if (timelineType === 'notifications') { | 
					
						
							|  |  |  |           res.notification = await database.getNotification($currentInstance, itemId) | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |           res.status = await database.getStatus($currentInstance, itemId) | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         return res | 
					
						
							|  |  |  |       }, | 
					
						
							| 
									
										
										
										
											2018-01-28 15:44:33 -08:00
										 |  |  |       label: (timeline, $currentInstance, timelineType, timelineValue) => { | 
					
						
							| 
									
										
										
										
											2018-01-21 20:02:32 -08:00
										 |  |  |         if (timelines[timeline]) { | 
					
						
							| 
									
										
										
										
											2018-01-28 15:44:33 -08:00
										 |  |  |           return `${timelines[timeline].label} timeline for ${$currentInstance}` | 
					
						
							| 
									
										
										
										
											2018-01-21 20:02:32 -08:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2018-01-28 15:44:33 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         switch (timelineType) { | 
					
						
							|  |  |  |           case 'tag': | 
					
						
							|  |  |  |             return `#${timelineValue} timeline for ${$currentInstance}` | 
					
						
							|  |  |  |           case 'status': | 
					
						
							|  |  |  |             return 'Status context' | 
					
						
							|  |  |  |           case 'account': | 
					
						
							|  |  |  |             return `Account #${timelineValue} on ${$currentInstance}` | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       }, | 
					
						
							|  |  |  |       timelineType: (timeline) => { | 
					
						
							|  |  |  |         return timeline.split('/')[0] | 
					
						
							|  |  |  |       }, | 
					
						
							|  |  |  |       timelineValue: (timeline) => { | 
					
						
							|  |  |  |         return timeline.split('/').slice(-1)[0] | 
					
						
							| 
									
										
										
										
											2018-01-29 19:22:28 -08:00
										 |  |  |       }, | 
					
						
							|  |  |  |       // for threads, it's simpler to just render all items due to need to scroll to the right item | 
					
						
							|  |  |  |       // TODO: this can be optimized to use a virtual list | 
					
						
							|  |  |  |       virtual: (timelineType) => timelineType !=='status' | 
					
						
							| 
									
										
										
										
											2018-01-17 18:35:27 -08:00
										 |  |  |     }, | 
					
						
							| 
									
										
										
										
											2018-01-10 20:45:02 -08:00
										 |  |  |     store: () => store, | 
					
						
							|  |  |  |     components: { | 
					
						
							| 
									
										
										
										
											2018-01-29 19:22:28 -08:00
										 |  |  |       VirtualList, | 
					
						
							| 
									
										
										
										
											2018-01-30 22:21:31 -08:00
										 |  |  |       PseudoVirtualList, | 
					
						
							|  |  |  |       LoadingSpinner | 
					
						
							| 
									
										
										
										
											2018-01-15 12:23:28 -08:00
										 |  |  |     }, | 
					
						
							|  |  |  |     methods: { | 
					
						
							| 
									
										
										
										
											2018-01-24 19:26:08 -08:00
										 |  |  |       initialize() { | 
					
						
							| 
									
										
										
										
											2018-02-03 18:06:02 -08:00
										 |  |  |         if (this.store.get('initialized') || !this.store.get('timelineItemIds') || !this.store.get('timelineItemIds').length) { | 
					
						
							| 
									
										
										
										
											2018-01-24 19:26:08 -08:00
										 |  |  |           return | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2018-01-29 19:22:28 -08:00
										 |  |  |         console.log('timeline initialize()') | 
					
						
							| 
									
										
										
										
											2018-01-27 17:34:08 -08:00
										 |  |  |         initializeTimeline() | 
					
						
							| 
									
										
										
										
											2018-01-24 19:26:08 -08:00
										 |  |  |       }, | 
					
						
							| 
									
										
										
										
											2018-01-27 17:34:42 -08:00
										 |  |  |       onScrollToBottom() { | 
					
						
							| 
									
										
										
										
											2018-01-28 15:44:33 -08:00
										 |  |  |         if (!this.store.get('initialized') || | 
					
						
							|  |  |  |             this.store.get('runningUpdate') || | 
					
						
							|  |  |  |             this.get('timelineType') === 'status') { // for status contexts, we've already fetched the whole thread | 
					
						
							| 
									
										
										
										
											2018-01-18 20:25:34 -08:00
										 |  |  |           return | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2018-02-03 18:06:02 -08:00
										 |  |  |         fetchTimelineItemsOnScrollToBottom() | 
					
						
							| 
									
										
										
										
											2018-01-15 12:23:28 -08:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2018-01-10 20:45:02 -08:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2018-01-08 18:14:21 -08:00
										 |  |  |   } | 
					
						
							|  |  |  | </script> |