| 
									
										
										
										
											2018-02-10 13:57:04 -08:00
										 |  |  | <div class="timeline" | 
					
						
							|  |  |  |      role="feed" | 
					
						
							|  |  |  |      aria-label="{{label}}" | 
					
						
							|  |  |  |      on:focusWithCapture="saveFocus(event)" | 
					
						
							|  |  |  |      on:blurWithCapture="clearFocus(event)" | 
					
						
							|  |  |  | > | 
					
						
							| 
									
										
										
										
											2018-02-12 22:32:56 -08:00
										 |  |  |   {{#if virtual}} | 
					
						
							|  |  |  |     <VirtualList component="{{VirtualListComponent}}" | 
					
						
							|  |  |  |                  realm="{{$currentInstance + '/' + timeline}}" | 
					
						
							|  |  |  |                  containerQuery=".container" | 
					
						
							| 
									
										
										
										
											2018-02-03 18:06:02 -08:00
										 |  |  |                  :makeProps | 
					
						
							|  |  |  |                  items="{{$timelineItemIds}}" | 
					
						
							| 
									
										
										
										
											2018-03-29 23:16:53 -07:00
										 |  |  |                  showFooter="{{$timelineInitialized && $runningUpdate}}" | 
					
						
							| 
									
										
										
										
											2018-02-12 22:32:56 -08:00
										 |  |  |                  footerComponent="{{LoadingFooter}}" | 
					
						
							| 
									
										
										
										
											2018-02-11 19:15:21 -08:00
										 |  |  |                  showHeader="{{$showHeader}}" | 
					
						
							|  |  |  |                  headerComponent="{{MoreHeaderVirtualWrapper}}" | 
					
						
							|  |  |  |                  :headerProps | 
					
						
							| 
									
										
										
										
											2018-01-29 19:22:28 -08:00
										 |  |  |                  on:scrollToBottom="onScrollToBottom()" | 
					
						
							| 
									
										
										
										
											2018-02-11 19:15:21 -08:00
										 |  |  |                  on:scrollToTop="onScrollToTop()" | 
					
						
							| 
									
										
										
										
											2018-02-13 09:15:10 -08:00
										 |  |  |                  on:scrollTopChanged="onScrollTopChanged(event)" | 
					
						
							| 
									
										
										
										
											2018-03-29 23:16:53 -07:00
										 |  |  |                  on:initialized="initialize()" | 
					
						
							|  |  |  |                  on:noNeedToScroll="onNoNeedToScroll()" | 
					
						
							| 
									
										
										
										
											2018-01-29 19:22:28 -08:00
										 |  |  |     /> | 
					
						
							|  |  |  |   {{else}} | 
					
						
							| 
									
										
										
										
											2018-02-14 21:51:34 -08:00
										 |  |  |     {{#await importPseudoVirtualList}} | 
					
						
							|  |  |  |     {{then PseudoVirtualList}} | 
					
						
							|  |  |  |       <!-- if this is a status thread, it's easier to just render the
 | 
					
						
							|  |  |  |            whole thing rather than use a virtual list --> | 
					
						
							|  |  |  |       <:Component {PseudoVirtualList} | 
					
						
							|  |  |  |                  component="{{VirtualListComponent}}" | 
					
						
							|  |  |  |                  realm="{{$currentInstance + '/' + timeline}}" | 
					
						
							|  |  |  |                  containerQuery=".container" | 
					
						
							|  |  |  |                  :makeProps | 
					
						
							|  |  |  |                  items="{{$timelineItemIds}}" | 
					
						
							|  |  |  |                  scrollToItem="{{scrollToItem}}" | 
					
						
							| 
									
										
										
										
											2018-03-29 23:16:53 -07:00
										 |  |  |                  on:initialized="initialize()" | 
					
						
							| 
									
										
										
										
											2018-02-14 21:51:34 -08:00
										 |  |  |       /> | 
					
						
							|  |  |  |     {{catch error}} | 
					
						
							|  |  |  |       <div>Component failed to load. Try refreshing! {{error}}</div> | 
					
						
							|  |  |  |     {{/await}} | 
					
						
							| 
									
										
										
										
											2018-01-29 19:22:28 -08:00
										 |  |  |   {{/if}} | 
					
						
							| 
									
										
										
										
											2018-01-15 10:54:02 -08:00
										 |  |  | </div> | 
					
						
							| 
									
										
										
										
											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' | 
					
						
							| 
									
										
										
										
											2018-01-21 16:07:11 -08:00
										 |  |  |   import LoadingFooter from './LoadingFooter.html' | 
					
						
							| 
									
										
										
										
											2018-02-11 19:15:21 -08:00
										 |  |  |   import MoreHeaderVirtualWrapper from './MoreHeaderVirtualWrapper.html' | 
					
						
							| 
									
										
										
										
											2018-01-27 16:35:44 -08:00
										 |  |  |   import VirtualList from '../virtualList/VirtualList.html' | 
					
						
							|  |  |  |   import { timelines } from '../../_static/timelines' | 
					
						
							| 
									
										
										
										
											2018-02-08 08:22:14 -08:00
										 |  |  |   import { database } from '../../_database/database' | 
					
						
							| 
									
										
										
										
											2018-03-09 22:31:26 -08:00
										 |  |  |   import { | 
					
						
							|  |  |  |     fetchTimelineItemsOnScrollToBottom, | 
					
						
							|  |  |  |     setupTimeline, | 
					
						
							| 
									
										
										
										
											2018-03-10 10:54:16 -08:00
										 |  |  |     showMoreItemsForTimeline, | 
					
						
							|  |  |  |     showMoreItemsForThread, | 
					
						
							|  |  |  |     showMoreItemsForCurrentTimeline | 
					
						
							| 
									
										
										
										
											2018-03-09 22:31:26 -08:00
										 |  |  |   } from '../../_actions/timeline' | 
					
						
							| 
									
										
										
										
											2018-02-10 13:57:04 -08:00
										 |  |  |   import { focusWithCapture, blurWithCapture } from '../../_utils/events' | 
					
						
							| 
									
										
										
										
											2018-02-11 19:15:21 -08:00
										 |  |  |   import { scheduleIdleTask } from '../../_utils/scheduleIdleTask' | 
					
						
							| 
									
										
										
										
											2018-02-11 22:40:56 -08:00
										 |  |  |   import { mark, stop } from '../../_utils/marks' | 
					
						
							| 
									
										
										
										
											2018-02-14 21:51:34 -08:00
										 |  |  |   import { importPseudoVirtualList } from '../../_utils/asyncModules' | 
					
						
							| 
									
										
										
										
											2018-04-05 17:57:36 -07:00
										 |  |  |   import isEqual from 'lodash-es/isEqual' | 
					
						
							| 
									
										
										
										
											2018-03-29 23:16:53 -07:00
										 |  |  |   import { doubleRAF } from '../../_utils/doubleRAF' | 
					
						
							| 
									
										
										
										
											2018-01-18 20:25:34 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-08 18:14:21 -08:00
										 |  |  |   export default { | 
					
						
							| 
									
										
										
										
											2018-02-10 13:57:04 -08:00
										 |  |  |     oncreate() { | 
					
						
							| 
									
										
										
										
											2018-01-29 19:22:28 -08:00
										 |  |  |       console.log('timeline oncreate()') | 
					
						
							| 
									
										
										
										
											2018-02-11 13:46:57 -08:00
										 |  |  |       this.setupFocus() | 
					
						
							| 
									
										
										
										
											2018-01-27 17:34:08 -08:00
										 |  |  |       setupTimeline() | 
					
						
							| 
									
										
										
										
											2018-03-22 21:59:02 -07:00
										 |  |  |       this.restoreFocus() | 
					
						
							| 
									
										
										
										
											2018-02-11 19:15:21 -08:00
										 |  |  |       this.setupStreaming() | 
					
						
							| 
									
										
										
										
											2018-02-10 13:57:04 -08:00
										 |  |  |     }, | 
					
						
							|  |  |  |     ondestroy() { | 
					
						
							|  |  |  |       console.log('ondestroy') | 
					
						
							| 
									
										
										
										
											2018-02-11 13:46:57 -08:00
										 |  |  |       this.teardownFocus() | 
					
						
							| 
									
										
										
										
											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
										 |  |  |       LoadingFooter, | 
					
						
							| 
									
										
										
										
											2018-02-11 19:15:21 -08:00
										 |  |  |       MoreHeaderVirtualWrapper, | 
					
						
							| 
									
										
										
										
											2018-02-13 09:15:10 -08:00
										 |  |  |       Status, | 
					
						
							|  |  |  |       scrollTop: 0 | 
					
						
							| 
									
										
										
										
											2018-01-08 18:14:21 -08:00
										 |  |  |     }), | 
					
						
							| 
									
										
										
										
											2018-01-17 18:35:27 -08:00
										 |  |  |     computed: { | 
					
						
							| 
									
										
										
										
											2018-02-14 21:51:34 -08:00
										 |  |  |       importPseudoVirtualList: (virtual) => { | 
					
						
							|  |  |  |         return !virtual && importPseudoVirtualList() | 
					
						
							|  |  |  |       }, | 
					
						
							| 
									
										
										
										
											2018-02-12 22:32:56 -08:00
										 |  |  |       VirtualListComponent: (timelineType) => { | 
					
						
							|  |  |  |         return timelineType === 'notifications' ? NotificationVirtualListItem : StatusVirtualListItem | 
					
						
							|  |  |  |       }, | 
					
						
							| 
									
										
										
										
											2018-03-22 21:59:02 -07:00
										 |  |  |       makeProps: ($currentInstance, timelineType, timelineValue) => async (itemId) => { | 
					
						
							| 
									
										
										
										
											2018-03-20 20:28:53 -07:00
										 |  |  |         let res = { | 
					
						
							|  |  |  |           timelineType, | 
					
						
							|  |  |  |           timelineValue | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2018-02-03 18:06:02 -08:00
										 |  |  |         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}` | 
					
						
							| 
									
										
										
										
											2018-02-08 09:15:25 -08:00
										 |  |  |           case 'list': | 
					
						
							|  |  |  |             return `List #${timelineValue} on ${$currentInstance}` | 
					
						
							| 
									
										
										
										
											2018-01-28 15:44:33 -08:00
										 |  |  |         } | 
					
						
							|  |  |  |       }, | 
					
						
							|  |  |  |       timelineType: (timeline) => { | 
					
						
							|  |  |  |         return timeline.split('/')[0] | 
					
						
							|  |  |  |       }, | 
					
						
							|  |  |  |       timelineValue: (timeline) => { | 
					
						
							|  |  |  |         return timeline.split('/').slice(-1)[0] | 
					
						
							| 
									
										
										
										
											2018-01-29 19:22:28 -08:00
										 |  |  |       }, | 
					
						
							| 
									
										
										
										
											2018-02-10 14:19:10 -08:00
										 |  |  |       // for threads, it's simpler to just render all items as a pseudo-virtual list | 
					
						
							|  |  |  |       // due to need to scroll to the right item and thus calculate all item heights up-front | 
					
						
							|  |  |  |       virtual: (timelineType) => timelineType !=='status', | 
					
						
							|  |  |  |       scrollToItem: (timelineType, timelineValue, $firstTimelineItemId) => { | 
					
						
							|  |  |  |         // Scroll to the first item if this is a "status in own thread" timeline. | 
					
						
							|  |  |  |         // Don't scroll to the first item because it obscures the "back" button. | 
					
						
							|  |  |  |         return timelineType === 'status' | 
					
						
							|  |  |  |           && $firstTimelineItemId | 
					
						
							|  |  |  |           && timelineValue !== $firstTimelineItemId | 
					
						
							|  |  |  |           && timelineValue | 
					
						
							| 
									
										
										
										
											2018-02-11 13:46:57 -08:00
										 |  |  |       }, | 
					
						
							| 
									
										
										
										
											2018-02-11 20:12:15 -08:00
										 |  |  |       itemIdsToAdd: ($itemIdsToAdd) => $itemIdsToAdd, | 
					
						
							| 
									
										
										
										
											2018-02-11 19:15:21 -08:00
										 |  |  |       headerProps: (itemIdsToAdd) => { | 
					
						
							|  |  |  |         return { | 
					
						
							| 
									
										
										
										
											2018-02-25 10:50:04 -08:00
										 |  |  |           count: itemIdsToAdd ? itemIdsToAdd.length : 0, | 
					
						
							| 
									
										
										
										
											2018-02-11 19:15:21 -08:00
										 |  |  |           onClick: showMoreItemsForCurrentTimeline | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2018-02-10 14:19:10 -08:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2018-01-17 18:35:27 -08:00
										 |  |  |     }, | 
					
						
							| 
									
										
										
										
											2018-01-10 20:45:02 -08:00
										 |  |  |     store: () => store, | 
					
						
							|  |  |  |     components: { | 
					
						
							| 
									
										
										
										
											2018-03-29 23:16:53 -07:00
										 |  |  |       VirtualList | 
					
						
							| 
									
										
										
										
											2018-01-15 12:23:28 -08:00
										 |  |  |     }, | 
					
						
							| 
									
										
										
										
											2018-02-10 13:57:04 -08:00
										 |  |  |     events: { | 
					
						
							|  |  |  |       focusWithCapture, | 
					
						
							|  |  |  |       blurWithCapture | 
					
						
							|  |  |  |     }, | 
					
						
							| 
									
										
										
										
											2018-01-15 12:23:28 -08:00
										 |  |  |     methods: { | 
					
						
							| 
									
										
										
										
											2018-01-24 19:26:08 -08:00
										 |  |  |       initialize() { | 
					
						
							| 
									
										
										
										
											2018-02-11 16:10:39 -08:00
										 |  |  |         if (this.get('initializeStarted')) { | 
					
						
							| 
									
										
										
										
											2018-01-24 19:26:08 -08:00
										 |  |  |           return | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2018-02-11 16:10:39 -08:00
										 |  |  |         this.set({initializeStarted: true}) | 
					
						
							| 
									
										
										
										
											2018-03-29 23:16:53 -07:00
										 |  |  |         mark('initializeTimeline') | 
					
						
							|  |  |  |         doubleRAF(() => { | 
					
						
							|  |  |  |           console.log('timeline initialized') | 
					
						
							|  |  |  |           this.store.set({timelineInitialized: true}) | 
					
						
							|  |  |  |           stop('initializeTimeline') | 
					
						
							|  |  |  |         }) | 
					
						
							| 
									
										
										
										
											2018-01-24 19:26:08 -08:00
										 |  |  |       }, | 
					
						
							| 
									
										
										
										
											2018-02-13 09:15:10 -08:00
										 |  |  |       onScrollTopChanged(scrollTop) { | 
					
						
							|  |  |  |         this.set({scrollTop: scrollTop}) | 
					
						
							|  |  |  |       }, | 
					
						
							| 
									
										
										
										
											2018-01-27 17:34:42 -08:00
										 |  |  |       onScrollToBottom() { | 
					
						
							| 
									
										
										
										
											2018-03-29 23:16:53 -07:00
										 |  |  |         if (!this.store.get('timelineInitialized') || | 
					
						
							| 
									
										
										
										
											2018-01-28 15:44:33 -08:00
										 |  |  |             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-03-10 10:54:16 -08:00
										 |  |  |         fetchTimelineItemsOnScrollToBottom( | 
					
						
							| 
									
										
										
										
											2018-03-13 21:27:34 -07:00
										 |  |  |           this.store.get('currentInstance'), | 
					
						
							| 
									
										
										
										
											2018-03-10 10:54:16 -08:00
										 |  |  |           this.get('timeline') | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2018-02-10 13:57:04 -08:00
										 |  |  |       }, | 
					
						
							| 
									
										
										
										
											2018-02-11 19:15:21 -08:00
										 |  |  |       onScrollToTop() { | 
					
						
							|  |  |  |         if (this.store.get('shouldShowHeader')) { | 
					
						
							|  |  |  |           this.store.setForCurrentTimeline({ | 
					
						
							|  |  |  |             showHeader: true, | 
					
						
							|  |  |  |             shouldShowHeader: false | 
					
						
							|  |  |  |           }) | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       }, | 
					
						
							|  |  |  |       setupStreaming() { | 
					
						
							|  |  |  |         let instanceName = this.store.get('currentInstance') | 
					
						
							|  |  |  |         let timelineName = this.get('timeline') | 
					
						
							|  |  |  |         let handleItemIdsToAdd = () => { | 
					
						
							| 
									
										
										
										
											2018-02-25 11:20:40 -08:00
										 |  |  |           let itemIdsToAdd = this.get('itemIdsToAdd') | 
					
						
							|  |  |  |           if (!itemIdsToAdd || !itemIdsToAdd.length) { | 
					
						
							|  |  |  |             return | 
					
						
							|  |  |  |           } | 
					
						
							| 
									
										
										
										
											2018-02-11 22:40:56 -08:00
										 |  |  |           mark('handleItemIdsToAdd') | 
					
						
							| 
									
										
										
										
											2018-02-13 09:15:10 -08:00
										 |  |  |           let scrollTop = this.get('scrollTop') | 
					
						
							| 
									
										
										
										
											2018-02-11 19:15:21 -08:00
										 |  |  |           let shouldShowHeader = this.store.get('shouldShowHeader') | 
					
						
							|  |  |  |           let showHeader = this.store.get('showHeader') | 
					
						
							| 
									
										
										
										
											2018-03-09 22:31:26 -08:00
										 |  |  |           if (timelineName.startsWith('status/')) { | 
					
						
							|  |  |  |             // this is a thread, just insert the statuses already | 
					
						
							| 
									
										
										
										
											2018-03-10 10:54:16 -08:00
										 |  |  |             showMoreItemsForThread(instanceName, timelineName) | 
					
						
							| 
									
										
										
										
											2018-03-09 22:31:26 -08:00
										 |  |  |           } else if (scrollTop === 0 && !shouldShowHeader && !showHeader) { | 
					
						
							| 
									
										
										
										
											2018-02-11 19:15:21 -08:00
										 |  |  |             // if the user is scrolled to the top and we're not showing the header, then | 
					
						
							|  |  |  |             // just insert the statuses. this is "chat room mode" | 
					
						
							| 
									
										
										
										
											2018-03-10 10:54:16 -08:00
										 |  |  |             showMoreItemsForTimeline(instanceName, timelineName) | 
					
						
							| 
									
										
										
										
											2018-02-11 19:15:21 -08:00
										 |  |  |           } else { | 
					
						
							|  |  |  |             // user hasn't scrolled to the top, show a header instead | 
					
						
							|  |  |  |             this.store.setForTimeline(instanceName, timelineName, {shouldShowHeader: true}) | 
					
						
							|  |  |  |           } | 
					
						
							| 
									
										
										
										
											2018-02-11 22:40:56 -08:00
										 |  |  |           stop('handleItemIdsToAdd') | 
					
						
							| 
									
										
										
										
											2018-02-11 19:15:21 -08:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2018-02-25 10:50:04 -08:00
										 |  |  |         this.observe('itemIdsToAdd', (newItemIdsToAdd, oldItemIdsToAdd) => { | 
					
						
							|  |  |  |           if (!newItemIdsToAdd || | 
					
						
							|  |  |  |               !newItemIdsToAdd.length || | 
					
						
							|  |  |  |               isEqual(newItemIdsToAdd, oldItemIdsToAdd)) { | 
					
						
							|  |  |  |             return | 
					
						
							| 
									
										
										
										
											2018-02-20 21:29:59 -08:00
										 |  |  |           } | 
					
						
							| 
									
										
										
										
											2018-02-25 10:50:04 -08:00
										 |  |  |           scheduleIdleTask(handleItemIdsToAdd) | 
					
						
							| 
									
										
										
										
											2018-02-11 19:15:21 -08:00
										 |  |  |         }) | 
					
						
							|  |  |  |       }, | 
					
						
							| 
									
										
										
										
											2018-02-11 13:46:57 -08:00
										 |  |  |       setupFocus() { | 
					
						
							|  |  |  |         this.onPushState = this.onPushState.bind(this) | 
					
						
							| 
									
										
										
										
											2018-03-21 00:53:52 -07:00
										 |  |  |         this.store.setForCurrentTimeline({ | 
					
						
							| 
									
										
										
										
											2018-03-22 21:59:02 -07:00
										 |  |  |           ignoreBlurEvents: false | 
					
						
							| 
									
										
										
										
											2018-03-21 00:53:52 -07:00
										 |  |  |         }) | 
					
						
							| 
									
										
										
										
											2018-02-11 13:46:57 -08:00
										 |  |  |         window.addEventListener('pushState', this.onPushState) | 
					
						
							|  |  |  |       }, | 
					
						
							|  |  |  |       teardownFocus() { | 
					
						
							|  |  |  |         window.removeEventListener('pushState', this.onPushState) | 
					
						
							|  |  |  |       }, | 
					
						
							|  |  |  |       onPushState() { | 
					
						
							|  |  |  |         this.store.setForCurrentTimeline({ ignoreBlurEvents: true }) | 
					
						
							|  |  |  |       }, | 
					
						
							| 
									
										
										
										
											2018-02-10 13:57:04 -08:00
										 |  |  |       saveFocus(e) { | 
					
						
							| 
									
										
										
										
											2018-03-22 19:56:08 -07:00
										 |  |  |         try { | 
					
						
							|  |  |  |           let instanceName = this.store.get('currentInstance') | 
					
						
							|  |  |  |           let timelineName = this.get('timeline') | 
					
						
							|  |  |  |           let lastFocusedElementSelector | 
					
						
							|  |  |  |           let activeElement = e.target | 
					
						
							|  |  |  |           if (activeElement) { | 
					
						
							|  |  |  |             let focusKey = activeElement.getAttribute('focus-key') | 
					
						
							|  |  |  |             if (focusKey) { | 
					
						
							|  |  |  |               lastFocusedElementSelector = `[focus-key=${JSON.stringify(focusKey)}]` | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2018-02-10 13:57:04 -08:00
										 |  |  |           } | 
					
						
							| 
									
										
										
										
											2018-03-22 19:56:08 -07:00
										 |  |  |           console.log('saving focus to ', lastFocusedElementSelector) | 
					
						
							|  |  |  |           this.store.setForTimeline(instanceName, timelineName, { | 
					
						
							|  |  |  |             lastFocusedElementSelector | 
					
						
							|  |  |  |           }) | 
					
						
							|  |  |  |         } catch (err) { | 
					
						
							|  |  |  |           console.error('unable to save focus', err) | 
					
						
							| 
									
										
										
										
											2018-02-10 13:57:04 -08:00
										 |  |  |         } | 
					
						
							|  |  |  |       }, | 
					
						
							|  |  |  |       clearFocus() { | 
					
						
							| 
									
										
										
										
											2018-03-22 19:56:08 -07:00
										 |  |  |         try { | 
					
						
							|  |  |  |           if (this.store.get('ignoreBlurEvents')) { | 
					
						
							|  |  |  |             return | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |           console.log('clearing focus') | 
					
						
							|  |  |  |           let instanceName = this.store.get('currentInstance') | 
					
						
							|  |  |  |           let timelineName = this.get('timeline') | 
					
						
							|  |  |  |           this.store.setForTimeline(instanceName, timelineName, { | 
					
						
							|  |  |  |             lastFocusedElementSelector: null | 
					
						
							|  |  |  |           }) | 
					
						
							|  |  |  |         } catch (err) { | 
					
						
							|  |  |  |           console.error('unable to clear focus', err) | 
					
						
							| 
									
										
										
										
											2018-02-10 13:57:04 -08:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2018-03-22 21:59:02 -07:00
										 |  |  |       }, | 
					
						
							|  |  |  |       restoreFocus() { | 
					
						
							|  |  |  |         let lastFocusedElementSelector = this.store.get('lastFocusedElementSelector') | 
					
						
							|  |  |  |         if (!lastFocusedElementSelector) { | 
					
						
							|  |  |  |           return | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         console.log('restoreFocus', lastFocusedElementSelector) | 
					
						
							|  |  |  |         requestAnimationFrame(() => { | 
					
						
							|  |  |  |           requestAnimationFrame(() => { | 
					
						
							|  |  |  |             let element = document.querySelector(lastFocusedElementSelector) | 
					
						
							|  |  |  |             if (element) { | 
					
						
							|  |  |  |               element.focus() | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |           }) | 
					
						
							|  |  |  |         }) | 
					
						
							|  |  |  |       }, | 
					
						
							| 
									
										
										
										
											2018-03-29 23:16:53 -07:00
										 |  |  |       onNoNeedToScroll() { | 
					
						
							|  |  |  |         // If the timeline doesn't need to scroll, then we can safely "preinitialize," | 
					
						
							|  |  |  |         // i.e. render anything above the fold of the timeline. This avoids the affect | 
					
						
							|  |  |  |         // where the scrollable content appears to jump around if we need to scroll it. | 
					
						
							|  |  |  |         console.log('timeline preinitialized') | 
					
						
							|  |  |  |         this.store.set({timelinePreinitialized: true}) | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2018-01-10 20:45:02 -08:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2018-01-08 18:14:21 -08:00
										 |  |  |   } | 
					
						
							|  |  |  | </script> |