闭社主体 forked from https://github.com/tootsuite/mastodon
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.

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