8e9582d632
refs https://github.com/TryGhost/Ghost/issues/14101 - dropped usage of `<GhTrimFocusInput>` and `<GhTextInput>` in favor of native input elements for more explicit behaviour - switched `SignupController` to native class syntax - migrated to `@action` decorators and swapped all template action triggers to `{{on}}` and `{{fn}}`
108 lines
3.0 KiB
JavaScript
108 lines
3.0 KiB
JavaScript
import Controller from '@ember/controller';
|
|
import {action} from '@ember/object';
|
|
import {isArray as isEmberArray} from '@ember/array';
|
|
import {isVersionMismatchError} from 'ghost-admin/services/ajax';
|
|
import {inject as service} from '@ember/service';
|
|
import {task} from 'ember-concurrency';
|
|
import {tracked} from '@glimmer/tracking';
|
|
|
|
export default class SignupController extends Controller {
|
|
@service ajax;
|
|
@service config;
|
|
@service ghostPaths;
|
|
@service notifications;
|
|
@service session;
|
|
@service settings;
|
|
|
|
@tracked flowErrors = '';
|
|
|
|
get signupDetails() {
|
|
return this.model;
|
|
}
|
|
|
|
@action
|
|
validate(property) {
|
|
return this.signupDetails.validate({property});
|
|
}
|
|
|
|
@action
|
|
setSignupProperty(property, event) {
|
|
const value = event.target.value;
|
|
this.signupDetails[property] = value;
|
|
}
|
|
|
|
@action
|
|
trimSignupProperty(property, event) {
|
|
const value = event.target.value.trim();
|
|
this.signupDetails[property] = value;
|
|
}
|
|
|
|
@action
|
|
submit(event) {
|
|
event.preventDefault();
|
|
this.signupTask.perform();
|
|
}
|
|
|
|
@task({drop: true})
|
|
*signupTask() {
|
|
const setupProperties = ['name', 'email', 'password', 'token'];
|
|
|
|
this.flowErrors = '';
|
|
this.signupDetails.hasValidated.addObjects(setupProperties);
|
|
|
|
try {
|
|
yield this.signupDetails.validate();
|
|
yield this._completeInvitation();
|
|
|
|
try {
|
|
yield this._authenticateWithPassword();
|
|
} catch (error) {
|
|
this.notifications.showAPIError(error, {key: 'signup.complete'});
|
|
}
|
|
|
|
return true;
|
|
} catch (error) {
|
|
// ValidationEngine throws undefined
|
|
if (!error) {
|
|
this.flowErrors = 'Please fill out the form to complete your signup';
|
|
return false;
|
|
}
|
|
|
|
if (isEmberArray(error?.payload?.errors)) {
|
|
if (isVersionMismatchError(error)) {
|
|
this.notifications.showAPIError(error);
|
|
}
|
|
this.flowErrors = error.payload.errors[0].message;
|
|
} else {
|
|
this.notifications.showAPIError(error, {key: 'signup.complete'});
|
|
}
|
|
|
|
return false;
|
|
}
|
|
}
|
|
|
|
_completeInvitation() {
|
|
const authUrl = this.ghostPaths.url.api('authentication', 'invitation');
|
|
const signupDetails = this.signupDetails;
|
|
|
|
return this.ajax.post(authUrl, {
|
|
dataType: 'json',
|
|
data: {
|
|
invitation: [{
|
|
name: signupDetails.name,
|
|
email: signupDetails.email,
|
|
password: signupDetails.password,
|
|
token: signupDetails.token
|
|
}]
|
|
}
|
|
});
|
|
}
|
|
|
|
_authenticateWithPassword() {
|
|
const {email, password} = this.signupDetails;
|
|
|
|
return this.session
|
|
.authenticate('authenticator:cookie', email, password);
|
|
}
|
|
}
|