You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

79 lines
3.0 KiB

  1. import { connectStream } from '../stream';
  2. import {
  3. updateTimeline,
  4. deleteFromTimelines,
  5. expandHomeTimeline,
  6. connectTimeline,
  7. disconnectTimeline,
  8. } from './timelines';
  9. import { updateNotifications, expandNotifications } from './notifications';
  10. import { updateConversations } from './conversations';
  11. import {
  12. fetchAnnouncements,
  13. updateAnnouncements,
  14. updateReaction as updateAnnouncementsReaction,
  15. deleteAnnouncement,
  16. } from './announcements';
  17. import { fetchFilters } from './filters';
  18. import { getLocale } from '../locales';
  19. const { messages } = getLocale();
  20. export function connectTimelineStream (timelineId, path, pollingRefresh = null, accept = null) {
  21. return connectStream (path, pollingRefresh, (dispatch, getState) => {
  22. const locale = getState().getIn(['meta', 'locale']);
  23. return {
  24. onConnect() {
  25. dispatch(connectTimeline(timelineId));
  26. },
  27. onDisconnect() {
  28. dispatch(disconnectTimeline(timelineId));
  29. },
  30. onReceive (data) {
  31. switch(data.event) {
  32. case 'update':
  33. dispatch(updateTimeline(timelineId, JSON.parse(data.payload), accept));
  34. break;
  35. case 'delete':
  36. dispatch(deleteFromTimelines(data.payload));
  37. break;
  38. case 'notification':
  39. dispatch(updateNotifications(JSON.parse(data.payload), messages, locale));
  40. break;
  41. case 'conversation':
  42. dispatch(updateConversations(JSON.parse(data.payload)));
  43. break;
  44. case 'filters_changed':
  45. dispatch(fetchFilters());
  46. break;
  47. case 'announcement':
  48. dispatch(updateAnnouncements(JSON.parse(data.payload)));
  49. break;
  50. case 'announcement.reaction':
  51. dispatch(updateAnnouncementsReaction(JSON.parse(data.payload)));
  52. break;
  53. case 'announcement.delete':
  54. dispatch(deleteAnnouncement(data.payload));
  55. break;
  56. }
  57. },
  58. };
  59. });
  60. }
  61. const refreshHomeTimelineAndNotification = (dispatch, done) => {
  62. dispatch(expandHomeTimeline({}, () =>
  63. dispatch(expandNotifications({}, () =>
  64. dispatch(fetchAnnouncements(done))))));
  65. };
  66. export const connectUserStream = () => connectTimelineStream('home', 'user', refreshHomeTimelineAndNotification);
  67. export const connectCommunityStream = ({ onlyMedia } = {}) => connectTimelineStream(`community${onlyMedia ? ':media' : ''}`, `public:local${onlyMedia ? ':media' : ''}`);
  68. export const connectPublicStream = ({ onlyMedia, onlyRemote } = {}) => connectTimelineStream(`public${onlyRemote ? ':remote' : ''}${onlyMedia ? ':media' : ''}`, `public${onlyRemote ? ':remote' : ''}${onlyMedia ? ':media' : ''}`);
  69. export const connectHashtagStream = (id, tag, local, accept) => connectTimelineStream(`hashtag:${id}${local ? ':local' : ''}`, `hashtag${local ? ':local' : ''}&tag=${tag}`, null, accept);
  70. export const connectDirectStream = () => connectTimelineStream('direct', 'direct');
  71. export const connectListStream = id => connectTimelineStream(`list:${id}`, `list&list=${id}`);