react-forms/src/Form.js

77 lines
1.9 KiB
JavaScript
Raw Normal View History

2019-03-01 14:58:41 +01:00
import React, {Component, useContext} from 'react';
2019-03-01 12:22:51 +01:00
import FormContext from './FormContext';
2019-03-01 13:07:16 +01:00
import {toast, ToastContainer} from 'react-toastify';
2019-03-01 14:55:16 +01:00
import FormTranslationContext, {FormTranslationConsumer} from './FormTranslationContext'
2019-03-01 12:22:51 +01:00
export default class Form extends Component
{
constructor(props) {
super(props)
this.state = {
data: props.data
}
this.displayError = true
this.handleError(props)
}
componentWillReceiveProps(props)
{
this.handleError(props)
this.setState({
data: props.data
})
}
handleError(props)
{
if (props.data && props.data.error && props.toast && this.displayError == true) {
2019-03-01 14:55:16 +01:00
const contextValue = useContext(FormTranslationContext);
toast.error(contextValue.renderText(props.data.error))
2019-03-01 12:22:51 +01:00
this.displayError = false
}
}
render()
{
return (
<FormContext.Provider value={this.state.data}>
<form onSubmit={this._onSubmit}>
{this.renderError()}
{this.props.children}
</form>
2019-03-01 13:07:16 +01:00
<ToastContainer />
2019-03-01 12:22:51 +01:00
</FormContext.Provider>
)
}
_onSubmit = (e) => {
e.preventDefault()
this.props.onSubmit()
this.displayError = true
return false;
}
renderError()
{
if (this.state.data && this.state.data.error && !this.props.toast)
{
return (
2019-03-01 14:55:16 +01:00
<FormTranslationConsumer>
{(translator) => (
<p className="alert alert-danger">{translator.renderText(this.state.data.error)}</p>
)}
</FormTranslationConsumer>
2019-03-01 12:22:51 +01:00
)
}
return null
}
}
Form.defaultProps = {
data: null,
toast: false,
onSubmit: () => {
console.log('[Form] submitted')
}
}