2019-07-02 08:10:25 +01:00
|
|
|
import { connectStream } from '../stream';
|
|
|
|
import {
|
|
|
|
deleteFromTimelines,
|
|
|
|
expandHomeTimeline,
|
|
|
|
connectTimeline,
|
|
|
|
disconnectTimeline,
|
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
|
|
|
updateTimelineQueue,
|
2019-07-02 08:10:25 +01:00
|
|
|
} from './timelines';
|
2019-07-11 05:02:18 +01:00
|
|
|
import { updateNotificationsQueue, expandNotifications } from './notifications';
|
2019-07-02 08:10:25 +01:00
|
|
|
import { updateConversations } from './conversations';
|
|
|
|
import { fetchFilters } from './filters';
|
|
|
|
import { getLocale } from '../locales';
|
2019-08-28 06:26:34 +01:00
|
|
|
import { handleComposeSubmit } from './compose';
|
2019-07-02 08:10:25 +01:00
|
|
|
|
|
|
|
const { messages } = getLocale();
|
|
|
|
|
|
|
|
export function connectTimelineStream (timelineId, path, pollingRefresh = null, accept = null) {
|
|
|
|
|
|
|
|
return connectStream (path, pollingRefresh, (dispatch, getState) => {
|
|
|
|
const locale = getState().getIn(['meta', 'locale']);
|
|
|
|
|
|
|
|
return {
|
|
|
|
onConnect() {
|
|
|
|
dispatch(connectTimeline(timelineId));
|
|
|
|
},
|
|
|
|
|
|
|
|
onDisconnect() {
|
|
|
|
dispatch(disconnectTimeline(timelineId));
|
|
|
|
},
|
|
|
|
|
|
|
|
onReceive (data) {
|
|
|
|
switch(data.event) {
|
|
|
|
case 'update':
|
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
|
|
|
dispatch(updateTimelineQueue(timelineId, JSON.parse(data.payload), accept));
|
2019-07-02 08:10:25 +01:00
|
|
|
break;
|
|
|
|
case 'delete':
|
|
|
|
dispatch(deleteFromTimelines(data.payload));
|
|
|
|
break;
|
|
|
|
case 'notification':
|
2019-07-11 05:02:18 +01:00
|
|
|
dispatch(updateNotificationsQueue(JSON.parse(data.payload), messages, locale, window.location.pathname));
|
2019-07-02 08:10:25 +01:00
|
|
|
break;
|
|
|
|
case 'conversation':
|
|
|
|
dispatch(updateConversations(JSON.parse(data.payload)));
|
|
|
|
break;
|
|
|
|
case 'filters_changed':
|
|
|
|
dispatch(fetchFilters());
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
},
|
|
|
|
};
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
const refreshHomeTimelineAndNotification = (dispatch, done) => {
|
|
|
|
dispatch(expandHomeTimeline({}, () => dispatch(expandNotifications({}, done))));
|
|
|
|
};
|
|
|
|
|
|
|
|
export const connectUserStream = () => connectTimelineStream('home', 'user', refreshHomeTimelineAndNotification);
|
|
|
|
export const connectCommunityStream = ({ onlyMedia } = {}) => connectTimelineStream(`community${onlyMedia ? ':media' : ''}`, `public:local${onlyMedia ? ':media' : ''}`);
|
|
|
|
export const connectPublicStream = ({ onlyMedia } = {}) => connectTimelineStream(`public${onlyMedia ? ':media' : ''}`, `public${onlyMedia ? ':media' : ''}`);
|
|
|
|
export const connectHashtagStream = (id, tag, accept) => connectTimelineStream(`hashtag:${id}`, `hashtag&tag=${tag}`, null, accept);
|
|
|
|
export const connectDirectStream = () => connectTimelineStream('direct', 'direct');
|
|
|
|
export const connectListStream = id => connectTimelineStream(`list:${id}`, `list&list=${id}`);
|
|
|
|
export const connectGroupStream = id => connectTimelineStream(`group:${id}`, `group&group=${id}`);
|
2019-08-28 06:26:34 +01:00
|
|
|
|
|
|
|
export const connectStatusUpdateStream = () => {
|
|
|
|
return connectStream('statuscard', null, (dispatch, getState) => {
|
|
|
|
return {
|
|
|
|
onConnect() {},
|
|
|
|
onDisconnect() {},
|
|
|
|
onReceive (data) {
|
|
|
|
if (!data['event'] || !data['payload']) return;
|
|
|
|
if (data.event === 'update') {
|
|
|
|
handleComposeSubmit(dispatch, getState, {data: JSON.parse(data.payload)}, null)
|
|
|
|
}
|
|
|
|
},
|
|
|
|
};
|
|
|
|
});
|
|
|
|
}
|