index.js 2.5 KB

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