2020-11-25 21:22:37 +00:00
|
|
|
import { Map as ImmutableMap, List as ImmutableList, toJS } from 'immutable'
|
|
|
|
import noop from 'lodash.noop'
|
|
|
|
import { importFetchedStatus, importFetchedStatuses } from './importer'
|
|
|
|
import api, { getLinks } from '../api'
|
2020-06-13 00:38:05 +01:00
|
|
|
import { fetchRelationships } from './accounts'
|
2019-07-02 08:10:25 +01:00
|
|
|
|
2020-11-25 21:22:37 +00:00
|
|
|
export const TIMELINE_UPDATE = 'TIMELINE_UPDATE'
|
|
|
|
export const TIMELINE_DELETE = 'TIMELINE_DELETE'
|
|
|
|
export const TIMELINE_CLEAR = 'TIMELINE_CLEAR'
|
|
|
|
export const TIMELINE_UPDATE_QUEUE = 'TIMELINE_UPDATE_QUEUE'
|
|
|
|
export const TIMELINE_DEQUEUE = 'TIMELINE_DEQUEUE'
|
|
|
|
export const TIMELINE_SCROLL_TOP = 'TIMELINE_SCROLL_TOP'
|
2019-07-02 08:10:25 +01:00
|
|
|
|
2020-11-25 21:22:37 +00:00
|
|
|
export const TIMELINE_EXPAND_REQUEST = 'TIMELINE_EXPAND_REQUEST'
|
|
|
|
export const TIMELINE_EXPAND_SUCCESS = 'TIMELINE_EXPAND_SUCCESS'
|
|
|
|
export const TIMELINE_EXPAND_FAIL = 'TIMELINE_EXPAND_FAIL'
|
2019-07-02 08:10:25 +01:00
|
|
|
|
2020-11-25 21:22:37 +00:00
|
|
|
export const TIMELINE_CONNECT = 'TIMELINE_CONNECT'
|
|
|
|
export const TIMELINE_DISCONNECT = 'TIMELINE_DISCONNECT'
|
2019-07-02 08:10:25 +01:00
|
|
|
|
2020-11-25 21:22:37 +00:00
|
|
|
export const MAX_QUEUED_ITEMS = 40
|
Added redux functionality for queueing/dequeueing timelines
using streaming.js, when a status comes in to the current page, it queues up using updateTimelineQueue action, it then goes to the reducer to add "queuedItems" to state (up to max:40) and to tally up all count in that timeilne state "totalQueuedItemsCount".
the dequeueTimeline action takes in a "timelineId", "expandFunc", and "optionalExpandArgs". when clicking on the "click to load more" it passes in the timelineId (e.g. "home", "community", etc.) and the "handleLoadMore" function from the timeline component. if within the range of the max: 40, it pushes them to the dom, if over the max: 40 it clears the timeline and refreshes the page/timeline to show the most recent 20 statuses. Then, it resets the "queuedItems" and "totalQueuedItemsCount" in timeline state.
if no expandFunc is added, and timeline is "home" or "community" it expands those timelines with "optionalExpandArgs". Otherwise, it queues up to any other timeline (e.g. "hashtags", etc.)
2019-07-11 17:09:41 +01:00
|
|
|
|
2020-11-25 21:22:37 +00:00
|
|
|
const parseTags = (tags = {}, mode) => {
|
|
|
|
return (tags[mode] || []).map((tag) => tag.value)
|
|
|
|
}
|
2019-07-02 08:10:25 +01:00
|
|
|
|
2020-12-23 04:43:31 +00:00
|
|
|
const fetchStatusesAccountsRelationships = (dispatch, statuses) => {
|
|
|
|
const accountIds = statuses.map(item => item.account.id)
|
|
|
|
if (accountIds.length > 0) {
|
|
|
|
dispatch(fetchRelationships(accountIds))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-11-25 21:22:37 +00:00
|
|
|
/**
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
export const updateTimeline = (timeline, status, accept) => (dispatch) => {
|
|
|
|
if (typeof accept === 'function' && !accept(status)) return
|
2019-07-02 08:10:25 +01:00
|
|
|
|
2020-11-25 21:22:37 +00:00
|
|
|
dispatch(importFetchedStatus(status))
|
2019-07-02 08:10:25 +01:00
|
|
|
|
2020-11-25 21:22:37 +00:00
|
|
|
dispatch({
|
|
|
|
type: TIMELINE_UPDATE,
|
|
|
|
timeline,
|
|
|
|
status,
|
|
|
|
})
|
|
|
|
}
|
Added redux functionality for queueing/dequeueing timelines
using streaming.js, when a status comes in to the current page, it queues up using updateTimelineQueue action, it then goes to the reducer to add "queuedItems" to state (up to max:40) and to tally up all count in that timeilne state "totalQueuedItemsCount".
the dequeueTimeline action takes in a "timelineId", "expandFunc", and "optionalExpandArgs". when clicking on the "click to load more" it passes in the timelineId (e.g. "home", "community", etc.) and the "handleLoadMore" function from the timeline component. if within the range of the max: 40, it pushes them to the dom, if over the max: 40 it clears the timeline and refreshes the page/timeline to show the most recent 20 statuses. Then, it resets the "queuedItems" and "totalQueuedItemsCount" in timeline state.
if no expandFunc is added, and timeline is "home" or "community" it expands those timelines with "optionalExpandArgs". Otherwise, it queues up to any other timeline (e.g. "hashtags", etc.)
2019-07-11 17:09:41 +01:00
|
|
|
|
2020-11-25 21:22:37 +00:00
|
|
|
/**
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
export const updateTimelineQueue = (timeline, status, accept) => (dispatch) => {
|
|
|
|
if (typeof accept === 'function' && !accept(status)) return
|
Added redux functionality for queueing/dequeueing timelines
using streaming.js, when a status comes in to the current page, it queues up using updateTimelineQueue action, it then goes to the reducer to add "queuedItems" to state (up to max:40) and to tally up all count in that timeilne state "totalQueuedItemsCount".
the dequeueTimeline action takes in a "timelineId", "expandFunc", and "optionalExpandArgs". when clicking on the "click to load more" it passes in the timelineId (e.g. "home", "community", etc.) and the "handleLoadMore" function from the timeline component. if within the range of the max: 40, it pushes them to the dom, if over the max: 40 it clears the timeline and refreshes the page/timeline to show the most recent 20 statuses. Then, it resets the "queuedItems" and "totalQueuedItemsCount" in timeline state.
if no expandFunc is added, and timeline is "home" or "community" it expands those timelines with "optionalExpandArgs". Otherwise, it queues up to any other timeline (e.g. "hashtags", etc.)
2019-07-11 17:09:41 +01:00
|
|
|
|
2020-11-25 21:22:37 +00:00
|
|
|
dispatch({
|
|
|
|
type: TIMELINE_UPDATE_QUEUE,
|
|
|
|
timeline,
|
|
|
|
status,
|
|
|
|
})
|
2020-06-10 22:44:38 +01:00
|
|
|
}
|
|
|
|
|
2020-11-25 21:22:37 +00:00
|
|
|
/**
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
export const forceDequeueTimeline = (timeline) => (dispatch) => {
|
|
|
|
dispatch({
|
|
|
|
type: TIMELINE_DEQUEUE,
|
|
|
|
timeline,
|
|
|
|
})
|
|
|
|
}
|
Added redux functionality for queueing/dequeueing timelines
using streaming.js, when a status comes in to the current page, it queues up using updateTimelineQueue action, it then goes to the reducer to add "queuedItems" to state (up to max:40) and to tally up all count in that timeilne state "totalQueuedItemsCount".
the dequeueTimeline action takes in a "timelineId", "expandFunc", and "optionalExpandArgs". when clicking on the "click to load more" it passes in the timelineId (e.g. "home", "community", etc.) and the "handleLoadMore" function from the timeline component. if within the range of the max: 40, it pushes them to the dom, if over the max: 40 it clears the timeline and refreshes the page/timeline to show the most recent 20 statuses. Then, it resets the "queuedItems" and "totalQueuedItemsCount" in timeline state.
if no expandFunc is added, and timeline is "home" or "community" it expands those timelines with "optionalExpandArgs". Otherwise, it queues up to any other timeline (e.g. "hashtags", etc.)
2019-07-11 17:09:41 +01:00
|
|
|
|
2020-11-25 21:22:37 +00:00
|
|
|
/**
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
export const dequeueTimeline = (timeline, expandFunc, optionalExpandArgs) => (dispatch, getState) => {
|
|
|
|
const queuedItems = getState().getIn(['timelines', timeline, 'queuedItems'], ImmutableList())
|
|
|
|
const totalQueuedItemsCount = getState().getIn(['timelines', timeline, 'totalQueuedItemsCount'], 0)
|
|
|
|
|
|
|
|
let shouldDispatchDequeue = true
|
|
|
|
|
|
|
|
if (totalQueuedItemsCount === 0) return
|
|
|
|
|
|
|
|
|
|
|
|
if (totalQueuedItemsCount > 0 && totalQueuedItemsCount <= MAX_QUEUED_ITEMS) {
|
|
|
|
queuedItems.forEach((status) => {
|
|
|
|
dispatch(updateTimeline(timeline, status.toJS(), null))
|
|
|
|
})
|
|
|
|
} else {
|
|
|
|
if (typeof expandFunc === 'function') {
|
|
|
|
dispatch(clearTimeline(timeline))
|
|
|
|
expandFunc()
|
2020-04-08 02:06:59 +01:00
|
|
|
} else {
|
2020-11-25 21:22:37 +00:00
|
|
|
if (timeline === 'home') {
|
|
|
|
dispatch(clearTimeline(timeline))
|
|
|
|
dispatch(expandHomeTimeline(optionalExpandArgs))
|
|
|
|
} else if (timeline === 'community') {
|
|
|
|
dispatch(clearTimeline(timeline))
|
|
|
|
dispatch(expandCommunityTimeline(optionalExpandArgs))
|
2020-04-08 02:06:59 +01:00
|
|
|
} else {
|
2020-11-25 21:22:37 +00:00
|
|
|
shouldDispatchDequeue = false
|
Added redux functionality for queueing/dequeueing timelines
using streaming.js, when a status comes in to the current page, it queues up using updateTimelineQueue action, it then goes to the reducer to add "queuedItems" to state (up to max:40) and to tally up all count in that timeilne state "totalQueuedItemsCount".
the dequeueTimeline action takes in a "timelineId", "expandFunc", and "optionalExpandArgs". when clicking on the "click to load more" it passes in the timelineId (e.g. "home", "community", etc.) and the "handleLoadMore" function from the timeline component. if within the range of the max: 40, it pushes them to the dom, if over the max: 40 it clears the timeline and refreshes the page/timeline to show the most recent 20 statuses. Then, it resets the "queuedItems" and "totalQueuedItemsCount" in timeline state.
if no expandFunc is added, and timeline is "home" or "community" it expands those timelines with "optionalExpandArgs". Otherwise, it queues up to any other timeline (e.g. "hashtags", etc.)
2019-07-11 17:09:41 +01:00
|
|
|
}
|
|
|
|
}
|
2020-11-25 21:22:37 +00:00
|
|
|
}
|
Added redux functionality for queueing/dequeueing timelines
using streaming.js, when a status comes in to the current page, it queues up using updateTimelineQueue action, it then goes to the reducer to add "queuedItems" to state (up to max:40) and to tally up all count in that timeilne state "totalQueuedItemsCount".
the dequeueTimeline action takes in a "timelineId", "expandFunc", and "optionalExpandArgs". when clicking on the "click to load more" it passes in the timelineId (e.g. "home", "community", etc.) and the "handleLoadMore" function from the timeline component. if within the range of the max: 40, it pushes them to the dom, if over the max: 40 it clears the timeline and refreshes the page/timeline to show the most recent 20 statuses. Then, it resets the "queuedItems" and "totalQueuedItemsCount" in timeline state.
if no expandFunc is added, and timeline is "home" or "community" it expands those timelines with "optionalExpandArgs". Otherwise, it queues up to any other timeline (e.g. "hashtags", etc.)
2019-07-11 17:09:41 +01:00
|
|
|
|
2020-11-25 21:22:37 +00:00
|
|
|
if (!shouldDispatchDequeue) return
|
Added redux functionality for queueing/dequeueing timelines
using streaming.js, when a status comes in to the current page, it queues up using updateTimelineQueue action, it then goes to the reducer to add "queuedItems" to state (up to max:40) and to tally up all count in that timeilne state "totalQueuedItemsCount".
the dequeueTimeline action takes in a "timelineId", "expandFunc", and "optionalExpandArgs". when clicking on the "click to load more" it passes in the timelineId (e.g. "home", "community", etc.) and the "handleLoadMore" function from the timeline component. if within the range of the max: 40, it pushes them to the dom, if over the max: 40 it clears the timeline and refreshes the page/timeline to show the most recent 20 statuses. Then, it resets the "queuedItems" and "totalQueuedItemsCount" in timeline state.
if no expandFunc is added, and timeline is "home" or "community" it expands those timelines with "optionalExpandArgs". Otherwise, it queues up to any other timeline (e.g. "hashtags", etc.)
2019-07-11 17:09:41 +01:00
|
|
|
|
2020-11-25 21:22:37 +00:00
|
|
|
dispatch({
|
|
|
|
type: TIMELINE_DEQUEUE,
|
|
|
|
timeline,
|
|
|
|
})
|
|
|
|
}
|
2019-07-02 08:10:25 +01:00
|
|
|
|
2020-11-25 21:22:37 +00:00
|
|
|
/**
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
export const deleteFromTimelines = (id) => (dispatch, getState) => {
|
|
|
|
const accountId = getState().getIn(['statuses', id, 'account'])
|
|
|
|
const references = getState().get('statuses').filter(status => status.get('reblog') === id).map(status => [status.get('id'), status.get('account')])
|
|
|
|
const reblogOf = getState().getIn(['statuses', id, 'reblog'], null)
|
|
|
|
|
|
|
|
dispatch({
|
|
|
|
type: TIMELINE_DELETE,
|
|
|
|
id,
|
|
|
|
accountId,
|
|
|
|
references,
|
|
|
|
reblogOf,
|
|
|
|
})
|
|
|
|
}
|
2019-07-02 08:10:25 +01:00
|
|
|
|
2020-11-25 21:22:37 +00:00
|
|
|
/**
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
export const clearTimeline = (timeline) => (dispatch) => {
|
|
|
|
dispatch({
|
|
|
|
type: TIMELINE_CLEAR,
|
|
|
|
timeline
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
export const expandTimeline = (timelineId, path, params = {}, done = noop) => (dispatch, getState) => {
|
2020-11-15 18:48:32 +00:00
|
|
|
const timeline = getState().getIn(['timelines', timelineId], ImmutableMap())
|
|
|
|
const isLoadingMore = !!params.max_id
|
2019-07-02 08:10:25 +01:00
|
|
|
|
2020-11-15 18:48:32 +00:00
|
|
|
if (!!timeline && (timeline.get('isLoading') || timeline.get('isError'))) {
|
|
|
|
done()
|
|
|
|
return
|
|
|
|
}
|
2019-07-02 08:10:25 +01:00
|
|
|
|
2020-11-15 18:48:32 +00:00
|
|
|
if (!params.max_id && !params.pinned && timeline.get('items', ImmutableList()).size > 0) {
|
|
|
|
params.since_id = timeline.getIn(['items', 0])
|
|
|
|
}
|
2019-07-02 08:10:25 +01:00
|
|
|
|
2020-11-15 18:48:32 +00:00
|
|
|
const isLoadingRecent = !!params.since_id
|
2019-07-02 08:10:25 +01:00
|
|
|
|
2020-11-15 18:48:32 +00:00
|
|
|
dispatch(expandTimelineRequest(timelineId, isLoadingMore))
|
2019-07-02 08:10:25 +01:00
|
|
|
|
2020-11-15 18:48:32 +00:00
|
|
|
api(getState).get(path, { params }).then((response) => {
|
|
|
|
const next = getLinks(response).refs.find(link => link.rel === 'next')
|
|
|
|
dispatch(importFetchedStatuses(response.data))
|
|
|
|
dispatch(expandTimelineSuccess(timelineId, response.data, next ? next.uri : null, response.code === 206, isLoadingRecent, isLoadingMore))
|
2020-12-23 04:43:31 +00:00
|
|
|
fetchStatusesAccountsRelationships(dispatch, response.data)
|
2020-11-15 18:48:32 +00:00
|
|
|
done()
|
|
|
|
}).catch((error) => {
|
|
|
|
dispatch(expandTimelineFail(timelineId, error, isLoadingMore))
|
|
|
|
done()
|
|
|
|
})
|
|
|
|
}
|
2019-07-02 08:10:25 +01:00
|
|
|
|
2020-11-25 21:22:37 +00:00
|
|
|
const expandTimelineRequest = (timeline, isLoadingMore) => ({
|
|
|
|
type: TIMELINE_EXPAND_REQUEST,
|
|
|
|
timeline,
|
|
|
|
skipLoading: !isLoadingMore,
|
|
|
|
})
|
|
|
|
|
|
|
|
const expandTimelineSuccess = (timeline, statuses, next, partial, isLoadingRecent, isLoadingMore) => ({
|
|
|
|
type: TIMELINE_EXPAND_SUCCESS,
|
|
|
|
timeline,
|
|
|
|
statuses,
|
|
|
|
next,
|
|
|
|
partial,
|
|
|
|
isLoadingRecent,
|
|
|
|
skipLoading: !isLoadingMore,
|
|
|
|
})
|
|
|
|
|
|
|
|
const expandTimelineFail = (timeline, error, isLoadingMore) => ({
|
|
|
|
type: TIMELINE_EXPAND_FAIL,
|
2020-12-08 04:39:13 +00:00
|
|
|
showToast: true,
|
2020-11-25 21:22:37 +00:00
|
|
|
timeline,
|
|
|
|
error,
|
|
|
|
skipLoading: !isLoadingMore,
|
|
|
|
})
|
|
|
|
|
|
|
|
/**
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
export const scrollTopTimeline = (timeline, top) => ({
|
|
|
|
type: TIMELINE_SCROLL_TOP,
|
|
|
|
timeline,
|
|
|
|
top,
|
|
|
|
})
|
|
|
|
|
|
|
|
/**
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
export const connectTimeline = (timeline) => ({
|
|
|
|
type: TIMELINE_CONNECT,
|
|
|
|
timeline,
|
|
|
|
})
|
|
|
|
|
|
|
|
/**
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
export const disconnectTimeline = (timeline) => ({
|
|
|
|
type: TIMELINE_DISCONNECT,
|
|
|
|
timeline,
|
|
|
|
})
|
|
|
|
|
|
|
|
/**
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
export const expandHomeTimeline = ({ maxId } = {}, done = noop) => {
|
|
|
|
return expandTimeline('home', '/api/v1/timelines/home', {
|
2019-07-02 08:10:25 +01:00
|
|
|
max_id: maxId,
|
2020-11-25 21:22:37 +00:00
|
|
|
}, done)
|
|
|
|
}
|
2019-07-02 08:10:25 +01:00
|
|
|
|
2020-11-25 21:22:37 +00:00
|
|
|
/**
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
export const expandExploreTimeline = ({ maxId, sortBy } = {}, done = noop) => {
|
|
|
|
return expandTimeline('explore', '/api/v1/timelines/explore', {
|
|
|
|
max_id: maxId,
|
|
|
|
sort_by: sortBy,
|
|
|
|
}, done)
|
|
|
|
}
|
2019-07-02 08:10:25 +01:00
|
|
|
|
2020-11-25 21:22:37 +00:00
|
|
|
/**
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
export const expandProTimeline = ({ maxId } = {}, done = noop) => {
|
|
|
|
return expandTimeline('pro', '/api/v1/timelines/pro', {
|
|
|
|
max_id: maxId,
|
|
|
|
}, done)
|
|
|
|
}
|
2019-07-02 08:10:25 +01:00
|
|
|
|
2020-11-25 21:22:37 +00:00
|
|
|
/**
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
export const expandCommunityTimeline = ({ maxId, onlyMedia } = {}, done = noop) => {
|
|
|
|
return expandTimeline(`community${onlyMedia ? ':media' : ''}`, '/api/v1/timelines/public', {
|
|
|
|
max_id: maxId,
|
|
|
|
only_media: !!onlyMedia,
|
|
|
|
}, done)
|
|
|
|
}
|
2019-07-17 23:59:50 +01:00
|
|
|
|
2020-11-25 21:22:37 +00:00
|
|
|
/**
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
export const expandAccountTimeline = (accountId, { maxId, withReplies, commentsOnly } = {}) => {
|
2020-12-23 04:52:59 +00:00
|
|
|
if (!accountId) return
|
|
|
|
|
2020-11-25 21:22:37 +00:00
|
|
|
let key = `account:${accountId}${withReplies ? ':with_replies' : ''}${commentsOnly ? ':comments_only' : ''}`
|
|
|
|
return expandTimeline(key, `/api/v1/accounts/${accountId}/statuses`, {
|
|
|
|
only_comments: commentsOnly,
|
|
|
|
exclude_replies: (!withReplies && !commentsOnly),
|
|
|
|
max_id: maxId,
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
export const expandAccountFeaturedTimeline = (accountId) => {
|
|
|
|
return expandTimeline(`account:${accountId}:pinned`, `/api/v1/accounts/${accountId}/statuses`, {
|
|
|
|
pinned: true,
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
export const expandAccountMediaTimeline = (accountId, { maxId, limit, mediaType } = {}) => {
|
|
|
|
return expandTimeline(`account:${accountId}:media`, `/api/v1/accounts/${accountId}/statuses`, {
|
|
|
|
max_id: maxId,
|
|
|
|
only_media: true,
|
|
|
|
limit: limit || 20,
|
|
|
|
media_type: mediaType
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
export const expandListTimeline = (id, { maxId } = {}, done = noop) => {
|
|
|
|
return expandTimeline(`list:${id}`, `/api/v1/timelines/list/${id}`, {
|
|
|
|
max_id: maxId,
|
|
|
|
}, done)
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
export const expandGroupTimeline = (id, { sortBy, maxId, onlyMedia } = {}, done = noop) => {
|
2020-12-22 20:47:02 +00:00
|
|
|
if (!id) return
|
|
|
|
|
2020-11-25 21:22:37 +00:00
|
|
|
return expandTimeline(`group:${id}`, `/api/v1/timelines/group/${id}`, {
|
|
|
|
sort_by: sortBy,
|
|
|
|
max_id: maxId,
|
|
|
|
only_media: onlyMedia
|
|
|
|
}, done)
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
export const expandGroupFeaturedTimeline = (groupId, done = noop) => {
|
|
|
|
return expandTimeline(`group:${groupId}:pinned`, `/api/v1/timelines/group_pins/${groupId}`, {}, done)
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
export const expandGroupCollectionTimeline = (collectionType, { sortBy, maxId } = {}, done = noop) => {
|
|
|
|
return expandTimeline(`group_collection:${collectionType}`, `/api/v1/timelines/group_collection/${collectionType}`, {
|
|
|
|
sort_by: sortBy,
|
|
|
|
max_id: maxId,
|
|
|
|
}, done)
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
export const expandLinkTimeline = (linkId, { maxId } = {}, done = noop) => {
|
|
|
|
return expandTimeline(`link:${linkId}`, `/api/v1/timelines/preview_card/${linkId}`, {
|
|
|
|
max_id: maxId,
|
|
|
|
}, done)
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
export const expandHashtagTimeline = (hashtag, { maxId, tags } = {}, done = noop) => {
|
|
|
|
return expandTimeline(`hashtag:${hashtag}`, `/api/v1/timelines/tag/${hashtag}`, {
|
|
|
|
max_id: maxId,
|
|
|
|
any: parseTags(tags, 'any'),
|
|
|
|
all: parseTags(tags, 'all'),
|
|
|
|
none: parseTags(tags, 'none'),
|
|
|
|
}, done)
|
|
|
|
}
|