slight refactor of timeline fetching (#485)
This commit is contained in:
		
							parent
							
								
									8d2e0636d6
								
							
						
					
					
						commit
						1423a6b14b
					
				
					 4 changed files with 39 additions and 18 deletions
				
			
		| 
						 | 
				
			
			@ -2,7 +2,7 @@ import { store } from '../_store/store'
 | 
			
		|||
import { getTimeline } from '../_api/timelines'
 | 
			
		||||
import { toast } from '../_utils/toast'
 | 
			
		||||
import { mark, stop } from '../_utils/marks'
 | 
			
		||||
import { mergeArrays } from '../_utils/arrays'
 | 
			
		||||
import { concat, mergeArrays } from '../_utils/arrays'
 | 
			
		||||
import { byItemIds } from '../_utils/sorting'
 | 
			
		||||
import isEqual from 'lodash-es/isEqual'
 | 
			
		||||
import {
 | 
			
		||||
| 
						 | 
				
			
			@ -11,9 +11,22 @@ import {
 | 
			
		|||
import {
 | 
			
		||||
  getTimeline as getTimelineFromDatabase
 | 
			
		||||
} from '../_database/timelines/pagination'
 | 
			
		||||
import { getStatus, getStatusContext } from '../_api/statuses'
 | 
			
		||||
 | 
			
		||||
const FETCH_LIMIT = 20
 | 
			
		||||
 | 
			
		||||
async function fetchTimelineItemsFromNetwork (instanceName, accessToken, timelineName, lastTimelineItemId) {
 | 
			
		||||
  if (timelineName.startsWith('status/')) { // special case - this is a list of descendents and ancestors
 | 
			
		||||
    let statusId = timelineName.split('/').slice(-1)[0]
 | 
			
		||||
    let statusRequest = getStatus(instanceName, accessToken, statusId)
 | 
			
		||||
    let contextRequest = getStatusContext(instanceName, accessToken, statusId)
 | 
			
		||||
    let [ status, context ] = await Promise.all([statusRequest, contextRequest])
 | 
			
		||||
    return concat(context.ancestors, status, context.descendants)
 | 
			
		||||
  } else { // normal timeline
 | 
			
		||||
    return getTimeline(instanceName, accessToken, timelineName, lastTimelineItemId, FETCH_LIMIT)
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
async function fetchTimelineItems (instanceName, accessToken, timelineName, lastTimelineItemId, online) {
 | 
			
		||||
  mark('fetchTimelineItems')
 | 
			
		||||
  let items
 | 
			
		||||
| 
						 | 
				
			
			@ -23,7 +36,7 @@ async function fetchTimelineItems (instanceName, accessToken, timelineName, last
 | 
			
		|||
    stale = true
 | 
			
		||||
  } else {
 | 
			
		||||
    try {
 | 
			
		||||
      items = await getTimeline(instanceName, accessToken, timelineName, lastTimelineItemId, FETCH_LIMIT)
 | 
			
		||||
      items = await fetchTimelineItemsFromNetwork(instanceName, accessToken, timelineName, lastTimelineItemId)
 | 
			
		||||
      /* no await */ insertTimelineItemsInDatabase(instanceName, timelineName, items)
 | 
			
		||||
    } catch (e) {
 | 
			
		||||
      console.error(e)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,5 +1,5 @@
 | 
			
		|||
import { auth, basename } from './utils'
 | 
			
		||||
import { post, WRITE_TIMEOUT } from '../_utils/ajax'
 | 
			
		||||
import { DEFAULT_TIMEOUT, get, post, WRITE_TIMEOUT } from '../_utils/ajax'
 | 
			
		||||
 | 
			
		||||
export async function postStatus (instanceName, accessToken, text, inReplyToId, mediaIds,
 | 
			
		||||
  sensitive, spoilerText, visibility) {
 | 
			
		||||
| 
						 | 
				
			
			@ -23,3 +23,13 @@ export async function postStatus (instanceName, accessToken, text, inReplyToId,
 | 
			
		|||
 | 
			
		||||
  return post(url, body, auth(accessToken), {timeout: WRITE_TIMEOUT})
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export async function getStatusContext (instanceName, accessToken, statusId) {
 | 
			
		||||
  let url = `${basename(instanceName)}/api/v1/statuses/${statusId}/context`
 | 
			
		||||
  return get(url, auth(accessToken), {timeout: DEFAULT_TIMEOUT})
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export async function getStatus (instanceName, accessToken, statusId) {
 | 
			
		||||
  let url = `${basename(instanceName)}/api/v1/statuses/${statusId}`
 | 
			
		||||
  return get(url, auth(accessToken), {timeout: DEFAULT_TIMEOUT})
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -15,8 +15,6 @@ function getTimelineUrlPath (timeline) {
 | 
			
		|||
  }
 | 
			
		||||
  if (timeline.startsWith('tag/')) {
 | 
			
		||||
    return 'timelines/tag'
 | 
			
		||||
  } else if (timeline.startsWith('status/')) {
 | 
			
		||||
    return 'statuses'
 | 
			
		||||
  } else if (timeline.startsWith('account/')) {
 | 
			
		||||
    return 'accounts'
 | 
			
		||||
  } else if (timeline.startsWith('list/')) {
 | 
			
		||||
| 
						 | 
				
			
			@ -30,8 +28,6 @@ export function getTimeline (instanceName, accessToken, timeline, maxId, since)
 | 
			
		|||
 | 
			
		||||
  if (timeline.startsWith('tag/')) {
 | 
			
		||||
    url += '/' + timeline.split('/').slice(-1)[0]
 | 
			
		||||
  } else if (timeline.startsWith('status/')) {
 | 
			
		||||
    url += '/' + timeline.split('/').slice(-1)[0] + '/context'
 | 
			
		||||
  } else if (timeline.startsWith('account/')) {
 | 
			
		||||
    url += '/' + timeline.split('/').slice(-1)[0] + '/statuses'
 | 
			
		||||
  } else if (timeline.startsWith('list/')) {
 | 
			
		||||
| 
						 | 
				
			
			@ -53,16 +49,5 @@ export function getTimeline (instanceName, accessToken, timeline, maxId, since)
 | 
			
		|||
 | 
			
		||||
  url += '?' + paramsString(params)
 | 
			
		||||
 | 
			
		||||
  if (timeline.startsWith('status/')) {
 | 
			
		||||
    // special case - this is a list of descendents and ancestors
 | 
			
		||||
    let statusUrl = `${basename(instanceName)}/api/v1/statuses/${timeline.split('/').slice(-1)[0]}`
 | 
			
		||||
    return Promise.all([
 | 
			
		||||
      get(url, auth(accessToken), {timeout: DEFAULT_TIMEOUT}),
 | 
			
		||||
      get(statusUrl, auth(accessToken), {timeout: DEFAULT_TIMEOUT})
 | 
			
		||||
    ]).then(res => {
 | 
			
		||||
      return [].concat(res[0].ancestors).concat([res[1]]).concat(res[0].descendants)
 | 
			
		||||
    })
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return get(url, auth(accessToken), {timeout: DEFAULT_TIMEOUT})
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -31,3 +31,16 @@ export function mergeArrays (leftArray, rightArray) {
 | 
			
		|||
  }
 | 
			
		||||
  return merged
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export function concat () {
 | 
			
		||||
  let res = []
 | 
			
		||||
  for (let i = 0, len = arguments.length; i < len; i++) {
 | 
			
		||||
    let arg = arguments[i]
 | 
			
		||||
    if (Array.isArray(arg)) {
 | 
			
		||||
      res = res.concat(arguments[i])
 | 
			
		||||
    } else {
 | 
			
		||||
      res.push(arguments[i])
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  return res
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		
		Reference in a new issue