alexzherdev/foosballtracker

View on GitHub
src/js/stores/scoreStore.js

Summary

Maintainability
A
0 mins
Test Coverage
import { EventEmitter } from 'events';

import FTDispatcher from '../dispatchers/dispatcher';
import ScoreConstants from '../constants/scoreConstants';


const PAGE_SIZE = 10;

const CHANGE_EVENT = 'change';

const _store = {
  all: [],
  paginated: {
    lastPageLoaded: 0,
    pagesTotal: 0,
    scores: []
  }
};

let ScoreStore = Object.assign({}, EventEmitter.prototype, {
  get pageSize() {
    return PAGE_SIZE;
  },

  getAllScores() {
    return _store.all;
  },

  getLastPageNum() {
    return _store.paginated.lastPageLoaded;
  },

  hasMorePages() {
    return _store.paginated.lastPageLoaded < _store.paginated.pagesTotal;
  },

  getPaginated() {
    return _store.paginated.scores;
  },

  getLastPage() {
    const page = this.getLastPageNum();
    return _store.paginated.scores.slice((page - 1) * PAGE_SIZE, page * PAGE_SIZE);
  },

  addChangeListener(cb) {
    this.on(CHANGE_EVENT, cb);
  },

  removeChangeListener(cb) {
    this.removeListener(CHANGE_EVENT, cb);
  },

  emitChange() {
    this.emit(CHANGE_EVENT);
  }
});

let callback = ({ action: { actionType, data }}) => {
  switch (actionType) {
    case ScoreConstants.LOAD_SCORES_RESPONSE:
      _store.all.splice(0, _store.all.length, ...data.items);
      ScoreStore.emitChange();
      break;
    case ScoreConstants.CREATE_SCORE_RESPONSE:
      _store.paginated.scores.splice(0, 0, data);
      ScoreStore.emitChange();
      break;
    case ScoreConstants.LOAD_SCORE_PAGE_RESPONSE: {
      const pagination = data.pagination;
      _store.paginated.lastPageLoaded = pagination.page;
      _store.paginated.pagesTotal = pagination.pageCount;
      _store.paginated.scores.splice((pagination.page - 1) * pagination.pageSize, data.items.length, ...data.items);
      ScoreStore.emitChange();
      break;
    }
    case ScoreConstants.DELETE_SCORE_RESPONSE: {
      const index = _store.paginated.scores.findIndex((s) => s.id === data.id);
      _store.paginated.scores.splice(index, 1);
      ScoreStore.emitChange();
      break;
    }
  }
};
FTDispatcher.register(callback);

export default ScoreStore;