text: import ModalComponent from 'ghost-admin/components/modal-base';
  import {action} from '@ember/object';
  import {inject as service} from '@ember/service';
  import {task} from 'ember-concurrency';
  
  export default ModalComponent.extend({
      session: service(),
      store: service(),
  
      errorMessage: null,
      paidMemberCount: null,
      freeMemberCount: null,
  
      // Allowed actions
      confirm: () => {},
  
      countPaidMembers: action(function () {
          // TODO: remove editor conditional once editors can query member counts
          if (['free', 'paid'].includes(this.model.sendEmailWhenPublished) && !this.session.get('user.isEditor')) {
              this.countPaidMembersTask.perform();
          }
      }),
  
      countPaidMembersTask: task(function* () {
          const result = yield this.store.query('member', {filter: 'subscribed:true+status:paid', limit: 1, page: 1});
          this.set('paidMemberCount', result.meta.pagination.total);
          const freeMemberCount = this.model.memberCount - result.meta.pagination.total;
          this.set('freeMemberCount', freeMemberCount);
      }),
  
      confirmAndCheckErrorTask: task(function* () {
          try {
              yield this.confirm();
              this.closeModal();
              return true;
          } catch (e) {
              // switch to "failed" state if email fails
              if (e && e.name === 'EmailFailedError') {
                  this.set('errorMessage', e.message);
                  return;
              }
  
              // close modal and continue with normal error handling if it was
              // a non-email-related error
              this.closeModal();
              if (e) {
                  throw e;
              }
          }
      }),
  
      retryEmailTask: task(function* () {
          try {
              yield this.model.retryEmailSend();
              this.closeModal();
              return true;
          } catch (e) {
              // update "failed" state if email fails again
              if (e && e.name === 'EmailFailedError') {
                  this.set('errorMessage', e.message);
                  return;
              }
  
              // TODO: test a non-email failure - maybe this needs to go through
              // the notifications service
              if (e) {
                  throw e;
              }
          }
      })
  });
  