// License: LGPL-3.0-or-later import * as React from 'react'; import { observer, inject} from 'mobx-react'; import {InjectedIntlProps, injectIntl, FormattedMessage} from 'react-intl'; import {Field, FieldDefinition, Form, initializationDefinition} from "../../../../types/mobx-react-form"; import {Validations} from "../../lib/vjf_rules"; import {WebLoginModel, WebUserSignInOut} from "../../lib/api/sign_in"; import {HoudiniForm, StaticFormToErrorAndBackConverter} from "../../lib/houdini_form"; import {observable, action} from 'mobx' import {ApiManager} from "../../lib/api_manager"; import {BasicField} from "../common/fields"; import ProgressableButton from "../common/ProgressableButton"; export interface SessionLoginFormProps { buttonText:string buttonTextOnProgress:string ApiManager?: ApiManager } export const FieldDefinitions : Array = [ { name: 'email', label: 'email', type: 'text', validators: [Validations.isFilled] }, { name: 'password', label: 'password', type: 'password', validators: [Validations.isFilled] } ] export class SessionPageForm extends HoudiniForm { converter: StaticFormToErrorAndBackConverter constructor(definition: initializationDefinition, options?: any) { super(definition, options) this.converter = new StaticFormToErrorAndBackConverter(this.inputToForm) } signinApi: WebUserSignInOut options() { return { validateOnInit: true, validateOnChange: true, retrieveOnlyDirtyValues: true, retrieveOnlyEnabledFields: true } } inputToForm = { 'email': 'email', 'password': 'password' } hooks() { return { onSuccess: async (f:SessionPageForm) => { let input = this.converter.convertFormToObject(f) try{ let r = await this.signinApi.postLogin(input) window.location.reload() } catch(e){ if (e.error) { f.invalidate(e.error) } else { f.invalidate(e) } } } } } } class InnerSessionLoginForm extends React.Component { constructor(props: SessionLoginFormProps & InjectedIntlProps) { super(props) this.createForm(); } @action.bound createForm() { this.form = new SessionPageForm({fields: FieldDefinitions}) } @observable form: SessionPageForm render() { if(!this.form.signinApi){ this.form.signinApi = this.props.ApiManager.get(WebUserSignInOut) } let label: {[props:string]: string} = { 'email': "login.email", "password": 'login.password', } for (let key in label){ this.form.$(key).set('label', this.props.intl.formatMessage({id: label[key]})) } let errorDiv = !this.form.isValid ?
{(this.form as any).error}
: '' return
{errorDiv}
; } } export default injectIntl( inject('ApiManager') (observer( InnerSessionLoginForm) ) )