The code powering m.abunchtell.com https://m.abunchtell.com
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.
 
 
 
 

91 lines
2.2 KiB

  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. 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 importPolls(polls) {
  25. return { type: POLLS_IMPORT, polls };
  26. }
  27. export function importFetchedAccount(account) {
  28. return importFetchedAccounts([account]);
  29. }
  30. export function importFetchedAccounts(accounts) {
  31. const normalAccounts = [];
  32. function processAccount(account) {
  33. pushUnique(normalAccounts, normalizeAccount(account));
  34. if (account.moved) {
  35. processAccount(account.moved);
  36. }
  37. }
  38. accounts.forEach(processAccount);
  39. return importAccounts(normalAccounts);
  40. }
  41. export function importFetchedStatus(status) {
  42. return importFetchedStatuses([status]);
  43. }
  44. export function importFetchedStatuses(statuses) {
  45. return (dispatch, getState) => {
  46. const accounts = [];
  47. const normalStatuses = [];
  48. const polls = [];
  49. function processStatus(status) {
  50. pushUnique(normalStatuses, normalizeStatus(status, getState().getIn(['statuses', status.id])));
  51. pushUnique(accounts, status.account);
  52. if (status.reblog && status.reblog.id) {
  53. processStatus(status.reblog);
  54. }
  55. if (status.poll && status.poll.id) {
  56. pushUnique(polls, normalizePoll(status.poll));
  57. }
  58. }
  59. statuses.forEach(processStatus);
  60. dispatch(importPolls(polls));
  61. dispatch(importFetchedAccounts(accounts));
  62. dispatch(importStatuses(normalStatuses));
  63. };
  64. }
  65. export function importFetchedPoll(poll) {
  66. return dispatch => {
  67. dispatch(importPolls([normalizePoll(poll)]));
  68. };
  69. }