import React, { useRef } from 'react'; import { useDispatch, useSelector } from 'react-redux'; import { Field, reduxForm } from 'redux-form'; import { Trans, useTranslation } from 'react-i18next'; import classnames from 'classnames'; import Examples from './Examples'; import { renderRadioField, renderTextareaField, CheckboxField } from '../../../../helpers/form'; import { DNS_REQUEST_OPTIONS, FORM_NAME, UPSTREAM_CONFIGURATION_WIKI_LINK } from '../../../../helpers/constants'; import { testUpstreamWithFormValues } from '../../../../actions'; import { removeEmptyLines, trimLinesAndRemoveEmpty } from '../../../../helpers/helpers'; import { getTextareaCommentsHighlight, syncScroll } from '../../../../helpers/highlightTextareaComments'; import '../../../ui/texareaCommentsHighlight.css'; import { RootState } from '../../../../initialState'; const UPSTREAM_DNS_NAME = 'upstream_dns'; const UPSTREAM_MODE_NAME = 'upstream_mode'; interface renderFieldProps { name: string; component: any; type: string; className?: string; placeholder: string; subtitle?: string; value?: string; normalizeOnBlur?: (...args: unknown[]) => unknown; containerClass?: string; onScroll?: (...args: unknown[]) => unknown; } const renderField = ({ name, component, type, className, placeholder, subtitle, value, normalizeOnBlur, containerClass, onScroll, }: renderFieldProps) => { const { t } = useTranslation(); const processingTestUpstream = useSelector((state: RootState) => state.settings.processingTestUpstream); const processingSetConfig = useSelector((state: RootState) => state.dnsConfig.processingSetConfig); return (
); }; interface renderTextareaWithHighlightFieldProps { className: string; disabled?: boolean; id: string; input?: object; meta?: object; normalizeOnBlur?: (...args: unknown[]) => unknown; onScroll?: (...args: unknown[]) => unknown; placeholder: string; type: string; } const renderTextareaWithHighlightField = (props: renderTextareaWithHighlightFieldProps) => { const upstream_dns = useSelector((store: RootState) => store.form[FORM_NAME.UPSTREAM].values.upstream_dns); const upstream_dns_file = useSelector((state: RootState) => state.dnsConfig.upstream_dns_file); const ref = useRef(null); const onScroll = (e: any) => syncScroll(e, ref); return ( <> {renderTextareaField({ ...props, disabled: !!upstream_dns_file, onScroll, normalizeOnBlur: trimLinesAndRemoveEmpty, })} {getTextareaCommentsHighlight(ref, upstream_dns)} ); }; const INPUT_FIELDS = [ { name: UPSTREAM_MODE_NAME, type: 'radio', value: DNS_REQUEST_OPTIONS.LOAD_BALANCING, component: renderRadioField, subtitle: 'load_balancing_desc', placeholder: 'load_balancing', }, { name: UPSTREAM_MODE_NAME, type: 'radio', value: DNS_REQUEST_OPTIONS.PARALLEL, component: renderRadioField, subtitle: 'upstream_parallel', placeholder: 'parallel_requests', }, { name: UPSTREAM_MODE_NAME, type: 'radio', value: DNS_REQUEST_OPTIONS.FASTEST_ADDR, component: renderRadioField, subtitle: 'fastest_addr_desc', placeholder: 'fastest_addr', }, ]; interface FormProps { handleSubmit?: (...args: unknown[]) => string; submitting?: boolean; invalid?: boolean; initialValues?: object; upstream_dns?: string; fallback_dns?: string; bootstrap_dns?: string; } const Form = ({ submitting, invalid, handleSubmit }: FormProps) => { const dispatch = useDispatch(); const { t } = useTranslation(); const upstream_dns = useSelector((store: RootState) => store.form[FORM_NAME.UPSTREAM].values.upstream_dns); const processingTestUpstream = useSelector((state: RootState) => state.settings.processingTestUpstream); const processingSetConfig = useSelector((state: RootState) => state.dnsConfig.processingSetConfig); const defaultLocalPtrUpstreams = useSelector((state: RootState) => state.dnsConfig.default_local_ptr_upstreams); const handleUpstreamTest = () => dispatch(testUpstreamWithFormValues()); const testButtonClass = classnames('btn btn-primary btn-standard mr-2', { 'btn-loading': processingTestUpstream, }); const components = { a: , }; return (
, ]}> dns_providers
{INPUT_FIELDS.map(renderField)}

fallback_dns_desc

bootstrap_dns_desc

local_ptr_desc
{/** TODO: Add internazionalization for "" */} {defaultLocalPtrUpstreams?.length > 0 ? ( `"${s}"`).join(', ') }}> local_ptr_default_resolver ) : ( local_ptr_no_default_resolver )}

); }; export default reduxForm({ form: FORM_NAME.UPSTREAM })(Form);