Ghost/ghost/admin/app/controllers/signup.js
Kevin Ansfield 8e9582d632 Migrated signup screen to Octane patterns
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}}`
2022-05-27 13:28:29 +01:00

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);
}
}