import React from 'react'; import PropTypes from 'prop-types'; import { shallowEqual, useSelector } from 'react-redux'; import { Field, reduxForm } from 'redux-form'; import { Trans, useTranslation } from 'react-i18next'; import { renderInputField, renderRadioField, renderSelectField, toNumber, } from '../../../../helpers/form'; import { validateBiggerOrEqualZeroValue, validateIpv4, validateIpv6, validateRequiredValue, } from '../../../../helpers/validators'; import { BLOCKING_MODES, FORM_NAME } from '../../../../helpers/constants'; const checkboxes = [ { name: 'edns_cs_enabled', placeholder: 'edns_enable', subtitle: 'edns_cs_desc', }, { name: 'dnssec_enabled', placeholder: 'dnssec_enable', subtitle: 'dnssec_enable_desc', }, { name: 'disable_ipv6', placeholder: 'disable_ipv6', subtitle: 'disable_ipv6_desc', }, ]; const customIps = [ { description: 'blocking_ipv4_desc', name: 'blocking_ipv4', validateIp: validateIpv4, }, { description: 'blocking_ipv6_desc', name: 'blocking_ipv6', validateIp: validateIpv6, }, ]; const getFields = (processing, t) => Object.values(BLOCKING_MODES) .map((mode) => ( <Field key={mode} name="blocking_mode" type="radio" component={renderRadioField} value={mode} placeholder={t(mode)} disabled={processing} /> )); const Form = ({ handleSubmit, submitting, invalid, processing, }) => { const { t } = useTranslation(); const { blocking_mode, } = useSelector((state) => state.form[FORM_NAME.BLOCKING_MODE].values ?? {}, shallowEqual); return <form onSubmit={handleSubmit}> <div className="row"> <div className="col-12 col-sm-6"> <div className="form__group form__group--settings"> <label htmlFor="ratelimit" className="form__label form__label--with-desc"> <Trans>rate_limit</Trans> </label> <div className="form__desc form__desc--top"> <Trans>rate_limit_desc</Trans> </div> <Field name="ratelimit" type="number" component={renderInputField} className="form-control" placeholder={t('form_enter_rate_limit')} normalize={toNumber} validate={[validateRequiredValue, validateBiggerOrEqualZeroValue]} /> </div> </div> {checkboxes.map(({ name, placeholder, subtitle }) => <div className="col-12" key={name}> <div className="form__group form__group--settings"> <Field name={name} type="checkbox" component={renderSelectField} placeholder={t(placeholder)} disabled={processing} subtitle={t(subtitle)} /> </div> </div>)} <div className="col-12"> <div className="form__group form__group--settings mb-4"> <label className="form__label form__label--with-desc"> <Trans>blocking_mode</Trans> </label> <div className="form__desc form__desc--top"> {Object.values(BLOCKING_MODES) .map((mode) => ( <li key={mode}> <Trans>{`blocking_mode_${mode}`}</Trans> </li> ))} </div> <div className="custom-controls-stacked"> {getFields(processing, t)} </div> </div> </div> {blocking_mode === BLOCKING_MODES.custom_ip && ( <> {customIps.map(({ description, name, validateIp, }) => <div className="col-12 col-sm-6" key={name}> <div className="form__group form__group--settings"> <label className="form__label form__label--with-desc" htmlFor={name}><Trans>{name}</Trans> </label> <div className="form__desc form__desc--top"> <Trans>{description}</Trans> </div> <Field name={name} component={renderInputField} className="form-control" placeholder={t('form_enter_ip')} validate={[validateIp, validateRequiredValue]} /> </div> </div>)} </> )} </div> <button type="submit" className="btn btn-success btn-standard btn-large" disabled={submitting || invalid || processing} > <Trans>save_btn</Trans> </button> </form>; }; Form.propTypes = { handleSubmit: PropTypes.func.isRequired, submitting: PropTypes.bool.isRequired, invalid: PropTypes.bool.isRequired, processing: PropTypes.bool.isRequired, }; export default reduxForm({ form: FORM_NAME.BLOCKING_MODE })(Form);