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.

112 lines
3.3 KiB

  1. import api, { getLinks } from '../api';
  2. import {
  3. importFetchedAccounts,
  4. importFetchedStatuses,
  5. importFetchedStatus,
  6. } from './importer';
  7. export const CONVERSATIONS_MOUNT = 'CONVERSATIONS_MOUNT';
  8. export const CONVERSATIONS_UNMOUNT = 'CONVERSATIONS_UNMOUNT';
  9. export const CONVERSATIONS_FETCH_REQUEST = 'CONVERSATIONS_FETCH_REQUEST';
  10. export const CONVERSATIONS_FETCH_SUCCESS = 'CONVERSATIONS_FETCH_SUCCESS';
  11. export const CONVERSATIONS_FETCH_FAIL = 'CONVERSATIONS_FETCH_FAIL';
  12. export const CONVERSATIONS_UPDATE = 'CONVERSATIONS_UPDATE';
  13. export const CONVERSATIONS_READ = 'CONVERSATIONS_READ';
  14. export const CONVERSATIONS_DELETE_REQUEST = 'CONVERSATIONS_DELETE_REQUEST';
  15. export const CONVERSATIONS_DELETE_SUCCESS = 'CONVERSATIONS_DELETE_SUCCESS';
  16. export const CONVERSATIONS_DELETE_FAIL = 'CONVERSATIONS_DELETE_FAIL';
  17. export const mountConversations = () => ({
  18. type: CONVERSATIONS_MOUNT,
  19. });
  20. export const unmountConversations = () => ({
  21. type: CONVERSATIONS_UNMOUNT,
  22. });
  23. export const markConversationRead = conversationId => (dispatch, getState) => {
  24. dispatch({
  25. type: CONVERSATIONS_READ,
  26. id: conversationId,
  27. });
  28. api(getState).post(`/api/v1/conversations/${conversationId}/read`);
  29. };
  30. export const expandConversations = ({ maxId } = {}) => (dispatch, getState) => {
  31. dispatch(expandConversationsRequest());
  32. const params = { max_id: maxId };
  33. if (!maxId) {
  34. params.since_id = getState().getIn(['conversations', 'items', 0, 'last_status']);
  35. }
  36. const isLoadingRecent = !!params.since_id;
  37. api(getState).get('/api/v1/conversations', { params })
  38. .then(response => {
  39. const next = getLinks(response).refs.find(link => link.rel === 'next');
  40. dispatch(importFetchedAccounts(response.data.reduce((aggr, item) => aggr.concat(item.accounts), [])));
  41. dispatch(importFetchedStatuses(response.data.map(item => item.last_status).filter(x => !!x)));
  42. dispatch(expandConversationsSuccess(response.data, next ? next.uri : null, isLoadingRecent));
  43. })
  44. .catch(err => dispatch(expandConversationsFail(err)));
  45. };
  46. export const expandConversationsRequest = () => ({
  47. type: CONVERSATIONS_FETCH_REQUEST,
  48. });
  49. export const expandConversationsSuccess = (conversations, next, isLoadingRecent) => ({
  50. type: CONVERSATIONS_FETCH_SUCCESS,
  51. conversations,
  52. next,
  53. isLoadingRecent,
  54. });
  55. export const expandConversationsFail = error => ({
  56. type: CONVERSATIONS_FETCH_FAIL,
  57. error,
  58. });
  59. export const updateConversations = conversation => dispatch => {
  60. dispatch(importFetchedAccounts(conversation.accounts));
  61. if (conversation.last_status) {
  62. dispatch(importFetchedStatus(conversation.last_status));
  63. }
  64. dispatch({
  65. type: CONVERSATIONS_UPDATE,
  66. conversation,
  67. });
  68. };
  69. export const deleteConversation = conversationId => (dispatch, getState) => {
  70. dispatch(deleteConversationRequest(conversationId));
  71. api(getState).delete(`/api/v1/conversations/${conversationId}`)
  72. .then(() => dispatch(deleteConversationSuccess(conversationId)))
  73. .catch(error => dispatch(deleteConversationFail(conversationId, error)));
  74. };
  75. export const deleteConversationRequest = id => ({
  76. type: CONVERSATIONS_DELETE_REQUEST,
  77. id,
  78. });
  79. export const deleteConversationSuccess = id => ({
  80. type: CONVERSATIONS_DELETE_SUCCESS,
  81. id,
  82. });
  83. export const deleteConversationFail = (id, error) => ({
  84. type: CONVERSATIONS_DELETE_FAIL,
  85. id,
  86. error,
  87. });