| 
									
										
										
										
											2018-01-18 20:25:34 -08:00
										 |  |  | <:Window bind:online /> | 
					
						
							| 
									
										
										
										
											2018-01-21 14:31:59 -08:00
										 |  |  | <div class="timeline" role="feed" aria-label="{{label}}" on:initialized> | 
					
						
							| 
									
										
										
										
											2018-01-16 21:43:31 -08:00
										 |  |  |   <VirtualList component="{{StatusListItem}}" | 
					
						
							| 
									
										
										
										
											2018-01-17 18:35:27 -08:00
										 |  |  |                items="{{keyedStatuses}}" | 
					
						
							| 
									
										
										
										
											2018-01-21 14:31:59 -08:00
										 |  |  |                on:scrollToBottom="onScrollToBottom()" | 
					
						
							|  |  |  |                shown="{{initialized}}" | 
					
						
							| 
									
										
										
										
											2018-01-21 16:07:11 -08:00
										 |  |  |                footerComponent="{{LoadingFooter}}" | 
					
						
							|  |  |  |                showFooter="{{initialized && runningUpdate}}" | 
					
						
							| 
									
										
										
										
											2018-01-21 14:31:59 -08:00
										 |  |  |   /> | 
					
						
							| 
									
										
										
										
											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-16 20:34:09 -08:00
										 |  |  |   } | 
					
						
							|  |  |  | </style> | 
					
						
							| 
									
										
										
										
											2018-01-08 18:14:21 -08:00
										 |  |  | <script> | 
					
						
							|  |  |  |   import { store } from '../_utils/store' | 
					
						
							| 
									
										
										
										
											2018-01-18 23:37:43 -08:00
										 |  |  |   import { getTimeline } from '../_utils/mastodon/timelines' | 
					
						
							| 
									
										
										
										
											2018-01-15 10:54:02 -08:00
										 |  |  |   import StatusListItem from './StatusListItem.html' | 
					
						
							| 
									
										
										
										
											2018-01-21 16:07:11 -08:00
										 |  |  |   import LoadingFooter from './LoadingFooter.html' | 
					
						
							| 
									
										
										
										
											2018-01-15 10:54:02 -08:00
										 |  |  |   import VirtualList from './VirtualList.html' | 
					
						
							| 
									
										
										
										
											2018-01-17 00:06:24 -08:00
										 |  |  |   import { splice, push } from 'svelte-extras' | 
					
						
							| 
									
										
										
										
											2018-01-19 09:18:14 -08:00
										 |  |  |   import worker from 'workerize-loader!../_utils/database/database' | 
					
						
							| 
									
										
										
										
											2018-01-18 20:25:34 -08:00
										 |  |  |   import { mergeStatuses } from '../_utils/statuses' | 
					
						
							| 
									
										
										
										
											2018-01-17 00:59:15 -08:00
										 |  |  |   import { mark, stop } from '../_utils/marks' | 
					
						
							| 
									
										
										
										
											2018-01-18 23:37:43 -08:00
										 |  |  |   import { timelines } from '../_static/timelines' | 
					
						
							| 
									
										
										
										
											2018-01-19 18:04:31 -08:00
										 |  |  |   import { toast } from '../_utils/toast' | 
					
						
							| 
									
										
										
										
											2018-01-18 23:37:43 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-19 01:32:23 -08:00
										 |  |  |   const database = worker() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-18 20:25:34 -08:00
										 |  |  |   const FETCH_LIMIT = 20 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-08 18:14:21 -08:00
										 |  |  |   export default { | 
					
						
							| 
									
										
										
										
											2018-01-17 18:35:27 -08:00
										 |  |  |     async oncreate() { | 
					
						
							| 
									
										
										
										
											2018-01-19 18:04:31 -08:00
										 |  |  |       let statuses = await this.fetchStatusesAndPossiblyFallBack() | 
					
						
							| 
									
										
										
										
											2018-01-18 20:25:34 -08:00
										 |  |  |       this.addStatuses(statuses) | 
					
						
							| 
									
										
										
										
											2018-01-21 14:39:11 -08:00
										 |  |  |       requestAnimationFrame(() => { | 
					
						
							|  |  |  |         requestAnimationFrame((() => { | 
					
						
							|  |  |  |           this.set({initialized: true}) | 
					
						
							|  |  |  |           this.fire('initialized') | 
					
						
							|  |  |  |         })) | 
					
						
							|  |  |  |       }) | 
					
						
							| 
									
										
										
										
											2018-01-17 18:35:27 -08:00
										 |  |  |     }, | 
					
						
							| 
									
										
										
										
											2018-01-08 18:14:21 -08:00
										 |  |  |     data: () => ({ | 
					
						
							| 
									
										
										
										
											2018-01-17 18:35:27 -08:00
										 |  |  |       StatusListItem: StatusListItem, | 
					
						
							| 
									
										
										
										
											2018-01-21 16:07:11 -08:00
										 |  |  |       LoadingFooter: LoadingFooter, | 
					
						
							| 
									
										
										
										
											2018-01-17 18:35:27 -08:00
										 |  |  |       statuses: [], | 
					
						
							| 
									
										
										
										
											2018-01-19 00:29:45 -08:00
										 |  |  |       runningUpdate: false, | 
					
						
							|  |  |  |       initialized: false | 
					
						
							| 
									
										
										
										
											2018-01-08 18:14:21 -08:00
										 |  |  |     }), | 
					
						
							| 
									
										
										
										
											2018-01-17 18:35:27 -08:00
										 |  |  |     computed: { | 
					
						
							|  |  |  |       keyedStatuses: (statuses) => statuses.map(status => ({ | 
					
						
							|  |  |  |         props: status, | 
					
						
							|  |  |  |         key: status.id | 
					
						
							|  |  |  |       })), | 
					
						
							| 
									
										
										
										
											2018-01-17 23:00:33 -08:00
										 |  |  |       lastStatusId: (statuses) => statuses.length && statuses[statuses.length - 1].id, | 
					
						
							| 
									
										
										
										
											2018-01-20 13:01:33 -08:00
										 |  |  |       label: (timeline, $currentInstance) => `${timelines[timeline].label} timeline for ${$currentInstance}` | 
					
						
							| 
									
										
										
										
											2018-01-17 18:35:27 -08:00
										 |  |  |     }, | 
					
						
							| 
									
										
										
										
											2018-01-10 20:45:02 -08:00
										 |  |  |     store: () => store, | 
					
						
							|  |  |  |     components: { | 
					
						
							| 
									
										
										
										
											2018-01-15 10:54:02 -08:00
										 |  |  |       VirtualList | 
					
						
							| 
									
										
										
										
											2018-01-15 12:23:28 -08:00
										 |  |  |     }, | 
					
						
							|  |  |  |     methods: { | 
					
						
							|  |  |  |       splice: splice, | 
					
						
							| 
									
										
										
										
											2018-01-17 00:06:24 -08:00
										 |  |  |       push: push, | 
					
						
							| 
									
										
										
										
											2018-01-17 18:35:27 -08:00
										 |  |  |       async onScrollToBottom() { | 
					
						
							| 
									
										
										
										
											2018-01-19 00:29:45 -08:00
										 |  |  |         if (!this.get('initialized')) { | 
					
						
							|  |  |  |           return | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2018-01-17 18:35:27 -08:00
										 |  |  |         if (this.get('runningUpdate')) { | 
					
						
							|  |  |  |           return | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2018-01-19 00:29:45 -08:00
										 |  |  |         mark('onScrollToBottom') | 
					
						
							| 
									
										
										
										
											2018-01-17 18:35:27 -08:00
										 |  |  |         this.set({ runningUpdate: true }) | 
					
						
							| 
									
										
										
										
											2018-01-19 18:04:31 -08:00
										 |  |  |         let newStatuses = await this.fetchStatusesAndPossiblyFallBack() | 
					
						
							| 
									
										
										
										
											2018-01-17 18:35:27 -08:00
										 |  |  |         this.set({ runningUpdate: false }) | 
					
						
							| 
									
										
										
										
											2018-01-21 16:07:11 -08:00
										 |  |  |         this.addStatuses(newStatuses) | 
					
						
							| 
									
										
										
										
											2018-01-17 08:20:41 -08:00
										 |  |  |         stop('onScrollToBottom') | 
					
						
							|  |  |  |       }, | 
					
						
							| 
									
										
										
										
											2018-01-18 20:25:34 -08:00
										 |  |  |       addStatuses(newStatuses) { | 
					
						
							|  |  |  |         if (process.env.NODE_ENV !== 'production') { | 
					
						
							|  |  |  |           console.log('addStatuses()') | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         let statuses = this.get('statuses') | 
					
						
							|  |  |  |         if (!statuses) { | 
					
						
							|  |  |  |           return | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         let merged = mergeStatuses(statuses, newStatuses) | 
					
						
							|  |  |  |         this.set({ statuses: merged }) | 
					
						
							| 
									
										
										
										
											2018-01-19 18:04:31 -08:00
										 |  |  |       }, | 
					
						
							|  |  |  |       async fetchStatusesAndPossiblyFallBack() { | 
					
						
							|  |  |  |         let online = this.get('online') | 
					
						
							|  |  |  |         let instanceName = this.store.get('currentInstance') | 
					
						
							|  |  |  |         let instanceData = this.store.get('currentInstanceData') | 
					
						
							|  |  |  |         let timeline = this.get('timeline') | 
					
						
							|  |  |  |         let lastStatusId = this.get('lastStatusId') | 
					
						
							|  |  |  |         let statuses | 
					
						
							| 
									
										
										
										
											2018-01-20 13:01:33 -08:00
										 |  |  |         if (!online) { | 
					
						
							| 
									
										
										
										
											2018-01-19 18:04:31 -08:00
										 |  |  |           statuses = await database.getTimeline(instanceName, timeline, lastStatusId, FETCH_LIMIT) | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |           try { | 
					
						
							|  |  |  |             statuses = await getTimeline(instanceName, instanceData.access_token, timeline, lastStatusId, FETCH_LIMIT) | 
					
						
							|  |  |  |             /* no await */ database.insertStatuses(instanceName, timeline, statuses) | 
					
						
							|  |  |  |           } catch (e) { | 
					
						
							|  |  |  |             console.error(e) | 
					
						
							|  |  |  |             toast.say('Internet request failed. Showing offline content.') | 
					
						
							|  |  |  |             statuses = await database.getTimeline(instanceName, timeline, lastStatusId, FETCH_LIMIT) | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         return statuses | 
					
						
							| 
									
										
										
										
											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> |