3 import { connectStream
} from '../stream';
11 import { updateNotifications
, expandNotifications
} from './notifications';
12 import { updateConversations
} from './conversations';
13 import { updateStatus
} from './statuses';
17 updateReaction as updateAnnouncementsReaction
,
19 } from './announcements';
20 import { fetchFilters
} from './filters';
21 import { getLocale
} from '../locales';
23 const { messages
} = getLocale();
29 const randomUpTo
= max
=>
30 Math
.floor(Math
.random() * Math
.floor(max
));
33 * @param {string} timelineId
34 * @param {string} channelName
35 * @param {Object.<string, string>} params
36 * @param {Object} options
37 * @param {function(Function, Function): void} [options.fallback]
38 * @param {function(object): boolean} [options.accept]
39 * @return {function(): void}
41 export const connectTimelineStream
= (timelineId
, channelName
, params
= {}, options
= {}) =>
42 connectStream(channelName
, params
, (dispatch
, getState
) => {
43 const locale
= getState().getIn(['meta', 'locale']);
48 * @param {function(Function, Function): void} fallback
50 const useFallback
= fallback
=> {
51 fallback(dispatch
, () => {
52 pollingId
= setTimeout(() => useFallback(fallback
), 20000 + randomUpTo(20000));
58 dispatch(connectTimeline(timelineId
));
61 clearTimeout(pollingId
);
67 dispatch(disconnectTimeline(timelineId
));
69 if (options
.fallback
) {
70 pollingId
= setTimeout(() => useFallback(options
.fallback
), randomUpTo(40000));
77 dispatch(updateTimeline(timelineId
, JSON
.parse(data
.payload
), options
.accept
));
80 dispatch(updateStatus(JSON
.parse(data
.payload
)));
83 dispatch(deleteFromTimelines(data
.payload
));
86 dispatch(updateNotifications(JSON
.parse(data
.payload
), messages
, locale
));
89 dispatch(updateConversations(JSON
.parse(data
.payload
)));
91 case 'filters_changed':
92 dispatch(fetchFilters());
95 dispatch(updateAnnouncements(JSON
.parse(data
.payload
)));
97 case 'announcement.reaction':
98 dispatch(updateAnnouncementsReaction(JSON
.parse(data
.payload
)));
100 case 'announcement.delete':
101 dispatch(deleteAnnouncement(data
.payload
));
109 * @param {Function} dispatch
110 * @param {function(): void} done
112 const refreshHomeTimelineAndNotification
= (dispatch
, done
) => {
113 dispatch(expandHomeTimeline({}, () =>
114 dispatch(expandNotifications({}, () =>
115 dispatch(fetchAnnouncements(done
))))));
119 * @return {function(): void}
121 export const connectUserStream
= () =>
122 connectTimelineStream('home', 'user', {}, { fallback: refreshHomeTimelineAndNotification
});
125 * @param {Object} options
126 * @param {boolean} [options.onlyMedia]
127 * @return {function(): void}
129 export const connectCommunityStream
= ({ onlyMedia
} = {}) =>
130 connectTimelineStream(`community${onlyMedia ? ':media' : ''}`, `public:local${onlyMedia ? ':media' : ''}`);
133 * @param {Object} options
134 * @param {boolean} [options.onlyMedia]
135 * @param {boolean} [options.onlyRemote]
136 * @return {function(): void}
138 export const connectPublicStream
= ({ onlyMedia
, onlyRemote
} = {}) =>
139 connectTimelineStream(`public${onlyRemote ? ':remote' : ''}${onlyMedia ? ':media' : ''}`, `public${onlyRemote ? ':remote' : ''}${onlyMedia ? ':media' : ''}`);
142 * @param {string} columnId
143 * @param {string} tagName
144 * @param {boolean} onlyLocal
145 * @param {function(object): boolean} accept
146 * @return {function(): void}
148 export const connectHashtagStream
= (columnId
, tagName
, onlyLocal
, accept
) =>
149 connectTimelineStream(`hashtag:${columnId}${onlyLocal ? ':local' : ''}`, `hashtag${onlyLocal ? ':local' : ''}`, { tag: tagName
}, { accept
});
152 * @return {function(): void}
154 export const connectDirectStream
= () =>
155 connectTimelineStream('direct', 'direct');
158 * @param {string} listId
159 * @return {function(): void}
161 export const connectListStream
= listId
=>
162 connectTimelineStream(`list:${listId}`, 'list', { list: listId
});