123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165 |
- import React from 'react';
- import { required } from 'misago/utils/validators';
- import snackbar from 'misago/services/snackbar'; // jshint ignore:line
- let validateRequired = required();
- export default class extends React.Component {
- validate() {
- let errors = {};
- if (!this.state.validators) {
- return errors;
- }
- let validators = {
- required: this.state.validators.required || this.state.validators,
- optional: this.state.validators.optional || {}
- };
- let validatedFields = [];
- // add required fields to validation
- for (let name in validators.required) {
- if (validators.required.hasOwnProperty(name) &&
- validators.required[name]) {
- validatedFields.push(name);
- }
- }
- // add optional fields to validation
- for (let name in validators.optional) {
- if (validators.optional.hasOwnProperty(name) &&
- validators.optional[name]) {
- validatedFields.push(name);
- }
- }
- // validate fields values
- for (let i in validatedFields) {
- let name = validatedFields[i];
- let fieldErrors = this.validateField(name, this.state[name]);
- if (fieldErrors === null) {
- errors[name] = null;
- } else if (fieldErrors) {
- errors[name] = fieldErrors;
- }
- }
- return errors;
- }
- isValid() {
- let errors = this.validate();
- for (let field in errors) {
- if (errors.hasOwnProperty(field)) {
- if (errors[field] !== null) {
- return false;
- }
- }
- }
- return true;
- }
- validateField(name, value) {
- let errors = [];
- if (!this.state.validators) {
- return errors;
- }
- let validators = {
- required: (this.state.validators.required || this.state.validators)[name],
- optional: (this.state.validators.optional || {})[name]
- };
- let requiredError = validateRequired(value) || false;
- if (validators.required) {
- if (requiredError) {
- errors = [requiredError];
- } else {
- for (let i in validators.required) {
- let validationError = validators.required[i](value);
- if (validationError) {
- errors.push(validationError);
- }
- }
- }
- return errors.length ? errors : null;
- } else if (requiredError === false && validators.optional) {
- for (let i in validators.optional) {
- let validationError = validators.optional[i](value);
- if (validationError) {
- errors.push(validationError);
- }
- }
- return errors.length ? errors : null;
- }
- return false; // false === field wasn't validated
- }
- /* jshint ignore:start */
- bindInput = (name) => {
- return (event) => {
- this.changeValue(name, event.target.value);
- }
- };
- changeValue = (name, value) => {
- let newState = {
- [name]: value
- };
- const formErrors = this.state.errors || {};
- formErrors[name] = this.validateField(name, newState[name]);
- newState.errors = formErrors;
- this.setState(newState);
- };
- clean() {
- return true;
- }
- send() {
- return null;
- }
- handleSuccess(success) {
- return;
- }
- handleError(rejection) {
- snackbar.apiError(rejection);
- }
- handleSubmit = (event) => {
- // we don't reload page on submissions
- event.preventDefault()
- if (this.state.isLoading) {
- return;
- }
- if (this.clean()) {
- this.setState({isLoading: true});
- let promise = this.send();
- if (promise) {
- promise.then((success) => {
- this.setState({isLoading: false});
- this.handleSuccess(success);
- }, (rejection) => {
- this.setState({isLoading: false});
- this.handleError(rejection);
- });
- } else {
- this.setState({isLoading: false});
- }
- }
- };
- /* jshint ignore:end */
- }
|