index.js 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. import { importAccounts } from '../accounts_typed';
  2. import { normalizeStatus, normalizePoll } from './normalizer';
  3. export const STATUS_IMPORT = 'STATUS_IMPORT';
  4. export const STATUSES_IMPORT = 'STATUSES_IMPORT';
  5. export const POLLS_IMPORT = 'POLLS_IMPORT';
  6. export const FILTERS_IMPORT = 'FILTERS_IMPORT';
  7. function pushUnique(array, object) {
  8. if (array.every(element => element.id !== object.id)) {
  9. array.push(object);
  10. }
  11. }
  12. export function importStatus(status) {
  13. return { type: STATUS_IMPORT, status };
  14. }
  15. export function importStatuses(statuses) {
  16. return { type: STATUSES_IMPORT, statuses };
  17. }
  18. export function importFilters(filters) {
  19. return { type: FILTERS_IMPORT, filters };
  20. }
  21. export function importPolls(polls) {
  22. return { type: POLLS_IMPORT, polls };
  23. }
  24. export function importFetchedAccount(account) {
  25. return importFetchedAccounts([account]);
  26. }
  27. export function importFetchedAccounts(accounts) {
  28. const normalAccounts = [];
  29. function processAccount(account) {
  30. pushUnique(normalAccounts, account);
  31. if (account.moved) {
  32. processAccount(account.moved);
  33. }
  34. }
  35. accounts.forEach(processAccount);
  36. return importAccounts({ accounts: normalAccounts });
  37. }
  38. export function importFetchedStatus(status) {
  39. return importFetchedStatuses([status]);
  40. }
  41. export function importFetchedStatuses(statuses) {
  42. return (dispatch, getState) => {
  43. const accounts = [];
  44. const normalStatuses = [];
  45. const polls = [];
  46. const filters = [];
  47. function processStatus(status) {
  48. pushUnique(normalStatuses, normalizeStatus(status, getState().getIn(['statuses', status.id])));
  49. pushUnique(accounts, status.account);
  50. if (status.filtered) {
  51. status.filtered.forEach(result => pushUnique(filters, result.filter));
  52. }
  53. if (status.reblog && status.reblog.id) {
  54. processStatus(status.reblog);
  55. }
  56. if (status.poll && status.poll.id) {
  57. pushUnique(polls, normalizePoll(status.poll, getState().getIn(['polls', status.poll.id])));
  58. }
  59. }
  60. statuses.forEach(processStatus);
  61. dispatch(importPolls(polls));
  62. dispatch(importFetchedAccounts(accounts));
  63. dispatch(importStatuses(normalStatuses));
  64. dispatch(importFilters(filters));
  65. };
  66. }
  67. export function importFetchedPoll(poll) {
  68. return (dispatch, getState) => {
  69. dispatch(importPolls([normalizePoll(poll, getState().getIn(['polls', poll.id]))]));
  70. };
  71. }