pinafore/src/routes/_store/observers/timelineObservers.js

89 lines
2.9 KiB
JavaScript
Raw Normal View History

2018-03-03 23:15:50 +01:00
import { updateInstanceInfo } from '../../_actions/instances'
import { createStream } from '../../_actions/streaming'
2018-03-19 18:09:05 +01:00
import { getTimeline } from '../../_api/timelines'
import { addStatusesOrNotifications } from '../../_actions/addStatusOrNotification'
import { TIMELINE_BATCH_SIZE } from '../../_static/timelines'
import { store } from '../store'
import { getFirstIdFromItemSummaries } from '../../_utils/getIdFromItemSummaries'
2018-02-11 22:46:57 +01:00
export function timelineObservers () {
2018-02-15 18:02:46 +01:00
// stream to watch for local/federated/etc. updates. home and notification
// updates are handled in timelineObservers.js
2018-02-11 22:46:57 +01:00
let currentTimelineStream
2018-03-19 18:09:05 +01:00
function shutdownPreviousStream () {
2018-02-11 22:46:57 +01:00
if (currentTimelineStream) {
currentTimelineStream.close()
currentTimelineStream = null
2018-02-15 18:02:46 +01:00
if (process.env.NODE_ENV !== 'production') {
window.currentTimelineStream = null
}
2018-02-11 22:46:57 +01:00
}
2018-03-19 18:09:05 +01:00
}
function shouldObserveTimeline (timeline) {
return timeline &&
!(
timeline !== 'local' &&
2018-03-19 18:09:05 +01:00
timeline !== 'federated' &&
!timeline.startsWith('list/') &&
!timeline.startsWith('tag/')
)
2018-03-19 18:09:05 +01:00
}
store.observe('currentTimeline', async (currentTimeline) => {
if (!process.browser) {
2018-02-11 22:46:57 +01:00
return
}
2018-03-19 18:09:05 +01:00
shutdownPreviousStream()
if (!shouldObserveTimeline(currentTimeline)) {
2018-02-11 22:46:57 +01:00
return
}
let { currentInstance } = store.get()
let { accessToken } = store.get()
2018-02-11 22:46:57 +01:00
await updateInstanceInfo(currentInstance)
2018-03-19 18:09:05 +01:00
let currentTimelineIsUnchanged = () => {
let {
currentInstance: newCurrentInstance,
currentTimeline: newCurrentTimeline
} = store.get()
return newCurrentInstance === currentInstance &&
newCurrentTimeline === currentTimeline
}
2018-03-19 18:09:05 +01:00
if (!currentTimelineIsUnchanged()) {
2018-02-11 22:46:57 +01:00
return
}
let timelineItemSummaries = store.getForTimeline(currentInstance,
currentTimeline, 'timelineItemSummaries')
let firstTimelineItemId = getFirstIdFromItemSummaries(timelineItemSummaries)
2018-03-19 18:09:05 +01:00
let onOpenStream = async () => {
if (!firstTimelineItemId || !currentTimelineIsUnchanged()) {
return
}
2018-03-19 18:09:05 +01:00
// fill in the "streaming gap" i.e. fetch the most recent 20 items so that there isn't
// a big gap in the timeline if you haven't looked at it in awhile
let newTimelineItems = await getTimeline(currentInstance, accessToken,
currentTimeline, null, firstTimelineItemId, TIMELINE_BATCH_SIZE)
2018-03-19 18:09:05 +01:00
if (newTimelineItems.length) {
addStatusesOrNotifications(currentInstance, currentTimeline, newTimelineItems)
}
}
let { currentInstanceInfo } = store.get()
let streamingApi = currentInstanceInfo.urls.streaming_api
currentTimelineStream = createStream(streamingApi, currentInstance, accessToken,
currentTimeline, onOpenStream)
2018-02-15 18:02:46 +01:00
if (process.env.NODE_ENV !== 'production') {
window.currentTimelineStream = currentTimelineStream
}
2018-02-11 22:46:57 +01:00
})
}