All files / src/list ListActions.js

2.44% Statements 1/41
0% Branches 0/8
0% Functions 0/16
2.5% Lines 1/40
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85      8x                                                                                                                                                                  
import _ from 'lodash'
import { LIST } from '../constants'
 
const { SET_OPTIONS, PAGE, FIRST, NEXT, LAST, PREV, SET_PARAMS } = LIST
export default class ListActions {
  constructor(listName, listSelectors, model, modelActions) {
    this.modelActions = modelActions
    this.listSelectors = listSelectors
    this.listName = listName
    this.modelName = model.modelName
  }
 
  setOptions({ headers, params, pageSize, offset }) {
    const payload = _.omitBy({ headers, params, pageSize, offset, listName: this.listName, modelName: this.modelName }, _.isNil)
    return { type: SET_OPTIONS, payload }
  }
 
  setParams(params) {
    const payload = _.omitBy({ ...params, listName: this.listName, modelName: this.modelName }, _.isNil)
    return { type: SET_PARAMS, payload }
  }
 
  _page(page, dispatch, state) {
    dispatch({ type: PAGE, payload: { page, listName: this.listName, modelName: this.modelName } })
    const listObj = this.listSelectors.getListObj(state)
    const { where, include } = listObj.params
    const filter = _.omitBy({ where, limit: listObj.pageSize, skip: page * listObj.pageSize, include }, _.isNil)
 
    dispatch(this.modelActions.find(filter, this.listName))
    dispatch(this.modelActions.count(where, this.listName))
  }
 
  page(page) {
    return (dispatch, getState) => this._page(page, dispatch, getState())
  }
 
  next() {
    return (dispatch, getState) => {
      let hasNext = this.listSelectors.hasNext(getState())
      if (hasNext) {
        const currentPage = this.listSelectors.getCurrentPage(getState())
        return this._page(currentPage + 1, dispatch, getState())
      }
    }
  }
 
  prev() {
    return (dispatch, getState) => {
      let hasPrev = this.listSelectors.hasPrev(getState())
      if (hasPrev) {
        const currentPage = this.listSelectors.getCurrentPage(getState())
        return this._page(currentPage - 1, dispatch, getState())
      }
    }
  }
 
  refresh() {
    return (dispatch, getState) => {
      const currentPage = this.listSelectors.getCurrentPage(getState())
      return this._page(currentPage, dispatch, getState())
    }
  }
 
  first() {
    return (dispatch, getState) => {
      let hasPrev = this.listSelectors.hasPrev(getState())
      if (hasPrev) {
        return this._page(0, dispatch, getState())
      }
    }
  }
 
  last() {
    return (dispatch, getState) => {
      const state = getState()
      let hasNext = this.listSelectors.hasNext(state)
      if (hasNext) {
        const pageSize = this.listSelectors.getListObj(state).pageSize
        const total = this.listSelectors.getTotal(state)
        return this._page(Math.floor(total / pageSize), dispatch, state)
      }
    }
  }
}