hummingbird-me/kitsu-web

View on GitHub
app/components/groups/dashboard/members/invite-list.js

Summary

Maintainability
A
1 hr
Test Coverage
F
0%
import Component from '@ember/component';
import { get, set, computed } from '@ember/object';
import { inject as service } from '@ember/service';
import { task, timeout } from 'ember-concurrency';
import { concat } from 'client/utils/computed-macros';
import errorMessages from 'client/utils/error-messages';
import Pagination from 'kitsu-shared/mixins/pagination';

export default Component.extend(Pagination, {
  algolia: service(),
  notify: service(),
  store: service(),
  invites: concat('getInvitesTask.last.value', 'paginatedRecords'),

  init() {
    this._super(...arguments);
    get(this, 'getInvitesTask').perform();
  },

  canInvite: computed('inviteUser', 'inviteUserTask.isIdle', function() {
    return get(this, 'inviteUser') && get(this, 'inviteUserTask.isIdle');
  }).readOnly(),

  getInvitesTask: task(function* () {
    return yield this.queryPaginated('group-invite', {
      filter: { group: get(this, 'group.id'), status: 'pending' },
      include: 'user'
    });
  }),

  searchUsersTask: task(function* (query) {
    yield timeout(250);
    const index = yield this.get('algolia.getIndex').perform('users');
    const response = yield index.search(query, {
      attributesToRetrieve: ['id', 'name'],
      attributesToHighlight: [],
      hitsPerPage: 10,
      responseFields: ['hits', 'hitsPerPage', 'nbHits', 'nbPages', 'offset', 'page'],
      removeStopWords: false,
      removeWordsIfNoResults: 'allOptional',
    });
    return response.hits || [];
  }).restartable(),

  inviteUserTask: task(function* () {
    const invitee = get(this, 'inviteUser');
    const user = yield get(this, 'store').findRecord('user', get(invitee, 'id'));
    const invite = get(this, 'store').createRecord('group-invite', {
      group: get(this, 'group'),
      sender: get(this, 'session.account'),
      user
    });
    yield invite.save().then(() => {
      set(this, 'inviteUser', null);
      get(this, 'paginatedRecords').addObject(invite);
    }).catch(error => {
      get(this, 'notify').error(errorMessages(error));
    });
  })
});