mirror of
https://github.com/TryGhost/Ghost.git
synced 2024-11-28 22:43:30 +03:00
cb59388c5b
no issue - adds `eslint-plugin-sort-imports-es6-autofix` dependency - implements ESLint's base `sort-imports` rule but has a distinction in that `import {foo} from 'bar';` is considered `multiple` rather than `single` - fixes ESLint's autofix behaviour so `eslint --fix` will actually fix the sort order - updates all unordered import rules by using `eslint --fix` With the increased number of `import` statements since Ember+ecosystem started moving towards es6 modules I've found it frustrating at times trying to search through randomly ordered import statements. Recently I've been sorting imports manually when I've added new code or touched old code so I thought I'd add an ESLint rule to codify it.
88 lines
3.4 KiB
JavaScript
88 lines
3.4 KiB
JavaScript
import Component from 'ember-component';
|
|
import computed from 'ember-computed';
|
|
import moment from 'moment';
|
|
import service from 'ember-service/inject';
|
|
import {isNotFoundError} from 'ember-ajax/errors';
|
|
|
|
export default Component.extend({
|
|
tagName: '',
|
|
|
|
invite: null,
|
|
isSending: false,
|
|
|
|
notifications: service(),
|
|
store: service(),
|
|
|
|
createdAt: computed('invite.createdAtUTC', function () {
|
|
let createdAtUTC = this.get('invite.createdAtUTC');
|
|
|
|
return createdAtUTC ? moment(createdAtUTC).fromNow() : '';
|
|
}),
|
|
|
|
expiresAt: computed('invite.expires', function () {
|
|
let expires = this.get('invite.expires');
|
|
|
|
return expires ? moment(expires).fromNow() : '';
|
|
}),
|
|
|
|
isExpired: computed('invite.expires', function () {
|
|
let expires = this.get('invite.expires');
|
|
let now = (new Date()).valueOf();
|
|
|
|
return expires < now;
|
|
}),
|
|
|
|
actions: {
|
|
resend() {
|
|
let invite = this.get('invite');
|
|
let notifications = this.get('notifications');
|
|
|
|
this.set('isSending', true);
|
|
invite.resend().then((result) => {
|
|
let notificationText = `Invitation resent! (${invite.get('email')})`;
|
|
|
|
// the server deletes the old record and creates a new one when
|
|
// resending so we need to update the store accordingly
|
|
invite.unloadRecord();
|
|
this.get('store').pushPayload('invite', result);
|
|
|
|
// If sending the invitation email fails, the API will still return a status of 201
|
|
// but the invite's status in the response object will be 'invited-pending'.
|
|
if (result.invites[0].status === 'invited-pending') {
|
|
notifications.showAlert('Invitation email was not sent. Please try resending.', {type: 'error', key: 'invite.resend.not-sent'});
|
|
} else {
|
|
notifications.showNotification(notificationText, {key: 'invite.resend.success'});
|
|
}
|
|
}).catch((error) => {
|
|
notifications.showAPIError(error, {key: 'invite.resend'});
|
|
}).finally(() => {
|
|
this.set('isSending', false);
|
|
});
|
|
},
|
|
|
|
revoke() {
|
|
let invite = this.get('invite');
|
|
let email = invite.get('email');
|
|
let notifications = this.get('notifications');
|
|
|
|
// reload the invite to get the most up-to-date information
|
|
invite.reload().then(() => {
|
|
invite.destroyRecord().then(() => {
|
|
let notificationText = `Invitation revoked. (${email})`;
|
|
notifications.showNotification(notificationText, {key: 'invite.revoke.success'});
|
|
}).catch((error) => {
|
|
notifications.showAPIError(error, {key: 'invite.revoke'});
|
|
});
|
|
}).catch((error) => {
|
|
if (isNotFoundError(error)) {
|
|
// if the invite no longer exists, then show a warning and reload the route
|
|
this.sendAction('reload');
|
|
notifications.showAlert('This invite has been revoked or a user has already accepted the invitation.', {type: 'error', delayed: true, key: 'invite.revoke.already-accepted'});
|
|
} else {
|
|
throw error;
|
|
}
|
|
});
|
|
}
|
|
}
|
|
});
|