import { Component } from '../../../lib/vues6/vues6.js' import { auth_api } from '../../service/AuthApi.service.js' import { location_service } from '../../service/Location.service.js' import { message_service } from '../../service/Message.service.js' import { password_service } from '../../service/Password.service.js' const template = `
{{ error_message }}
{{ other_message }}
{{ t['login.need_account'] }} {{ t['login.forgot_password'] }}
` export default class AuthLoginForm extends Component { static get selector() { return 'coreid-login-form' } static get props() { return [ 'app_name', 'login_message', 'additional_params', 'no_session', 'registration_enabled', ] } static get template() { return template } constructor() { super() this.username = '' this.password = '' this.button_text = '' this.step_two = false this.btn_disabled = true this.loading = false this.error_message = '' this.other_message = '' this.allow_back = true this.auth_user = false this.t = {} } watch_username(new_username, old_username) { this.btn_disabled = !new_username } back_click() { if ( !this.allow_back ) return; this.step_two = false this.button_text = this.t['common.next'] } async vue_on_create() { const auth_user = await auth_api.get_authenticated_user() if ( auth_user ) { this.auth_user = true this.allow_back = false this.username = auth_user await this.step_click() } // Batch-load translations all at once to make fewer requests this.t = await T( 'common.continue', 'common.unknown_error', 'common.cancel', 'common.request', 'common.back', 'common.next', 'login.username', 'login.password', 'login.need_account', 'login.forgot_password', 'login.username_invalid', 'login.reset_password', 'login.reset_password_prompt', 'login.reset_password_success', 'login.success', 'login.get_started' ) this.button_text = this.t['common.next'] } async on_key_up(event) { if ( event.keyCode === 13 ) { // Enter was pressed event.preventDefault() event.stopPropagation() if ( !this.step_two && this.username ) return this.step_click(event) else if ( this.step_two && this.username && this.password ) return this.step_click(event) } } async step_click(event) { if ( !this.step_two ) { this.loading = true try { const is_valid = await auth_api.validate_username(this.username) if ( !is_valid ) { this.error_message = this.t['login.username_invalid'] } else { this.step_two = true this.button_text = this.t['common.continue'] this.error_message = '' this.$nextTick(() => { this.$refs.password_input.focus() }) } } catch (e) { this.error_message = this.t['common.unknown_error'] } this.loading = false } else { this.loading = true this.error_message = '' let attempt_vars = { username: this.username, password: this.password, create_session: !this.no_session, } if ( typeof this.additional_params === 'object' ) { attempt_vars = {...attempt_vars, ...this.additional_params} } const result = await auth_api.attempt(attempt_vars) if ( !result.success ) { this.error_message = result.message || this.t['common.unknown_error'] this.loading = false return } this.other_message = this.t['login.success'] await location_service.redirect(result.next, 1500) } } on_register_click() { this.loading = true this.other_message = this.t['login.get_started'] location_service.redirect('/auth/register', 1500) // TODO get this dynamically } async on_forgot_password() { console.log(message_service) await message_service.modal({ title: this.t['login.reset_password'], message: this.t['login.reset_password_prompt'], inputs: [ { type: 'email', name: 'email', placeholder: 'jdoe@contoso.com', }, ], buttons: [ { type: 'close', text: this.t['common.cancel'], }, { type: 'close', class: ['btn', 'btn-primary'], text: this.t['common.request'], on_click: async ($event, { email }) => { await password_service.request_reset(email) await message_service.alert({ type: 'success', message: this.t['login.reset_password_success'].replace('APP_NAME', this.app_name), }) }, }, ], }) } do_nothing() {} }