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.

76 lines
1.9 KiB

  1. import { putAccounts, putStatuses } from '../../storage/modifier';
  2. import { normalizeAccount, normalizeStatus } from './normalizer';
  3. export const ACCOUNT_IMPORT = 'ACCOUNT_IMPORT';
  4. export const ACCOUNTS_IMPORT = 'ACCOUNTS_IMPORT';
  5. export const STATUS_IMPORT = 'STATUS_IMPORT';
  6. export const STATUSES_IMPORT = 'STATUSES_IMPORT';
  7. function pushUnique(array, object) {
  8. if (array.every(element => element.id !== object.id)) {
  9. array.push(object);
  10. }
  11. }
  12. export function importAccount(account) {
  13. return { type: ACCOUNT_IMPORT, account };
  14. }
  15. export function importAccounts(accounts) {
  16. return { type: ACCOUNTS_IMPORT, accounts };
  17. }
  18. export function importStatus(status) {
  19. return { type: STATUS_IMPORT, status };
  20. }
  21. export function importStatuses(statuses) {
  22. return { type: STATUSES_IMPORT, statuses };
  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, normalizeAccount(account));
  31. if (account.moved) {
  32. processAccount(account.moved);
  33. }
  34. }
  35. accounts.forEach(processAccount);
  36. putAccounts(normalAccounts);
  37. return importAccounts(normalAccounts);
  38. }
  39. export function importFetchedStatus(status) {
  40. return importFetchedStatuses([status]);
  41. }
  42. export function importFetchedStatuses(statuses) {
  43. return (dispatch, getState) => {
  44. const accounts = [];
  45. const normalStatuses = [];
  46. function processStatus(status) {
  47. pushUnique(normalStatuses, normalizeStatus(status, getState().getIn(['statuses', status.id])));
  48. pushUnique(accounts, status.account);
  49. if (status.reblog && status.reblog.id) {
  50. processStatus(status.reblog);
  51. }
  52. }
  53. statuses.forEach(processStatus);
  54. putStatuses(normalStatuses);
  55. dispatch(importFetchedAccounts(accounts));
  56. dispatch(importStatuses(normalStatuses));
  57. };
  58. }