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 = `
`
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() {}
}