forked from cybrespace/pinafore
implement better timeline navigations with fades
This commit is contained in:
parent
5426c5a0ef
commit
3b8f551477
|
@ -66,19 +66,6 @@ async function fetchTimelineItemsAndPossiblyFallBack () {
|
||||||
stop('fetchTimelineItemsAndPossiblyFallBack')
|
stop('fetchTimelineItemsAndPossiblyFallBack')
|
||||||
}
|
}
|
||||||
|
|
||||||
export function initializeTimeline () {
|
|
||||||
mark('initializeTimeline')
|
|
||||||
let instanceName = store.get('currentInstance')
|
|
||||||
let timeline = store.get('currentTimeline')
|
|
||||||
requestAnimationFrame(() => {
|
|
||||||
requestAnimationFrame(() => {
|
|
||||||
console.log('initialized')
|
|
||||||
store.setForTimeline(instanceName, timeline, {initialized: true})
|
|
||||||
})
|
|
||||||
})
|
|
||||||
stop('initializeTimeline')
|
|
||||||
}
|
|
||||||
|
|
||||||
export async function setupTimeline () {
|
export async function setupTimeline () {
|
||||||
mark('setupTimeline')
|
mark('setupTimeline')
|
||||||
// If we don't have any item ids, or if the current item ids are stale
|
// If we don't have any item ids, or if the current item ids are stale
|
||||||
|
|
|
@ -0,0 +1,54 @@
|
||||||
|
<!--
|
||||||
|
Same as TimelinePage.html, but needs to manage visibility of ComposeBox itself
|
||||||
|
without a div wrapper due to sticky-positioned compose button.
|
||||||
|
TODO: this is a bit hacky due to code duplication
|
||||||
|
-->
|
||||||
|
<div class="timeline-home-page" aria-busy="{{hideTimeline}}">
|
||||||
|
{{#if hidePage}}
|
||||||
|
<LoadingPage />
|
||||||
|
{{/if}}
|
||||||
|
{{#if $currentVerifyCredentials }}
|
||||||
|
<ComposeBox realm="home" hidden="{{hidePage}}"/>
|
||||||
|
{{/if}}
|
||||||
|
<div class="timeline-home-anchor-container">
|
||||||
|
{{#if !hidePage && hideTimeline}}
|
||||||
|
<LoadingPage />
|
||||||
|
{{/if}}
|
||||||
|
<div class="timeline-home-reveal-container {{hideTimeline ? 'hidden' : ''}}">
|
||||||
|
<LazyTimeline timeline="home" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<style>
|
||||||
|
.timeline-home-page, .timeline-home-anchor-container {
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
.timeline-home-reveal-container {
|
||||||
|
transition: opacity 0.2s linear; /* main page reveal */
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<script>
|
||||||
|
import LazyTimeline from '.././_components/timeline/LazyTimeline.html'
|
||||||
|
import { store } from '.././_store/store.js'
|
||||||
|
import LoadingPage from '../_components/LoadingPage.html'
|
||||||
|
import ComposeBox from '../_components/compose/ComposeBox.html'
|
||||||
|
|
||||||
|
export default {
|
||||||
|
oncreate () {
|
||||||
|
this.store.set({
|
||||||
|
timelineInitialized: false,
|
||||||
|
timelinePreinitialized: false
|
||||||
|
})
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
hidePage: ($timelineInitialized, $timelinePreinitialized) => !$timelineInitialized && !$timelinePreinitialized,
|
||||||
|
hideTimeline: ($timelineInitialized) => !$timelineInitialized,
|
||||||
|
},
|
||||||
|
store: () => store,
|
||||||
|
components: {
|
||||||
|
LazyTimeline,
|
||||||
|
LoadingPage,
|
||||||
|
ComposeBox
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
|
@ -0,0 +1,47 @@
|
||||||
|
<div class="timeline-page" aria-busy="{{hideTimeline}}">
|
||||||
|
{{#if hidePage}}
|
||||||
|
<LoadingPage />
|
||||||
|
{{/if}}
|
||||||
|
<div class="timeline-slot-reveal-container {{hidePage ? 'hidden' : ''}}">
|
||||||
|
<slot></slot>
|
||||||
|
</div>
|
||||||
|
<div class="timeline-anchor-container">
|
||||||
|
{{#if !hidePage && hideTimeline}}
|
||||||
|
<LoadingPage />
|
||||||
|
{{/if}}
|
||||||
|
<div class="timeline-reveal-container {{hideTimeline ? 'hidden' : ''}}">
|
||||||
|
<LazyTimeline :timeline />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<style>
|
||||||
|
.timeline-page, .timeline-anchor-container {
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
.timeline-reveal-container, .timeline-slot-reveal-container {
|
||||||
|
transition: opacity 0.2s linear; /* main page reveal */
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<script>
|
||||||
|
import LazyTimeline from '.././_components/timeline/LazyTimeline.html'
|
||||||
|
import { store } from '.././_store/store.js'
|
||||||
|
import LoadingPage from '../_components/LoadingPage.html'
|
||||||
|
|
||||||
|
export default {
|
||||||
|
oncreate () {
|
||||||
|
this.store.set({
|
||||||
|
timelineInitialized: false,
|
||||||
|
timelinePreinitialized: false
|
||||||
|
})
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
hidePage: ($timelineInitialized, $timelinePreinitialized) => !$timelineInitialized && !$timelinePreinitialized,
|
||||||
|
hideTimeline: ($timelineInitialized) => !$timelineInitialized,
|
||||||
|
},
|
||||||
|
store: () => store,
|
||||||
|
components: {
|
||||||
|
LazyTimeline,
|
||||||
|
LoadingPage
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
|
@ -1,4 +1,4 @@
|
||||||
<div class="compose-box {{overLimit ? 'over-char-limit' : ''}} {{realm === 'dialog' ? 'dialog-size' : '' }}">
|
<div class="{{className}} {{hideAndFadeIn}}">
|
||||||
<ComposeAuthor />
|
<ComposeAuthor />
|
||||||
{{#if contentWarningShown}}
|
{{#if contentWarningShown}}
|
||||||
<div class="compose-content-warning-wrapper"
|
<div class="compose-content-warning-wrapper"
|
||||||
|
@ -12,11 +12,11 @@
|
||||||
<ComposeLengthIndicator :length :overLimit />
|
<ComposeLengthIndicator :length :overLimit />
|
||||||
<ComposeMedia :realm :media />
|
<ComposeMedia :realm :media />
|
||||||
</div>
|
</div>
|
||||||
<div class="compose-box-button-sentinel" ref:sentinel></div>
|
<div class="compose-box-button-sentinel {{hideAndFadeIn}}" ref:sentinel></div>
|
||||||
<div class="compose-box-button-wrapper" >
|
<div class="compose-box-button-wrapper {{hideAndFadeIn}}" >
|
||||||
<ComposeButton :length :overLimit :sticky on:click="onClickPostButton()" />
|
<ComposeButton :length :overLimit :sticky on:click="onClickPostButton()" />
|
||||||
</div>
|
</div>
|
||||||
<div class="compose-box-border-bottom"></div>
|
<div class="compose-box-border-bottom {{hideAndFadeIn}}"></div>
|
||||||
<style>
|
<style>
|
||||||
.compose-box {
|
.compose-box {
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
|
@ -40,6 +40,10 @@
|
||||||
max-width: calc(100vw - 60px);
|
max-width: calc(100vw - 60px);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.compose-box-fade-in {
|
||||||
|
transition: opacity 0.2s linear; /* main page reveal */
|
||||||
|
}
|
||||||
|
|
||||||
.compose-box-border-bottom {
|
.compose-box-border-bottom {
|
||||||
height: 1px;
|
height: 1px;
|
||||||
background: var(--main-border);
|
background: var(--main-border);
|
||||||
|
@ -91,6 +95,7 @@
|
||||||
import { slide } from 'svelte-transitions'
|
import { slide } from 'svelte-transitions'
|
||||||
import { postStatus, insertHandleForReply } from '../../_actions/compose'
|
import { postStatus, insertHandleForReply } from '../../_actions/compose'
|
||||||
import { importDialogs } from '../../_utils/asyncModules'
|
import { importDialogs } from '../../_utils/asyncModules'
|
||||||
|
import { classname } from '../../_utils/classname'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
oncreate() {
|
oncreate() {
|
||||||
|
@ -133,6 +138,19 @@
|
||||||
},
|
},
|
||||||
store: () => store,
|
store: () => store,
|
||||||
computed: {
|
computed: {
|
||||||
|
className: (overLimit, realm) => {
|
||||||
|
return classname(
|
||||||
|
'compose-box',
|
||||||
|
overLimit && 'over-char-limit',
|
||||||
|
realm === 'dialog' && 'dialog-size'
|
||||||
|
)
|
||||||
|
},
|
||||||
|
hideAndFadeIn: (hidden) => {
|
||||||
|
return classname(
|
||||||
|
'compose-box-fade-in',
|
||||||
|
hidden && 'hidden'
|
||||||
|
)
|
||||||
|
},
|
||||||
composeData: ($currentComposeData, realm) => $currentComposeData[realm] || {},
|
composeData: ($currentComposeData, realm) => $currentComposeData[realm] || {},
|
||||||
text: (composeData) => composeData.text || '',
|
text: (composeData) => composeData.text || '',
|
||||||
media: (composeData) => composeData.media || [],
|
media: (composeData) => composeData.media || [],
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
<div class="pseudo-virtual-list {{shown ? '' : 'hidden'}}" on:initializedVisibleItems ref:node>
|
<div class="pseudo-virtual-list" on:initialized ref:node>
|
||||||
{{#if wrappedItems}}
|
{{#if wrappedItems}}
|
||||||
{{#each wrappedItems as wrappedItem, i @item}}
|
{{#each wrappedItems as wrappedItem, i @item}}
|
||||||
<PseudoVirtualListLazyItem
|
<PseudoVirtualListLazyItem
|
||||||
|
@ -18,7 +18,6 @@
|
||||||
<style>
|
<style>
|
||||||
.pseudo-virtual-list {
|
.pseudo-virtual-list {
|
||||||
position: relative;
|
position: relative;
|
||||||
transition: opacity 0.25s linear;
|
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
<script>
|
<script>
|
||||||
|
@ -51,8 +50,8 @@
|
||||||
console.log('allItemsHaveHeight', allItemsHaveHeight)
|
console.log('allItemsHaveHeight', allItemsHaveHeight)
|
||||||
if (allItemsHaveHeight && !this.get('initialized')) {
|
if (allItemsHaveHeight && !this.get('initialized')) {
|
||||||
this.set({initialized: true})
|
this.set({initialized: true})
|
||||||
console.log('initializedVisibleItems')
|
console.log('initialized PseudoVirtualList')
|
||||||
this.fire('initializedVisibleItems')
|
this.fire('initialized')
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
stop('PseudoVirtualList oncreate()')
|
stop('PseudoVirtualList oncreate()')
|
||||||
|
|
|
@ -4,17 +4,13 @@
|
||||||
on:focusWithCapture="saveFocus(event)"
|
on:focusWithCapture="saveFocus(event)"
|
||||||
on:blurWithCapture="clearFocus(event)"
|
on:blurWithCapture="clearFocus(event)"
|
||||||
>
|
>
|
||||||
{{#if !$initialized}}
|
|
||||||
<LoadingPage />
|
|
||||||
{{/if}}
|
|
||||||
{{#if virtual}}
|
{{#if virtual}}
|
||||||
<VirtualList component="{{VirtualListComponent}}"
|
<VirtualList component="{{VirtualListComponent}}"
|
||||||
realm="{{$currentInstance + '/' + timeline}}"
|
realm="{{$currentInstance + '/' + timeline}}"
|
||||||
containerQuery=".container"
|
containerQuery=".container"
|
||||||
:makeProps
|
:makeProps
|
||||||
items="{{$timelineItemIds}}"
|
items="{{$timelineItemIds}}"
|
||||||
shown="{{$initialized}}"
|
showFooter="{{$timelineInitialized && $runningUpdate}}"
|
||||||
showFooter="{{$initialized && $runningUpdate}}"
|
|
||||||
footerComponent="{{LoadingFooter}}"
|
footerComponent="{{LoadingFooter}}"
|
||||||
showHeader="{{$showHeader}}"
|
showHeader="{{$showHeader}}"
|
||||||
headerComponent="{{MoreHeaderVirtualWrapper}}"
|
headerComponent="{{MoreHeaderVirtualWrapper}}"
|
||||||
|
@ -22,7 +18,8 @@
|
||||||
on:scrollToBottom="onScrollToBottom()"
|
on:scrollToBottom="onScrollToBottom()"
|
||||||
on:scrollToTop="onScrollToTop()"
|
on:scrollToTop="onScrollToTop()"
|
||||||
on:scrollTopChanged="onScrollTopChanged(event)"
|
on:scrollTopChanged="onScrollTopChanged(event)"
|
||||||
on:initializedVisibleItems="initialize()"
|
on:initialized="initialize()"
|
||||||
|
on:noNeedToScroll="onNoNeedToScroll()"
|
||||||
/>
|
/>
|
||||||
{{else}}
|
{{else}}
|
||||||
{{#await importPseudoVirtualList}}
|
{{#await importPseudoVirtualList}}
|
||||||
|
@ -35,20 +32,14 @@
|
||||||
containerQuery=".container"
|
containerQuery=".container"
|
||||||
:makeProps
|
:makeProps
|
||||||
items="{{$timelineItemIds}}"
|
items="{{$timelineItemIds}}"
|
||||||
shown="{{$initialized}}"
|
|
||||||
scrollToItem="{{scrollToItem}}"
|
scrollToItem="{{scrollToItem}}"
|
||||||
on:initializedVisibleItems="initialize()"
|
on:initialized="initialize()"
|
||||||
/>
|
/>
|
||||||
{{catch error}}
|
{{catch error}}
|
||||||
<div>Component failed to load. Try refreshing! {{error}}</div>
|
<div>Component failed to load. Try refreshing! {{error}}</div>
|
||||||
{{/await}}
|
{{/await}}
|
||||||
{{/if}}
|
{{/if}}
|
||||||
</div>
|
</div>
|
||||||
<style>
|
|
||||||
.timeline {
|
|
||||||
position: relative;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
<script>
|
<script>
|
||||||
import { store } from '../../_store/store'
|
import { store } from '../../_store/store'
|
||||||
import StatusVirtualListItem from './StatusVirtualListItem.html'
|
import StatusVirtualListItem from './StatusVirtualListItem.html'
|
||||||
|
@ -60,19 +51,18 @@
|
||||||
import { timelines } from '../../_static/timelines'
|
import { timelines } from '../../_static/timelines'
|
||||||
import { database } from '../../_database/database'
|
import { database } from '../../_database/database'
|
||||||
import {
|
import {
|
||||||
initializeTimeline,
|
|
||||||
fetchTimelineItemsOnScrollToBottom,
|
fetchTimelineItemsOnScrollToBottom,
|
||||||
setupTimeline,
|
setupTimeline,
|
||||||
showMoreItemsForTimeline,
|
showMoreItemsForTimeline,
|
||||||
showMoreItemsForThread,
|
showMoreItemsForThread,
|
||||||
showMoreItemsForCurrentTimeline
|
showMoreItemsForCurrentTimeline
|
||||||
} from '../../_actions/timeline'
|
} from '../../_actions/timeline'
|
||||||
import LoadingPage from '../LoadingPage.html'
|
|
||||||
import { focusWithCapture, blurWithCapture } from '../../_utils/events'
|
import { focusWithCapture, blurWithCapture } from '../../_utils/events'
|
||||||
import { scheduleIdleTask } from '../../_utils/scheduleIdleTask'
|
import { scheduleIdleTask } from '../../_utils/scheduleIdleTask'
|
||||||
import { mark, stop } from '../../_utils/marks'
|
import { mark, stop } from '../../_utils/marks'
|
||||||
import { importPseudoVirtualList } from '../../_utils/asyncModules'
|
import { importPseudoVirtualList } from '../../_utils/asyncModules'
|
||||||
import isEqual from 'lodash/isEqual'
|
import isEqual from 'lodash/isEqual'
|
||||||
|
import { doubleRAF } from '../../_utils/doubleRAF'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
oncreate() {
|
oncreate() {
|
||||||
|
@ -154,8 +144,7 @@
|
||||||
},
|
},
|
||||||
store: () => store,
|
store: () => store,
|
||||||
components: {
|
components: {
|
||||||
VirtualList,
|
VirtualList
|
||||||
LoadingPage
|
|
||||||
},
|
},
|
||||||
events: {
|
events: {
|
||||||
focusWithCapture,
|
focusWithCapture,
|
||||||
|
@ -167,14 +156,18 @@
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
this.set({initializeStarted: true})
|
this.set({initializeStarted: true})
|
||||||
console.log('timeline initialize()')
|
mark('initializeTimeline')
|
||||||
initializeTimeline()
|
doubleRAF(() => {
|
||||||
|
console.log('timeline initialized')
|
||||||
|
this.store.set({timelineInitialized: true})
|
||||||
|
stop('initializeTimeline')
|
||||||
|
})
|
||||||
},
|
},
|
||||||
onScrollTopChanged(scrollTop) {
|
onScrollTopChanged(scrollTop) {
|
||||||
this.set({scrollTop: scrollTop})
|
this.set({scrollTop: scrollTop})
|
||||||
},
|
},
|
||||||
onScrollToBottom() {
|
onScrollToBottom() {
|
||||||
if (!this.store.get('initialized') ||
|
if (!this.store.get('timelineInitialized') ||
|
||||||
this.store.get('runningUpdate') ||
|
this.store.get('runningUpdate') ||
|
||||||
this.get('timelineType') === 'status') { // for status contexts, we've already fetched the whole thread
|
this.get('timelineType') === 'status') { // for status contexts, we've already fetched the whole thread
|
||||||
return
|
return
|
||||||
|
@ -289,6 +282,13 @@
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
|
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})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
|
@ -1,5 +1,5 @@
|
||||||
<VirtualListContainer :realm :containerQuery >
|
<VirtualListContainer :realm :containerQuery on:initialized on:noNeedToScroll >
|
||||||
<div class="virtual-list {{shown ? '' : 'hidden'}}"
|
<div class="virtual-list"
|
||||||
style="height: {{$height}}px;"
|
style="height: {{$height}}px;"
|
||||||
ref:node >
|
ref:node >
|
||||||
<VirtualListHeader component="{{headerComponent}}" virtualProps="{{headerProps}}" shown="{{$showHeader}}"/>
|
<VirtualListHeader component="{{headerComponent}}" virtualProps="{{headerProps}}" shown="{{$showHeader}}"/>
|
||||||
|
@ -21,7 +21,6 @@
|
||||||
<style>
|
<style>
|
||||||
.virtual-list {
|
.virtual-list {
|
||||||
position: relative;
|
position: relative;
|
||||||
transition: opacity 0.25s linear;
|
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
<script>
|
<script>
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
import { mark, stop } from '../../_utils/marks'
|
import { mark, stop } from '../../_utils/marks'
|
||||||
import { scheduleIdleTask } from '../../_utils/scheduleIdleTask'
|
import { scheduleIdleTask } from '../../_utils/scheduleIdleTask'
|
||||||
import { isMobile } from '../../_utils/isMobile'
|
import { isMobile } from '../../_utils/isMobile'
|
||||||
|
import { doubleRAF } from '../../_utils/doubleRAF'
|
||||||
|
|
||||||
const SCROLL_EVENT_DELAY = 300
|
const SCROLL_EVENT_DELAY = 300
|
||||||
|
|
||||||
|
@ -26,9 +27,20 @@
|
||||||
console.log('forcing scroll top to ', scrollTop)
|
console.log('forcing scroll top to ', scrollTop)
|
||||||
node.scrollTop = scrollTop
|
node.scrollTop = scrollTop
|
||||||
stop('set scrollTop')
|
stop('set scrollTop')
|
||||||
|
doubleRAF(() => {
|
||||||
|
console.log('initialized VirtualList')
|
||||||
|
this.fire('initialized')
|
||||||
|
})
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
} else {
|
} else {
|
||||||
|
this.fire('noNeedToScroll')
|
||||||
|
this.observe('allVisibleItemsHaveHeight', allVisibleItemsHaveHeight => {
|
||||||
|
if (allVisibleItemsHaveHeight) {
|
||||||
|
console.log('initialized VirtualList')
|
||||||
|
this.fire('initialized')
|
||||||
|
}
|
||||||
|
})
|
||||||
this.store.setForRealm({
|
this.store.setForRealm({
|
||||||
scrollHeight: node.scrollHeight,
|
scrollHeight: node.scrollHeight,
|
||||||
offsetHeight: node.offsetHeight
|
offsetHeight: node.offsetHeight
|
||||||
|
|
|
@ -1,24 +1,25 @@
|
||||||
{{#if $isUserLoggedIn}}
|
{{#if $isUserLoggedIn}}
|
||||||
<DynamicPageBanner title="" />
|
<TimelinePage timeline="account/{{params.accountId}}">
|
||||||
{{#if $currentAccountProfile && $currentVerifyCredentials}}
|
<DynamicPageBanner title="" />
|
||||||
|
{{#if $currentAccountProfile && $currentVerifyCredentials}}
|
||||||
<AccountProfile account="{{$currentAccountProfile}}"
|
<AccountProfile account="{{$currentAccountProfile}}"
|
||||||
relationship="{{$currentAccountRelationship}}"
|
relationship="{{$currentAccountRelationship}}"
|
||||||
verifyCredentials="{{$currentVerifyCredentials}}"
|
verifyCredentials="{{$currentVerifyCredentials}}"
|
||||||
/>
|
/>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
<PinnedStatuses accountId="{{params.accountId}}" />
|
<PinnedStatuses accountId="{{params.accountId}}" />
|
||||||
<LazyTimeline timeline='account/{{params.accountId}}' />
|
</TimelinePage>
|
||||||
{{else}}
|
{{else}}
|
||||||
<HiddenFromSSR>
|
<HiddenFromSSR>
|
||||||
<FreeTextLayout>
|
<FreeTextLayout>
|
||||||
<h1>Profile</h1>
|
<h1>Profile</h1>
|
||||||
|
|
||||||
<p>A user timeline will appear here when logged in.</p>
|
<p>A user timeline will appear here when logged in.</p>
|
||||||
</FreeTextLayout>
|
</FreeTextLayout>
|
||||||
</HiddenFromSSR>
|
</HiddenFromSSR>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
<script>
|
<script>
|
||||||
import LazyTimeline from '../../_components/timeline/LazyTimeline.html'
|
import TimelinePage from '../../_components/TimelinePage.html'
|
||||||
import FreeTextLayout from '../../_components/FreeTextLayout.html'
|
import FreeTextLayout from '../../_components/FreeTextLayout.html'
|
||||||
import { store } from '../../_store/store.js'
|
import { store } from '../../_store/store.js'
|
||||||
import HiddenFromSSR from '../../_components/HiddenFromSSR'
|
import HiddenFromSSR from '../../_components/HiddenFromSSR'
|
||||||
|
@ -42,7 +43,7 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
components: {
|
components: {
|
||||||
LazyTimeline,
|
TimelinePage,
|
||||||
FreeTextLayout,
|
FreeTextLayout,
|
||||||
HiddenFromSSR,
|
HiddenFromSSR,
|
||||||
DynamicPageBanner,
|
DynamicPageBanner,
|
||||||
|
|
|
@ -1,19 +1,20 @@
|
||||||
{{#if $isUserLoggedIn}}
|
{{#if $isUserLoggedIn}}
|
||||||
{{#if $pinnedPage !== '/favorites'}}
|
<TimelinePage timeline="favorites">
|
||||||
<DynamicPageBanner title="Favorites" icon="#fa-star"/>
|
{{#if $pinnedPage !== '/favorites'}}
|
||||||
{{/if}}
|
<DynamicPageBanner title="Favorites" icon="#fa-star"/>
|
||||||
<LazyTimeline timeline='favorites' />
|
{{/if}}
|
||||||
|
</TimelinePage>
|
||||||
{{else}}
|
{{else}}
|
||||||
<HiddenFromSSR>
|
<HiddenFromSSR>
|
||||||
<FreeTextLayout>
|
<FreeTextLayout>
|
||||||
<h1>Favorites</h1>
|
<h1>Favorites</h1>
|
||||||
|
|
||||||
<p>Your favorites will appear here when logged in.</p>
|
<p>Your favorites will appear here when logged in.</p>
|
||||||
</FreeTextLayout>
|
</FreeTextLayout>
|
||||||
</HiddenFromSSR>
|
</HiddenFromSSR>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
<script>
|
<script>
|
||||||
import LazyTimeline from '.././_components/timeline/LazyTimeline.html'
|
import TimelinePage from '.././_components/TimelinePage.html'
|
||||||
import FreeTextLayout from '.././_components/FreeTextLayout.html'
|
import FreeTextLayout from '.././_components/FreeTextLayout.html'
|
||||||
import { store } from '.././_store/store.js'
|
import { store } from '.././_store/store.js'
|
||||||
import HiddenFromSSR from '.././_components/HiddenFromSSR'
|
import HiddenFromSSR from '.././_components/HiddenFromSSR'
|
||||||
|
@ -22,7 +23,7 @@
|
||||||
export default {
|
export default {
|
||||||
store: () => store,
|
store: () => store,
|
||||||
components: {
|
components: {
|
||||||
LazyTimeline,
|
TimelinePage,
|
||||||
FreeTextLayout,
|
FreeTextLayout,
|
||||||
HiddenFromSSR,
|
HiddenFromSSR,
|
||||||
DynamicPageBanner
|
DynamicPageBanner
|
||||||
|
|
|
@ -1,19 +1,20 @@
|
||||||
{{#if $isUserLoggedIn}}
|
{{#if $isUserLoggedIn}}
|
||||||
{{#if $pinnedPage !== '/federated'}}
|
<TimelinePage timeline="federated">
|
||||||
<DynamicPageBanner title="Federated Timeline" icon="#fa-globe"/>
|
{{#if $pinnedPage !== '/federated'}}
|
||||||
{{/if}}
|
<DynamicPageBanner title="Federated Timeline" icon="#fa-globe"/>
|
||||||
<LazyTimeline timeline='federated' />
|
{{/if}}
|
||||||
|
</TimelinePage>
|
||||||
{{else}}
|
{{else}}
|
||||||
<HiddenFromSSR>
|
<HiddenFromSSR>
|
||||||
<FreeTextLayout>
|
<FreeTextLayout>
|
||||||
<h1>Federated</h1>
|
<h1>Federated</h1>
|
||||||
|
|
||||||
<p>Your federated timeline will appear here when logged in.</p>
|
<p>Your federated timeline will appear here when logged in.</p>
|
||||||
</FreeTextLayout>
|
</FreeTextLayout>
|
||||||
</HiddenFromSSR>
|
</HiddenFromSSR>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
<script>
|
<script>
|
||||||
import LazyTimeline from '.././_components/timeline/LazyTimeline.html'
|
import TimelinePage from '.././_components/TimelinePage.html'
|
||||||
import FreeTextLayout from '.././_components/FreeTextLayout.html'
|
import FreeTextLayout from '.././_components/FreeTextLayout.html'
|
||||||
import { store } from '.././_store/store.js'
|
import { store } from '.././_store/store.js'
|
||||||
import HiddenFromSSR from '.././_components/HiddenFromSSR'
|
import HiddenFromSSR from '.././_components/HiddenFromSSR'
|
||||||
|
@ -22,7 +23,7 @@
|
||||||
export default {
|
export default {
|
||||||
store: () => store,
|
store: () => store,
|
||||||
components: {
|
components: {
|
||||||
LazyTimeline,
|
TimelinePage,
|
||||||
FreeTextLayout,
|
FreeTextLayout,
|
||||||
HiddenFromSSR,
|
HiddenFromSSR,
|
||||||
DynamicPageBanner
|
DynamicPageBanner
|
||||||
|
|
|
@ -1,25 +1,18 @@
|
||||||
{{#if $isUserLoggedIn}}
|
{{#if $isUserLoggedIn}}
|
||||||
{{#if $currentVerifyCredentials}}
|
<TimelineHomePage/>
|
||||||
<ComposeBox realm="home" />
|
|
||||||
{{/if}}
|
|
||||||
<LazyTimeline timeline='home' />
|
|
||||||
{{else}}
|
{{else}}
|
||||||
<NotLoggedInHome/>
|
<NotLoggedInHome/>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
<style>
|
|
||||||
</style>
|
|
||||||
<script>
|
<script>
|
||||||
import NotLoggedInHome from '.././_components/NotLoggedInHome.html'
|
import NotLoggedInHome from '.././_components/NotLoggedInHome.html'
|
||||||
import LazyTimeline from '.././_components/timeline/LazyTimeline.html'
|
|
||||||
import ComposeBox from '.././_components/compose/ComposeBox.html'
|
|
||||||
import { store } from '.././_store/store.js'
|
import { store } from '.././_store/store.js'
|
||||||
|
import TimelineHomePage from '../_components/TimelineHomePage.html'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
store: () => store,
|
store: () => store,
|
||||||
components: {
|
components: {
|
||||||
LazyTimeline,
|
|
||||||
NotLoggedInHome,
|
NotLoggedInHome,
|
||||||
ComposeBox
|
TimelineHomePage
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
|
@ -1,19 +1,20 @@
|
||||||
{{#if $isUserLoggedIn}}
|
{{#if $isUserLoggedIn}}
|
||||||
{{#if $pinnedPage !== `/lists/${params.listId}`}}
|
<TimelinePage timeline="list/{{params.listId}}">
|
||||||
<DynamicPageBanner title="{{listTitle}}" icon="#fa-bars"/>
|
{{#if $pinnedPage !== `/lists/${params.listId}`}}
|
||||||
{{/if}}
|
<DynamicPageBanner title="{{listTitle}}" icon="#fa-bars"/>
|
||||||
<LazyTimeline timeline='list/{{params.listId}}' />
|
{{/if}}
|
||||||
|
</TimelinePage>
|
||||||
{{else}}
|
{{else}}
|
||||||
<HiddenFromSSR>
|
<HiddenFromSSR>
|
||||||
<FreeTextLayout>
|
<FreeTextLayout>
|
||||||
<h1>List</h1>
|
<h1>List</h1>
|
||||||
|
|
||||||
<p>A list will appear here when logged in.</p>
|
<p>A list will appear here when logged in.</p>
|
||||||
</FreeTextLayout>
|
</FreeTextLayout>
|
||||||
</HiddenFromSSR>
|
</HiddenFromSSR>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
<script>
|
<script>
|
||||||
import LazyTimeline from '../../_components/timeline/LazyTimeline.html'
|
import TimelinePage from '../../_components/TimelinePage.html'
|
||||||
import FreeTextLayout from '../../_components/FreeTextLayout.html'
|
import FreeTextLayout from '../../_components/FreeTextLayout.html'
|
||||||
import { store } from '../../_store/store.js'
|
import { store } from '../../_store/store.js'
|
||||||
import HiddenFromSSR from '../../_components/HiddenFromSSR'
|
import HiddenFromSSR from '../../_components/HiddenFromSSR'
|
||||||
|
@ -26,7 +27,7 @@
|
||||||
},
|
},
|
||||||
store: () => store,
|
store: () => store,
|
||||||
components: {
|
components: {
|
||||||
LazyTimeline,
|
TimelinePage,
|
||||||
FreeTextLayout,
|
FreeTextLayout,
|
||||||
HiddenFromSSR,
|
HiddenFromSSR,
|
||||||
DynamicPageBanner
|
DynamicPageBanner
|
||||||
|
|
|
@ -1,19 +1,20 @@
|
||||||
{{#if $isUserLoggedIn}}
|
{{#if $isUserLoggedIn}}
|
||||||
{{#if $pinnedPage !== '/local'}}
|
<TimelinePage timeline="local">
|
||||||
<DynamicPageBanner title="Local Timeline" icon="#fa-users"/>
|
{{#if $pinnedPage !== '/local'}}
|
||||||
{{/if}}
|
<DynamicPageBanner title="Local Timeline" icon="#fa-users"/>
|
||||||
<LazyTimeline timeline='local' />
|
{{/if}}
|
||||||
|
</TimelinePage>
|
||||||
{{else}}
|
{{else}}
|
||||||
<HiddenFromSSR>
|
<HiddenFromSSR>
|
||||||
<FreeTextLayout>
|
<FreeTextLayout>
|
||||||
<h1>Local</h1>
|
<h1>Local</h1>
|
||||||
|
|
||||||
<p>Your local timeline will appear here when logged in.</p>
|
<p>Your local timeline will appear here when logged in.</p>
|
||||||
</FreeTextLayout>
|
</FreeTextLayout>
|
||||||
</HiddenFromSSR>
|
</HiddenFromSSR>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
<script>
|
<script>
|
||||||
import LazyTimeline from '.././_components/timeline/LazyTimeline.html'
|
import TimelinePage from '.././_components/TimelinePage.html'
|
||||||
import FreeTextLayout from '.././_components/FreeTextLayout.html'
|
import FreeTextLayout from '.././_components/FreeTextLayout.html'
|
||||||
import { store } from '.././_store/store.js'
|
import { store } from '.././_store/store.js'
|
||||||
import HiddenFromSSR from '.././_components/HiddenFromSSR'
|
import HiddenFromSSR from '.././_components/HiddenFromSSR'
|
||||||
|
@ -22,7 +23,7 @@
|
||||||
export default {
|
export default {
|
||||||
store: () => store,
|
store: () => store,
|
||||||
components: {
|
components: {
|
||||||
LazyTimeline,
|
TimelinePage,
|
||||||
FreeTextLayout,
|
FreeTextLayout,
|
||||||
HiddenFromSSR,
|
HiddenFromSSR,
|
||||||
DynamicPageBanner
|
DynamicPageBanner
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
{{#if $isUserLoggedIn}}
|
{{#if $isUserLoggedIn}}
|
||||||
<LazyTimeline timeline='notifications' />
|
<TimelinePage timeline="notifications" />
|
||||||
{{else}}
|
{{else}}
|
||||||
<HiddenFromSSR>
|
<HiddenFromSSR>
|
||||||
<FreeTextLayout>
|
<FreeTextLayout>
|
||||||
|
@ -10,17 +10,17 @@
|
||||||
</HiddenFromSSR>
|
</HiddenFromSSR>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
<script>
|
<script>
|
||||||
import LazyTimeline from '.././_components/timeline/LazyTimeline.html'
|
|
||||||
import FreeTextLayout from '.././_components/FreeTextLayout.html'
|
import FreeTextLayout from '.././_components/FreeTextLayout.html'
|
||||||
import { store } from '.././_store/store.js'
|
import { store } from '.././_store/store.js'
|
||||||
import HiddenFromSSR from '.././_components/HiddenFromSSR'
|
import HiddenFromSSR from '.././_components/HiddenFromSSR'
|
||||||
|
import TimelinePage from '../_components/TimelinePage.html'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
store: () => store,
|
store: () => store,
|
||||||
components: {
|
components: {
|
||||||
LazyTimeline,
|
|
||||||
FreeTextLayout,
|
FreeTextLayout,
|
||||||
HiddenFromSSR
|
HiddenFromSSR,
|
||||||
|
TimelinePage
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
|
@ -1,29 +1,30 @@
|
||||||
{{#if $isUserLoggedIn}}
|
{{#if $isUserLoggedIn}}
|
||||||
<DynamicPageBanner title=""/>
|
<TimelinePage timeline="status/{{params.statusId}}">
|
||||||
<LazyTimeline timeline='status/{{params.statusId}}' />
|
<DynamicPageBanner title=""/>
|
||||||
|
</TimelinePage>
|
||||||
{{else}}
|
{{else}}
|
||||||
<HiddenFromSSR>
|
<HiddenFromSSR>
|
||||||
<FreeTextLayout>
|
<FreeTextLayout>
|
||||||
<h1>Status</h1>
|
<h1>Status</h1>
|
||||||
|
|
||||||
<p>A status thread will appear here when logged in.</p>
|
<p>A status thread will appear here when logged in.</p>
|
||||||
</FreeTextLayout>
|
</FreeTextLayout>
|
||||||
</HiddenFromSSR>
|
</HiddenFromSSR>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
<script>
|
<script>
|
||||||
import LazyTimeline from '../../../_components/timeline/LazyTimeline.html'
|
|
||||||
import FreeTextLayout from '../../../_components/FreeTextLayout.html'
|
import FreeTextLayout from '../../../_components/FreeTextLayout.html'
|
||||||
import { store } from '../../../_store/store.js'
|
import { store } from '../../../_store/store.js'
|
||||||
import HiddenFromSSR from '../../../_components/HiddenFromSSR'
|
import HiddenFromSSR from '../../../_components/HiddenFromSSR'
|
||||||
import DynamicPageBanner from '../../../_components/DynamicPageBanner.html'
|
import DynamicPageBanner from '../../../_components/DynamicPageBanner.html'
|
||||||
|
import TimelinePage from '../../../_components/TimelinePage.html'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
store: () => store,
|
store: () => store,
|
||||||
components: {
|
components: {
|
||||||
LazyTimeline,
|
|
||||||
FreeTextLayout,
|
FreeTextLayout,
|
||||||
HiddenFromSSR,
|
HiddenFromSSR,
|
||||||
DynamicPageBanner
|
DynamicPageBanner,
|
||||||
|
TimelinePage
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
|
@ -1,17 +1,18 @@
|
||||||
{{#if $isUserLoggedIn}}
|
{{#if $isUserLoggedIn}}
|
||||||
<DynamicPageBanner title="{{'#' + params.tagName}}"/>
|
<TimelinePage timeline="tag/{{params.tagName}}">
|
||||||
<LazyTimeline timeline='tag/{{params.tagName}}' />
|
<DynamicPageBanner title="{{'#' + params.tagName}}"/>
|
||||||
|
</TimelinePage>
|
||||||
{{else}}
|
{{else}}
|
||||||
<HiddenFromSSR>
|
<HiddenFromSSR>
|
||||||
<FreeTextLayout>
|
<FreeTextLayout>
|
||||||
<h1>#{{params.tagName}}</h1>
|
<h1>#{{params.tagName}}</h1>
|
||||||
|
|
||||||
<p>A hashtag timeline will appear here when logged in.</p>
|
<p>A hashtag timeline will appear here when logged in.</p>
|
||||||
</FreeTextLayout>
|
</FreeTextLayout>
|
||||||
</HiddenFromSSR>
|
</HiddenFromSSR>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
<script>
|
<script>
|
||||||
import LazyTimeline from '../../_components/timeline/LazyTimeline.html'
|
import TimelinePage from '../../_components/TimelinePage.html'
|
||||||
import FreeTextLayout from '../../_components/FreeTextLayout.html'
|
import FreeTextLayout from '../../_components/FreeTextLayout.html'
|
||||||
import { store } from '../../_store/store.js'
|
import { store } from '../../_store/store.js'
|
||||||
import HiddenFromSSR from '../../_components/HiddenFromSSR'
|
import HiddenFromSSR from '../../_components/HiddenFromSSR'
|
||||||
|
@ -20,7 +21,7 @@
|
||||||
export default {
|
export default {
|
||||||
store: () => store,
|
store: () => store,
|
||||||
components: {
|
components: {
|
||||||
LazyTimeline,
|
TimelinePage,
|
||||||
FreeTextLayout,
|
FreeTextLayout,
|
||||||
HiddenFromSSR,
|
HiddenFromSSR,
|
||||||
DynamicPageBanner
|
DynamicPageBanner
|
||||||
|
|
|
@ -11,7 +11,6 @@ function computeForTimeline (store, key, defaultValue) {
|
||||||
export function timelineComputations (store) {
|
export function timelineComputations (store) {
|
||||||
computeForTimeline(store, 'timelineItemIds', null)
|
computeForTimeline(store, 'timelineItemIds', null)
|
||||||
computeForTimeline(store, 'runningUpdate', false)
|
computeForTimeline(store, 'runningUpdate', false)
|
||||||
computeForTimeline(store, 'initialized', false)
|
|
||||||
computeForTimeline(store, 'lastFocusedElementSelector', null)
|
computeForTimeline(store, 'lastFocusedElementSelector', null)
|
||||||
computeForTimeline(store, 'ignoreBlurEvents', false)
|
computeForTimeline(store, 'ignoreBlurEvents', false)
|
||||||
computeForTimeline(store, 'itemIdsToAdd', null)
|
computeForTimeline(store, 'itemIdsToAdd', null)
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
export function doubleRAF (fn) {
|
||||||
|
requestAnimationFrame(() => requestAnimationFrame(fn))
|
||||||
|
}
|
Loading…
Reference in New Issue