Home Reference Source

application/redux/actions/issue-actions.js

  1. import BaseService from './../../services/base-service';
  2.  
  3. class IssueService extends BaseService {
  4.  
  5. fetch(opts) {
  6. return this.get('/v3/issue', opts);
  7. }
  8.  
  9. fetchOne(id) {
  10. return this.get('/v3/issue/' + id);
  11. }
  12.  
  13. create(data) {
  14. return this.post('/v3/issue', data);
  15. }
  16.  
  17. update(id, data) {
  18. return this.put('/v3/issue/' + id, data);
  19. }
  20.  
  21. remove(id) {
  22. return this.delete('/v3/issue/' + id);
  23. }
  24. }
  25.  
  26. const service = new IssueService;
  27.  
  28. /**
  29. * Action types
  30. */
  31. export const ISSUES_REQUEST = 'ISSUES_REQUEST';
  32. export const ISSUES_RECEIVE = 'ISSUES_RECEIVE';
  33. export const ISSUE_RECEIVE = 'ISSUE_RECEIVE';
  34. export const ISSUE_SELECTED = 'ISSUE_SELECTED';
  35. export const ISSUES_INVALIDATE = 'ISSUES_INVALIDATE';
  36.  
  37. export const ISSUES_FILTER_OPEN = 'ISSUES_FILTER_OPEN';
  38. export const ISSUES_RECEIVE_PAGINATION = 'ISSUES_RECEIVE_PAGINATION';
  39.  
  40. /**
  41. * Action creators
  42. */
  43. export function issuesReceivePagination(pagination) {
  44. return {
  45. type: ISSUES_RECEIVE_PAGINATION,
  46. payload: {
  47. before: pagination.get('before'),
  48. current: pagination.get('current'),
  49. first: pagination.get('first'),
  50. last: pagination.get('last'),
  51. limit: pagination.get('limit'),
  52. next: pagination.get('next'),
  53. total_items: pagination.get('total_items'),
  54. total_pages: pagination.get('total_pages'),
  55. }
  56. };
  57. }
  58.  
  59. export function issuesRequest(params = {}) {
  60. return {
  61. type: ISSUES_REQUEST,
  62. payload: {
  63. params: params
  64. }
  65. };
  66. }
  67.  
  68. export function issuesFilterOpen() {
  69. return {
  70. type: ISSUES_FILTER_OPEN,
  71. payload: {}
  72. }
  73. }
  74.  
  75. export function issuesReceive(items) {
  76.  
  77. return {
  78. type: ISSUES_RECEIVE,
  79. payload: {
  80. issues: items ? items : []
  81. }
  82. };
  83. }
  84.  
  85. export function issueReceive(item) {
  86. return {
  87. type: ISSUE_RECEIVE,
  88. payload: {
  89. issue: item ? item : {}
  90. }
  91. };
  92. }
  93.  
  94. export function issueSetSelected(issue) {
  95. return {
  96. type: ISSUE_SELECTED,
  97. payload: {
  98. selected: issue ? issue : false
  99. }
  100. };
  101. }
  102.  
  103. export function issuesInvalidate() {
  104. return {
  105. type: ISSUES_INVALIDATE,
  106. payload: {
  107. }
  108. };
  109. }
  110.  
  111. export function issuesFilterWebOnly() {
  112. return {
  113. type: ISSUES_FILTER_WEBONLY,
  114. payload: {
  115. }
  116. }
  117. }
  118. export function issuesFilterPrintOnly() {
  119. return {
  120. type: ISSUES_FILTER_PRINTONLY,
  121. payload: {
  122. }
  123. }
  124. }
  125.  
  126. export function issuesShouldFetch(state) {
  127. const issues = state.issues;
  128. if (!issues.items.length) {
  129. return true;
  130. } else if (issues.isFetching) {
  131. return false;
  132. }
  133.  
  134. return issues.didInvalidate;
  135. }
  136.  
  137. export function issuesMaybeFetch(params = {}) {
  138. return function(dispatch, getState) {
  139. const issues = getState().issues;
  140.  
  141. if (!issues.items || !issues.items.size) {
  142. return dispatch(issuesFetch(params));
  143. }
  144.  
  145. return Promise.resolve();
  146. }
  147. };
  148.  
  149. export function issuesFetch(params = {}) {
  150. return function(dispatch, getState) {
  151. dispatch(issuesRequest(params));
  152.  
  153. params.per_page = params.per_page ? params.per_page : 100;
  154. params.order = params.order ? params.order : "published_at";
  155. params.dir = params.dir ? params.dir : "desc";
  156. params.include_archived = params.include_archived ? params.include_archived : 0;
  157.  
  158. return service.fetch(params)
  159. .then(response => {
  160. dispatch(issuesReceivePagination(response));
  161. return dispatch(issuesReceive(response.get('items')));
  162. });
  163. };
  164. }
  165.  
  166. export function issuesFetchOne(id) {
  167. return function (dispatch, getState) {
  168. dispatch(issuesRequest({}));
  169.  
  170. return service.fetchOne(id)
  171. .then(response => {
  172. return dispatch(issueReceive(response.first()));
  173. });
  174. };
  175. }
  176.  
  177. export function issueCreate(issue = {}) {
  178. return function(dispatch, getState) {
  179. return service.create(issue)
  180. .then(response => {
  181. return dispatch(issueReceive(response.first()));
  182. });
  183. }
  184. }
  185.  
  186. export function issueUpdate(id, issue = {}) {
  187. return function(dispatch, getState) {
  188. return service.update(id, issue)
  189. .then(response => {
  190. return dispatch(issueReceive(response.first()));
  191. });
  192. }
  193. }
  194.  
  195. export function issuesRemove(uuids) {
  196. return function(dispatch, getState) {
  197. dispatch(issuesInvalidate());
  198.  
  199. return service.remove(uuids);
  200. }
  201. }