Pinafore-Web-Client-Frontend/src/routes/_api/timelines.js

82 lines
2.2 KiB
JavaScript
Raw Normal View History

import { getWithHeaders, paramsString, DEFAULT_TIMEOUT } from '../_utils/ajax.js'
import { auth, basename } from './utils.js'
2018-01-19 05:25:34 +01:00
2018-02-09 07:29:29 +01:00
function getTimelineUrlPath (timeline) {
2018-01-22 05:02:32 +01:00
switch (timeline) {
case 'local':
case 'federated':
2018-01-23 06:16:27 +01:00
return 'timelines/public'
2018-01-22 05:02:32 +01:00
case 'home':
2018-01-23 06:16:27 +01:00
return 'timelines/home'
case 'notifications':
case 'notifications/mentions':
return 'notifications'
case 'favorites':
return 'favourites'
case 'direct':
return 'conversations'
2020-07-25 20:17:08 +02:00
case 'bookmarks':
return 'bookmarks'
2018-01-23 06:16:27 +01:00
}
if (timeline.startsWith('tag/')) {
return 'timelines/tag'
} else if (timeline.startsWith('account/')) {
return 'accounts'
2018-02-08 18:15:25 +01:00
} else if (timeline.startsWith('list/')) {
return 'timelines/list'
2018-01-22 05:02:32 +01:00
}
2020-07-25 20:17:08 +02:00
throw new Error(`Invalid timeline type: ${timeline}`)
2018-01-22 05:02:32 +01:00
}
export async function getTimeline (instanceName, accessToken, timeline, maxId, since, limit) {
2019-08-03 22:49:37 +02:00
const timelineUrlName = getTimelineUrlPath(timeline)
2018-01-23 06:16:27 +01:00
let url = `${basename(instanceName)}/api/v1/${timelineUrlName}`
2018-01-19 05:25:34 +01:00
2018-01-22 05:02:32 +01:00
if (timeline.startsWith('tag/')) {
url += '/' + timeline.split('/')[1]
2018-01-23 06:16:27 +01:00
} else if (timeline.startsWith('account/')) {
url += '/' + timeline.split('/')[1] + '/statuses'
2018-02-08 18:15:25 +01:00
} else if (timeline.startsWith('list/')) {
url += '/' + timeline.split('/')[1]
2018-01-22 05:02:32 +01:00
}
2019-08-03 22:49:37 +02:00
const params = {}
2018-01-19 05:25:34 +01:00
if (since) {
2019-07-22 16:43:36 +02:00
params.since_id = since
2018-01-19 05:25:34 +01:00
}
if (maxId) {
params.max_id = maxId
}
if (limit) {
params.limit = limit
}
2018-01-19 08:37:43 +01:00
if (timeline === 'local') {
params.local = true
}
if (timeline.startsWith('account/')) {
if (timeline.endsWith('media')) {
params.only_media = true
} else {
params.exclude_replies = !timeline.endsWith('/with_replies')
}
}
if (timeline === 'notifications/mentions') {
params.exclude_types = ['follow', 'favourite', 'reblog', 'poll', 'admin.sign_up', 'update', 'follow_request', 'admin.report']
}
2018-01-19 05:25:34 +01:00
url += '?' + paramsString(params)
console.log('fetching url', url)
let { json: items, headers } = await getWithHeaders(url, auth(accessToken), { timeout: DEFAULT_TIMEOUT })
if (timeline === 'direct') {
items = items.map(item => item.last_status).filter(Boolean) // ignore falsy last_status'es
}
return { items, headers }
2018-02-09 07:29:29 +01:00
}