import React, { useState } from 'react'; import { connect, useSelector } from 'react-redux'; import { Field, FieldArray, reduxForm, formValueSelector, FormErrors } from 'redux-form'; import { Trans, withTranslation } from 'react-i18next'; import flow from 'lodash/flow'; import Select from 'react-select'; import i18n from '../../../i18n'; import Tabs from '../../ui/Tabs'; import Examples from '../Dns/Upstream/Examples'; import { ScheduleForm } from '../../Filters/Services/ScheduleForm'; import { toggleAllServices, trimLinesAndRemoveEmpty, captitalizeWords } from '../../../helpers/helpers'; import { toNumber, renderInputField, renderGroupField, CheckboxField, renderServiceField, renderTextareaField, } from '../../../helpers/form'; import { validateClientId, validateRequiredValue } from '../../../helpers/validators'; import { CLIENT_ID_LINK, FORM_NAME, UINT32_RANGE } from '../../../helpers/constants'; import './Service.css'; import { RootState } from '../../../initialState'; const settingsCheckboxes = [ { name: 'use_global_settings', placeholder: 'client_global_settings', }, { name: 'filtering_enabled', placeholder: 'block_domain_use_filters_and_hosts', }, { name: 'safebrowsing_enabled', placeholder: 'use_adguard_browsing_sec', }, { name: 'parental_enabled', placeholder: 'use_adguard_parental', }, ]; const logAndStatsCheckboxes = [ { name: 'ignore_querylog', placeholder: 'ignore_query_log', }, { name: 'ignore_statistics', placeholder: 'ignore_statistics', }, ]; const validate = (values: any): FormErrors => { const errors: { name?: string; ids?: string[]; } = {}; const { name, ids } = values; errors.name = validateRequiredValue(name); if (ids && ids.length) { const idArrayErrors: any = []; ids.forEach((id: any, idx: any) => { idArrayErrors[idx] = validateRequiredValue(id) || validateClientId(id); }); if (idArrayErrors.length) { errors.ids = idArrayErrors; } } // @ts-expect-error FIXME: ts migration return errors; }; const renderFieldsWrapper = (placeholder: any, buttonTitle: any) => function cell(row: any) { const { fields } = row; return (
{fields.map((ip: any, index: any) => (
fields.remove(index)} normalizeOnBlur={(data: any) => data.trim()} />
))}
); }; // Should create function outside of component to prevent component re-renders const renderFields = renderFieldsWrapper(i18n.t('form_enter_id'), i18n.t('form_add_id')); interface renderMultiselectProps { input: { name: string; value: string; checked: boolean; onChange: (...args: unknown[]) => unknown; onBlur: (...args: unknown[]) => unknown; }; placeholder?: string; options?: unknown[]; } const renderMultiselect = (props: renderMultiselectProps) => { const { input, placeholder, options } = props; return (