import React, { useState } from 'react'; import { Button, HelperText, HelperTextItem, Icon, Label, LabelGroup, TextInputGroup, TextInputGroupMain, TextInputGroupUtilities, } from '@patternfly/react-core/dist/esm'; import { PlusCircleIcon, TimesIcon } from '@patternfly/react-icons'; import { UnknownAction } from 'redux'; import { StepValidation } from './utilities/useValidation'; import { useAppDispatch } from '../../store/hooks'; type LabelInputProps = { ariaLabel: string; placeholder: string; validator: (value: string) => boolean; requiredList?: string[] | undefined; requiredCategoryName?: string; list: string[] | undefined; item: string; addAction: (value: string) => UnknownAction; removeAction: (value: string) => UnknownAction; stepValidation: StepValidation; fieldName: string; }; const LabelInput = ({ ariaLabel, placeholder, validator, list, requiredList, requiredCategoryName, item, addAction, removeAction, stepValidation, fieldName, }: LabelInputProps) => { const dispatch = useAppDispatch(); const [inputValue, setInputValue] = useState(''); const [onStepInputErrorText, setOnStepInputErrorText] = useState(''); let [invalidImports, duplicateImports] = ['', '']; if (stepValidation.errors[fieldName]) { [invalidImports, duplicateImports] = stepValidation.errors[fieldName].split('|'); } const onTextInputChange = ( _event: React.FormEvent, value: string, ) => { setInputValue(value); setOnStepInputErrorText(''); }; const addItem = (value: string) => { if (list?.includes(value) || requiredList?.includes(value)) { setOnStepInputErrorText(`${item} already exists.`); return; } if (!validator(value)) { switch (fieldName) { case 'ports': setOnStepInputErrorText( 'Expected format: :. Example: 8080:tcp, ssh:tcp', ); break; case 'kernelAppend': setOnStepInputErrorText( 'Expected format: . Example: console=tty0', ); break; case 'kernelName': setOnStepInputErrorText( 'Expected format: . Example: kernel-5.14.0-284.11.1.el9_2.x86_64', ); break; case 'groups': setOnStepInputErrorText( 'Expected format: . Example: admin', ); break; case 'ntpServers': setOnStepInputErrorText( 'Expected format: . Example: time.redhat.com', ); break; case 'enabledSystemdServices': case 'disabledSystemdServices': case 'maskedSystemdServices': case 'disabledServices': case 'enabledServices': setOnStepInputErrorText( 'Expected format: . Example: sshd', ); break; default: setOnStepInputErrorText('Invalid format.'); } return; } dispatch(addAction(value)); setInputValue(''); setOnStepInputErrorText(''); }; const handleKeyDown = (e: React.KeyboardEvent, value: string) => { if (e.key === ' ' || e.key === 'Enter') { e.preventDefault(); addItem(value); } }; const handleAddItem = (e: React.MouseEvent, value: string) => { addItem(value); }; const handleRemoveItem = (e: React.MouseEvent, value: string) => { dispatch(removeAction(value)); }; const handleClear = () => { setInputValue(''); setOnStepInputErrorText(''); }; const errors = []; if (onStepInputErrorText) errors.push(onStepInputErrorText); if (invalidImports) errors.push(invalidImports); if (duplicateImports) errors.push(duplicateImports); return ( <> handleKeyDown(e, inputValue)} />