Home Reference Source

application/redux/actions/entry-actions.js

  1. import BaseService from './../../services/base-service';
  2.  
  3. class EntryService extends BaseService {
  4.  
  5. fetch(opts) {
  6. return this.get('/v3/entry', opts);
  7. }
  8.  
  9. fetchOne(id) {
  10. return this.get('/v3/entry/' + id);
  11. }
  12.  
  13. create(data) {
  14. return this.post('/v3/entry', data);
  15. }
  16.  
  17. update(id, data) {
  18. return this.put('/v3/entry/' + id, data);
  19. }
  20.  
  21. remove(uuid) {
  22. return this.delete('/v3/entry/' + uuid);
  23. }
  24. }
  25.  
  26. const service = new EntryService;
  27.  
  28. /**
  29. * Action types
  30. */
  31. export const ENTRIES_REQUEST = 'ENTRIES_REQUEST';
  32. export const ENTRIES_RECEIVE = 'ENTRIES_RECEIVE';
  33. export const ENTRY_RECEIVE = 'ENTRY_RECEIVE';
  34. export const ENTRY_SELECTED = 'ENTRY_SELECTED';
  35. export const ENTRIES_INVALIDATE = 'ENTRIES_INVALIDATE';
  36.  
  37. export const ENTRIES_RECEIVE_PAGINATION = 'ENTRIES_RECEIVE_PAGINATION';
  38.  
  39. /**
  40. * Action creators
  41. */
  42. export function entriesReceivePagination(pagination) {
  43. return {
  44. type: ENTRIES_RECEIVE_PAGINATION,
  45. payload: {
  46. before: pagination.get('before'),
  47. current: pagination.get('current'),
  48. first: pagination.get('first'),
  49. last: pagination.get('last'),
  50. limit: pagination.get('limit'),
  51. next: pagination.get('next'),
  52. total_items: pagination.get('total_items'),
  53. total_pages: pagination.get('total_pages'),
  54. }
  55. };
  56. }
  57.  
  58. export function entriesRequest(params = {}) {
  59. return {
  60. type: ENTRIES_REQUEST,
  61. payload: {
  62. params: params
  63. }
  64. };
  65. }
  66.  
  67. export function entriesReceive(items) {
  68.  
  69. return {
  70. type: ENTRIES_RECEIVE,
  71. payload: {
  72. entries: items ? items : []
  73. }
  74. };
  75. }
  76.  
  77. export function entryReceive(entry) {
  78. return {
  79. type: ENTRY_RECEIVE,
  80. payload: {
  81. entry: entry ? entry : {}
  82. }
  83. };
  84. }
  85.  
  86. export function entrySetSelected(entry) {
  87. return {
  88. type: ENTRY_SELECTED,
  89. payload: {
  90. selected: entry ? entry : false
  91. }
  92. };
  93. }
  94.  
  95. export function entriesInvalidate() {
  96. return {
  97. type: ENTRIES_INVALIDATE,
  98. payload: {
  99. }
  100. };
  101. }
  102.  
  103. export function entryUpdate(id, data) {
  104. return function(dispatch, getState) {
  105. dispatch(entriesRequest({}));
  106.  
  107. return service.update(id, data)
  108. .then(response => {
  109. return dispatch(entryReceive(response.first()));
  110. });
  111. }
  112. }
  113.  
  114. export function entryCreate(data) {
  115. return function(dispatch, getState) {
  116. dispatch(entriesRequest({}));
  117.  
  118. return service.create(data)
  119. .then(response => {
  120. dispatch(entrySetSelected(response.first().get('uuid')));
  121. return dispatch(entryReceive(response.first()));
  122. });
  123. }
  124. }
  125.  
  126. export function entriesShouldFetch(state) {
  127. const entries = state.entries;
  128. if (!entries.items.length) {
  129. return true;
  130. } else if (entries.isFetching) {
  131. return false;
  132. }
  133.  
  134. return entries.didInvalidate;
  135. }
  136.  
  137. export function entriesMaybeFetch(params = {}) {
  138. return function(dispatch, getState) {
  139. const entries = getState().entries.items;
  140.  
  141. if (getState().entries.isFetching) {
  142. return Promise.resolve();
  143. }
  144.  
  145. if (!entries.items || !entries.items.size) {
  146. return dispatch(entriesFetch(params));
  147. }
  148.  
  149. return Promise.resolve();
  150. }
  151. };
  152.  
  153. export function entriesFetch(params = {}) {
  154. return function(dispatch, getState) {
  155. dispatch(entriesRequest(params));
  156.  
  157. params.per_page = params.per_page ? params.per_page : 20;
  158. params.order = params.order ? params.order : "title";
  159. params.dir = params.dir ? params.dir : "asc";
  160.  
  161. // default page
  162. let page = 0;
  163.  
  164. if (params.page) {
  165. // specific page is requested
  166. page = params.page;
  167. } else if (getState().entries.pagination.current) {
  168. // existing pagination
  169. page = getState().entries.pagination.current;
  170. }
  171.  
  172. if (page) {
  173. params.page = page;
  174. }
  175.  
  176. return service.fetch(params)
  177. .then(response => {
  178. dispatch(entriesReceivePagination(response));
  179. return dispatch(entriesReceive(response.get('items')));
  180. });
  181. };
  182. }
  183.  
  184. export function entriesFetchNoSideEffect(params = {}) {
  185.  
  186. const baseParams = {
  187. per_page: 20,
  188. page: 1,
  189. order: 'title',
  190. dir: 'asc'
  191. };
  192. const myParams = Object.assign(baseParams, params);
  193.  
  194. return service.fetch(myParams)
  195. .then(response => {
  196. return response.get('items');
  197. });
  198. }
  199.  
  200. export function entriesFetchOne(id) {
  201. return function (dispatch, getState) {
  202. dispatch(entriesRequest({}));
  203.  
  204. return service.fetchOne(id)
  205. .then(response => {
  206. return dispatch(entryReceive(response.first()));
  207. });
  208. }
  209. }
  210.  
  211. export function entriesRemove(uuid) {
  212. return function (dispatch, getState) {
  213. dispatch(entriesInvalidate());
  214.  
  215. return service.remove(uuid);
  216. }
  217. }