mirror of
https://gitlab.com/Alamantus/Readlebee.git
synced 2025-06-13 04:46:39 +02:00
Set up front end create account form
This commit is contained in:
parent
040b967725
commit
73980aeb93
2 changed files with 170 additions and 12 deletions
|
@ -1,13 +1,112 @@
|
||||||
import { ViewController } from '../controller';
|
import { ViewController } from '../controller';
|
||||||
|
|
||||||
export class LoginController extends ViewController {
|
export class LoginController extends ViewController {
|
||||||
constructor(state, i18n) {
|
constructor(state, emit, i18n) {
|
||||||
// Super passes state, view name, and default state to ViewController,
|
// Super passes state, view name, and default state to ViewController,
|
||||||
// which stores state in this.appState and the view controller's state to this.state
|
// which stores state in this.appState and the view controller's state to this.state
|
||||||
super(state, i18n, 'login', {});
|
super(state, i18n, 'login', {
|
||||||
|
fieldValues: {
|
||||||
|
loginEmail: '',
|
||||||
|
loginPassword: '',
|
||||||
|
createEmail: '',
|
||||||
|
createUsername: '',
|
||||||
|
createDisplayName: '',
|
||||||
|
createPassword: '',
|
||||||
|
createConfirm: '',
|
||||||
|
},
|
||||||
|
loginError: '',
|
||||||
|
createError: '',
|
||||||
|
createMessage: '',
|
||||||
|
pageMessage: '',
|
||||||
|
isChecking: false,
|
||||||
|
});
|
||||||
|
|
||||||
|
this.emit = emit;
|
||||||
|
|
||||||
// If using controller methods in an input's onchange or onclick instance,
|
// If using controller methods in an input's onchange or onclick instance,
|
||||||
// either bind the class's 'this' instance to the method first...
|
// either bind the class's 'this' instance to the method first...
|
||||||
// or use `onclick=${() => controller.submit()}` to maintain the 'this' of the class instead.
|
// or use `onclick=${() => controller.submit()}` to maintain the 'this' of the class instead.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
clearCreateAccountForm () {
|
||||||
|
this.state.fieldValues.createEmail = '';
|
||||||
|
this.state.fieldValues.createUsername = '';
|
||||||
|
this.state.fieldValues.createDisplayName = '';
|
||||||
|
this.state.fieldValues.createPassword = '';
|
||||||
|
this.state.fieldValues.createConfirm = '';
|
||||||
|
|
||||||
|
this.emit('render');
|
||||||
|
}
|
||||||
|
|
||||||
|
validateCreateAccount () {
|
||||||
|
const { __ } = this.i18n;
|
||||||
|
this.state.createError = '';
|
||||||
|
this.state.isChecking = true;
|
||||||
|
|
||||||
|
this.emit('render', () => {
|
||||||
|
const {
|
||||||
|
createEmail,
|
||||||
|
createUsername,
|
||||||
|
createPassword,
|
||||||
|
createConfirm
|
||||||
|
} = this.state.fieldValues;
|
||||||
|
|
||||||
|
if ([
|
||||||
|
createEmail,
|
||||||
|
createUsername,
|
||||||
|
createPassword,
|
||||||
|
createConfirm,
|
||||||
|
].includes('')) {
|
||||||
|
this.state.createError = __('login.create_required_field_blank');
|
||||||
|
this.state.isChecking = false;
|
||||||
|
this.emit('render');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (createPassword !== createConfirm) {
|
||||||
|
this.state.createError = __('login.create_password_confirm_mismatch');
|
||||||
|
this.state.isChecking = false;
|
||||||
|
this.emit('render');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.createAccount();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
createAccount () {
|
||||||
|
const { __ } = this.i18n;
|
||||||
|
const {
|
||||||
|
createEmail,
|
||||||
|
createUsername,
|
||||||
|
createDisplayName,
|
||||||
|
createPassword
|
||||||
|
} = this.state.fieldValues;
|
||||||
|
|
||||||
|
fetch('/api/account/create', {
|
||||||
|
method: 'post',
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
},
|
||||||
|
body: JSON.stringify({
|
||||||
|
email: createEmail,
|
||||||
|
username: createUsername,
|
||||||
|
displayName: createDisplayName,
|
||||||
|
password: createPassword,
|
||||||
|
}),
|
||||||
|
}).then(response => response.json())
|
||||||
|
.then(response => {
|
||||||
|
if (response.error !== false) {
|
||||||
|
console.error(response);
|
||||||
|
this.state.createError = __(response.message);
|
||||||
|
this.state.isChecking = false;
|
||||||
|
this.emit('render');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.state.createMessage = __(response.message);
|
||||||
|
this.state.isChecking = false;
|
||||||
|
this.clearCreateAccountForm();
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -3,11 +3,17 @@ import html from 'choo/html';
|
||||||
import { LoginController } from './controller';
|
import { LoginController } from './controller';
|
||||||
|
|
||||||
export const loginView = (state, emit, i18n) => {
|
export const loginView = (state, emit, i18n) => {
|
||||||
const controller = new LoginController(state, i18n);
|
const controller = new LoginController(state, emit, i18n);
|
||||||
const { __ } = controller.i18n;
|
const { __ } = controller.i18n;
|
||||||
|
|
||||||
return html`<section>
|
return html`<section>
|
||||||
|
|
||||||
|
${
|
||||||
|
controller.state.pageMessage === ''
|
||||||
|
? null
|
||||||
|
: html`<div class="info card"><header>${controller.state.pageMessage}</header></div>`
|
||||||
|
}
|
||||||
|
|
||||||
<div class="flex one two-700">
|
<div class="flex one two-700">
|
||||||
<div>
|
<div>
|
||||||
<article class="card">
|
<article class="card">
|
||||||
|
@ -17,13 +23,32 @@ export const loginView = (state, emit, i18n) => {
|
||||||
<footer>
|
<footer>
|
||||||
<label>
|
<label>
|
||||||
<span>${__('login.email')}</span>
|
<span>${__('login.email')}</span>
|
||||||
<input type="email" name="email">
|
<input type="email" name="email"
|
||||||
|
value=${controller.state.fieldValues.loginEmail}
|
||||||
|
oninput=${e => controller.state.fieldValues.loginEmail = e.target.value.trim()}
|
||||||
|
>
|
||||||
</label>
|
</label>
|
||||||
<label>
|
<label>
|
||||||
<span>${__('login.password')}</span>
|
<span>${__('login.password')}</span>
|
||||||
<input type="password" name="password">
|
<input type="password" name="password"
|
||||||
|
value=${controller.state.fieldValues.loginPassword}
|
||||||
|
oninput=${e => controller.state.fieldValues.loginPassword = e.target.value}
|
||||||
|
>
|
||||||
</label>
|
</label>
|
||||||
<input type="submit" value="${__('login.login_button')}">
|
${
|
||||||
|
controller.state.loginError === ''
|
||||||
|
? null
|
||||||
|
: html`<div class="error card">${controller.state.loginError}</div>`
|
||||||
|
}
|
||||||
|
<button ${controller.state.isChecking ? 'disabled' : null}
|
||||||
|
onclick=${() => controller.validateLogin()}
|
||||||
|
>
|
||||||
|
${
|
||||||
|
controller.state.isChecking
|
||||||
|
? html`<span><i class="icon-loading"></i></span><span>Loading</span>`
|
||||||
|
: __('login.login_button')
|
||||||
|
}
|
||||||
|
</button>
|
||||||
</footer>
|
</footer>
|
||||||
</article>
|
</article>
|
||||||
</div>
|
</div>
|
||||||
|
@ -33,27 +58,61 @@ export const loginView = (state, emit, i18n) => {
|
||||||
<h3>${__('login.create_account')}</h3>
|
<h3>${__('login.create_account')}</h3>
|
||||||
</header>
|
</header>
|
||||||
<footer>
|
<footer>
|
||||||
|
${
|
||||||
|
controller.state.createMessage === ''
|
||||||
|
? null
|
||||||
|
: html`<div class="success card"><header>${controller.state.createMessage}</header></div>`
|
||||||
|
}
|
||||||
<label>
|
<label>
|
||||||
<span>${__('login.email')}</span>
|
<span>${__('login.email')}</span>
|
||||||
<input type="email" name="new_email">
|
<input type="email" name="new_email"
|
||||||
|
value=${controller.state.fieldValues.createEmail}
|
||||||
|
oninput=${e => controller.state.fieldValues.createEmail = e.target.value.trim()}
|
||||||
|
>
|
||||||
</label>
|
</label>
|
||||||
<label>
|
<label>
|
||||||
<span>${__('login.password')}</span>
|
<span>${__('login.password')}</span>
|
||||||
<input type="password" name="new_password">
|
<input type="password" name="new_password"
|
||||||
|
value=${controller.state.fieldValues.createPassword}
|
||||||
|
oninput=${e => controller.state.fieldValues.createPassword = e.target.value}
|
||||||
|
>
|
||||||
</label>
|
</label>
|
||||||
<label>
|
<label>
|
||||||
<span>${__('login.confirm_password')}</span>
|
<span>${__('login.confirm_password')}</span>
|
||||||
<input type="password" name="confirm_password">
|
<input type="password" name="confirm_password"
|
||||||
|
value=${controller.state.fieldValues.createConfirm}
|
||||||
|
oninput=${e => controller.state.fieldValues.createConfirm = e.target.value}
|
||||||
|
>
|
||||||
</label>
|
</label>
|
||||||
<label>
|
<label>
|
||||||
<span>${__('login.username')}</span>
|
<span>${__('login.username')}</span>
|
||||||
<input type="text" name="new_username">
|
<input type="text" name="new_username"
|
||||||
|
value=${controller.state.fieldValues.createUsername}
|
||||||
|
oninput=${e => controller.state.fieldValues.createUsername = e.target.value.trim()}
|
||||||
|
>
|
||||||
</label>
|
</label>
|
||||||
<label>
|
<label>
|
||||||
<span>${__('login.display_name')}</span>
|
<span>${__('login.display_name')}</span>
|
||||||
<input type="text" name="new_displayname">
|
<input type="text" name="new_displayname"
|
||||||
|
value=${controller.state.fieldValues.createDisplayName}
|
||||||
|
oninput=${e => controller.state.fieldValues.createDisplayName = e.target.value.trim()}
|
||||||
|
>
|
||||||
</label>
|
</label>
|
||||||
<input type="submit" class="success" value="${__('login.create_account_button')}">
|
${
|
||||||
|
controller.state.createError === ''
|
||||||
|
? null
|
||||||
|
: html`<div class="error card"><header>${controller.state.createError}</header></div>`
|
||||||
|
}
|
||||||
|
<button class="success"
|
||||||
|
${controller.state.isChecking ? 'disabled' : null}
|
||||||
|
onclick=${() => controller.validateCreateAccount()}
|
||||||
|
>
|
||||||
|
${
|
||||||
|
controller.state.isChecking
|
||||||
|
? html`<span><i class="icon-loading"></i></span><span>Loading</span>`
|
||||||
|
: __('login.create_account_button')
|
||||||
|
}
|
||||||
|
</button>
|
||||||
</footer>
|
</footer>
|
||||||
</article>
|
</article>
|
||||||
</div>
|
</div>
|
||||||
|
|
Loading…
Add table
Reference in a new issue