import classnames from 'classnames'; import React, { useRef } from 'react'; import { Controller, useForm } from 'react-hook-form'; import { Trans, useTranslation } from 'react-i18next'; import { useDispatch, useSelector } from 'react-redux'; import { testUpstreamWithFormValues } from '../../../../actions'; import { DNS_REQUEST_OPTIONS, UPSTREAM_CONFIGURATION_WIKI_LINK } from '../../../../helpers/constants'; import { removeEmptyLines } from '../../../../helpers/helpers'; import { getTextareaCommentsHighlight, syncScroll } from '../../../../helpers/highlightTextareaComments'; import { RootState } from '../../../../initialState'; import '../../../ui/texareaCommentsHighlight.css'; import Examples from './Examples'; const UPSTREAM_DNS_NAME = 'upstream_dns'; const UPSTREAM_MODE_NAME = 'upstream_mode'; type FormData = { upstream_dns: string; upstream_mode: string; fallback_dns: string; bootstrap_dns: string; local_ptr_upstreams: string; use_private_ptr_resolvers: boolean; resolve_clients: boolean; } type FormProps = { initialValues?: Partial; onSubmit: (data: FormData) => void; } const INPUT_FIELDS = [ { name: UPSTREAM_MODE_NAME, value: DNS_REQUEST_OPTIONS.LOAD_BALANCING, subtitle: 'load_balancing_desc', placeholder: 'load_balancing', }, { name: UPSTREAM_MODE_NAME, value: DNS_REQUEST_OPTIONS.PARALLEL, subtitle: 'upstream_parallel', placeholder: 'parallel_requests', }, { name: UPSTREAM_MODE_NAME, value: DNS_REQUEST_OPTIONS.FASTEST_ADDR, subtitle: 'fastest_addr_desc', placeholder: 'fastest_addr', }, ]; const Form = ({ initialValues, onSubmit }: FormProps) => { const { t } = useTranslation(); const dispatch = useDispatch(); const textareaRef = useRef(null); const { control, handleSubmit, watch, formState: { isSubmitting, isDirty }, } = useForm({ mode: 'onChange', defaultValues: { upstream_dns: initialValues?.upstream_dns || '', upstream_mode: initialValues?.upstream_mode || DNS_REQUEST_OPTIONS.LOAD_BALANCING, fallback_dns: initialValues?.fallback_dns || '', bootstrap_dns: initialValues?.bootstrap_dns || '', local_ptr_upstreams: initialValues?.local_ptr_upstreams || '', use_private_ptr_resolvers: initialValues?.use_private_ptr_resolvers || false, resolve_clients: initialValues?.resolve_clients || false, }, }); const upstream_dns = watch('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 upstream_dns_file = useSelector((state: RootState) => state.dnsConfig.upstream_dns_file); const handleUpstreamTest = () => { const formValues = { bootstrap_dns: watch('bootstrap_dns'), upstream_dns: watch('upstream_dns'), local_ptr_upstreams: watch('local_ptr_upstreams'), fallback_dns: watch('fallback_dns'), }; dispatch(testUpstreamWithFormValues(formValues)); }; const testButtonClass = classnames('btn btn-primary btn-standard mr-2', { 'btn-loading': processingTestUpstream, }); return (
( <>