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.
 
 
 
 

181 lines
5.4 KiB

  1. import api from '../api';
  2. import { normalizeAnnouncement } from './importer/normalizer';
  3. export const ANNOUNCEMENTS_FETCH_REQUEST = 'ANNOUNCEMENTS_FETCH_REQUEST';
  4. export const ANNOUNCEMENTS_FETCH_SUCCESS = 'ANNOUNCEMENTS_FETCH_SUCCESS';
  5. export const ANNOUNCEMENTS_FETCH_FAIL = 'ANNOUNCEMENTS_FETCH_FAIL';
  6. export const ANNOUNCEMENTS_UPDATE = 'ANNOUNCEMENTS_UPDATE';
  7. export const ANNOUNCEMENTS_DELETE = 'ANNOUNCEMENTS_DELETE';
  8. export const ANNOUNCEMENTS_DISMISS_REQUEST = 'ANNOUNCEMENTS_DISMISS_REQUEST';
  9. export const ANNOUNCEMENTS_DISMISS_SUCCESS = 'ANNOUNCEMENTS_DISMISS_SUCCESS';
  10. export const ANNOUNCEMENTS_DISMISS_FAIL = 'ANNOUNCEMENTS_DISMISS_FAIL';
  11. export const ANNOUNCEMENTS_REACTION_ADD_REQUEST = 'ANNOUNCEMENTS_REACTION_ADD_REQUEST';
  12. export const ANNOUNCEMENTS_REACTION_ADD_SUCCESS = 'ANNOUNCEMENTS_REACTION_ADD_SUCCESS';
  13. export const ANNOUNCEMENTS_REACTION_ADD_FAIL = 'ANNOUNCEMENTS_REACTION_ADD_FAIL';
  14. export const ANNOUNCEMENTS_REACTION_REMOVE_REQUEST = 'ANNOUNCEMENTS_REACTION_REMOVE_REQUEST';
  15. export const ANNOUNCEMENTS_REACTION_REMOVE_SUCCESS = 'ANNOUNCEMENTS_REACTION_REMOVE_SUCCESS';
  16. export const ANNOUNCEMENTS_REACTION_REMOVE_FAIL = 'ANNOUNCEMENTS_REACTION_REMOVE_FAIL';
  17. export const ANNOUNCEMENTS_REACTION_UPDATE = 'ANNOUNCEMENTS_REACTION_UPDATE';
  18. export const ANNOUNCEMENTS_TOGGLE_SHOW = 'ANNOUNCEMENTS_TOGGLE_SHOW';
  19. const noOp = () => {};
  20. export const fetchAnnouncements = (done = noOp) => (dispatch, getState) => {
  21. dispatch(fetchAnnouncementsRequest());
  22. api(getState).get('/api/v1/announcements').then(response => {
  23. dispatch(fetchAnnouncementsSuccess(response.data.map(x => normalizeAnnouncement(x))));
  24. }).catch(error => {
  25. dispatch(fetchAnnouncementsFail(error));
  26. }).finally(() => {
  27. done();
  28. });
  29. };
  30. export const fetchAnnouncementsRequest = () => ({
  31. type: ANNOUNCEMENTS_FETCH_REQUEST,
  32. skipLoading: true,
  33. });
  34. export const fetchAnnouncementsSuccess = announcements => ({
  35. type: ANNOUNCEMENTS_FETCH_SUCCESS,
  36. announcements,
  37. skipLoading: true,
  38. });
  39. export const fetchAnnouncementsFail= error => ({
  40. type: ANNOUNCEMENTS_FETCH_FAIL,
  41. error,
  42. skipLoading: true,
  43. skipAlert: true,
  44. });
  45. export const updateAnnouncements = announcement => ({
  46. type: ANNOUNCEMENTS_UPDATE,
  47. announcement: normalizeAnnouncement(announcement),
  48. });
  49. export const dismissAnnouncement = announcementId => (dispatch, getState) => {
  50. dispatch(dismissAnnouncementRequest(announcementId));
  51. api(getState).post(`/api/v1/announcements/${announcementId}/dismiss`).then(() => {
  52. dispatch(dismissAnnouncementSuccess(announcementId));
  53. }).catch(error => {
  54. dispatch(dismissAnnouncementFail(announcementId, error));
  55. });
  56. };
  57. export const dismissAnnouncementRequest = announcementId => ({
  58. type: ANNOUNCEMENTS_DISMISS_REQUEST,
  59. id: announcementId,
  60. });
  61. export const dismissAnnouncementSuccess = announcementId => ({
  62. type: ANNOUNCEMENTS_DISMISS_SUCCESS,
  63. id: announcementId,
  64. });
  65. export const dismissAnnouncementFail = (announcementId, error) => ({
  66. type: ANNOUNCEMENTS_DISMISS_FAIL,
  67. id: announcementId,
  68. error,
  69. });
  70. export const addReaction = (announcementId, name) => (dispatch, getState) => {
  71. const announcement = getState().getIn(['announcements', 'items']).find(x => x.get('id') === announcementId);
  72. let alreadyAdded = false;
  73. if (announcement) {
  74. const reaction = announcement.get('reactions').find(x => x.get('name') === name);
  75. if (reaction && reaction.get('me')) {
  76. alreadyAdded = true;
  77. }
  78. }
  79. if (!alreadyAdded) {
  80. dispatch(addReactionRequest(announcementId, name, alreadyAdded));
  81. }
  82. api(getState).put(`/api/v1/announcements/${announcementId}/reactions/${name}`).then(() => {
  83. dispatch(addReactionSuccess(announcementId, name, alreadyAdded));
  84. }).catch(err => {
  85. if (!alreadyAdded) {
  86. dispatch(addReactionFail(announcementId, name, err));
  87. }
  88. });
  89. };
  90. export const addReactionRequest = (announcementId, name) => ({
  91. type: ANNOUNCEMENTS_REACTION_ADD_REQUEST,
  92. id: announcementId,
  93. name,
  94. skipLoading: true,
  95. });
  96. export const addReactionSuccess = (announcementId, name) => ({
  97. type: ANNOUNCEMENTS_REACTION_ADD_SUCCESS,
  98. id: announcementId,
  99. name,
  100. skipLoading: true,
  101. });
  102. export const addReactionFail = (announcementId, name, error) => ({
  103. type: ANNOUNCEMENTS_REACTION_ADD_FAIL,
  104. id: announcementId,
  105. name,
  106. error,
  107. skipLoading: true,
  108. });
  109. export const removeReaction = (announcementId, name) => (dispatch, getState) => {
  110. dispatch(removeReactionRequest(announcementId, name));
  111. api(getState).delete(`/api/v1/announcements/${announcementId}/reactions/${name}`).then(() => {
  112. dispatch(removeReactionSuccess(announcementId, name));
  113. }).catch(err => {
  114. dispatch(removeReactionFail(announcementId, name, err));
  115. });
  116. };
  117. export const removeReactionRequest = (announcementId, name) => ({
  118. type: ANNOUNCEMENTS_REACTION_REMOVE_REQUEST,
  119. id: announcementId,
  120. name,
  121. skipLoading: true,
  122. });
  123. export const removeReactionSuccess = (announcementId, name) => ({
  124. type: ANNOUNCEMENTS_REACTION_REMOVE_SUCCESS,
  125. id: announcementId,
  126. name,
  127. skipLoading: true,
  128. });
  129. export const removeReactionFail = (announcementId, name, error) => ({
  130. type: ANNOUNCEMENTS_REACTION_REMOVE_FAIL,
  131. id: announcementId,
  132. name,
  133. error,
  134. skipLoading: true,
  135. });
  136. export const updateReaction = reaction => ({
  137. type: ANNOUNCEMENTS_REACTION_UPDATE,
  138. reaction,
  139. });
  140. export const toggleShowAnnouncements = () => ({
  141. type: ANNOUNCEMENTS_TOGGLE_SHOW,
  142. });
  143. export const deleteAnnouncement = id => ({
  144. type: ANNOUNCEMENTS_DELETE,
  145. id,
  146. });