loomio/loomio

View on GitHub
vue/src/shared/services/page_loader.js

Summary

Maintainability
A
0 mins
Test Coverage
import Records from '@/shared/services/records';
import utils         from '@/shared/record_store/utils';
import RestfulClient from '@/shared/record_store/restful_client';
import Vue from 'vue';
import {merge, orderBy, uniq, map } from 'lodash-es';

export default class PageLoader {
  constructor(opts) {
    this.remote = new RestfulClient;
    this.loading = false;
    this.params = opts.params;
    this.path = opts.path;
    this.per = opts.params.per;
    this.order = opts.order;
    this.total = 0;
    this.pageWindow = {};
    this.pageIds = {};
    this.err = null;
    this.status = null;
  }

  totalPages() {
    return Math.ceil(parseFloat(this.total) / parseFloat(this.params.per));
  }

  fetch(page) {
    this.loading = true;
    return this.remote.fetch({
      path: this.path,
      params: merge({from: ((page - 1) * this.per)}, this.params)}).then(json => {
      const data = utils.deserialize(json);
      this.total = data.meta.total;
      const firstId = data[data.meta.root][0][this.order];
      const lastId = data[data.meta.root][(data[data.meta.root].length - 1)][this.order];
      Vue.set(this.pageWindow, page, [lastId,firstId]);
      Vue.set(this.pageIds, page, map(data[data.meta.root], 'id'));
      // console.log 'page', page, 'discussions.length', data.discussions.length, 'first', firstId, 'last', lastId, 'groupIds!', orderBy uniq(map(data['discussions'], 'groupId'))
      return Records.importREADY(data);
    }).catch(err => {
      this.err = err;
      return this.status = err.status;
    }).finally(() => {
      return this.loading = false;
    });
  }
}