This commit splits the HookValidatedInput component into three separate functions to improve modularity and readability:
- `getValidationState`: Calculates the validation state ('default', 'success', 'error') based on whether the input is pristine and if there is an error message.
- `ValidatedInputAndTextArea`: Renders the TextInput or TextArea component, utilizing the `getValidationState` output.
- `ErrorMessage`: Displays validation error messages.
This refactoring enhances code maintainability and testability, and the updated structure is now implemented for the username field.
142 lines
4.4 KiB
TypeScript
142 lines
4.4 KiB
TypeScript
import React from 'react';
|
|
|
|
import { Button, FormGroup, Checkbox, Tooltip } from '@patternfly/react-core';
|
|
import { ExternalLinkAltIcon, TrashIcon } from '@patternfly/react-icons';
|
|
|
|
import { GENERATING_SSH_KEY_PAIRS_URL } from '../../../../../constants';
|
|
import { useAppDispatch, useAppSelector } from '../../../../../store/hooks';
|
|
import {
|
|
selectUserAdministrator,
|
|
selectUserNameByIndex,
|
|
selectUserPasswordByIndex,
|
|
selectUserSshKeyByIndex,
|
|
setUserNameByIndex,
|
|
setUserPasswordByIndex,
|
|
setUserSshKeyByIndex,
|
|
setUserAdministratorByIndex,
|
|
removeUser,
|
|
} from '../../../../../store/wizardSlice';
|
|
import { useUsersValidation } from '../../../utilities/useValidation';
|
|
import {
|
|
HookPasswordValidatedInput,
|
|
HookValidatedInput,
|
|
ValidatedInputAndTextArea,
|
|
} from '../../../ValidatedInput';
|
|
const UserInfo = () => {
|
|
const dispatch = useAppDispatch();
|
|
const index = 0;
|
|
const userNameSelector = selectUserNameByIndex(index);
|
|
const userName = useAppSelector(userNameSelector);
|
|
const userPasswordSelector = selectUserPasswordByIndex(index);
|
|
const userPassword = useAppSelector(userPasswordSelector);
|
|
const userSshKeySelector = selectUserSshKeyByIndex(index);
|
|
const userSshKey = useAppSelector(userSshKeySelector);
|
|
const userIsAdministratorSelector = selectUserAdministrator(index);
|
|
const userIsAdministrator = useAppSelector(userIsAdministratorSelector);
|
|
|
|
const handleNameChange = (
|
|
_e: React.FormEvent<HTMLInputElement | HTMLTextAreaElement>,
|
|
value: string
|
|
) => {
|
|
dispatch(setUserNameByIndex({ index: index, name: value }));
|
|
};
|
|
|
|
const handlePasswordChange = (
|
|
_event: React.FormEvent<HTMLInputElement | HTMLTextAreaElement>,
|
|
value: string
|
|
) => {
|
|
dispatch(setUserPasswordByIndex({ index: index, password: value }));
|
|
};
|
|
|
|
const handleSshKeyChange = (
|
|
_event: React.FormEvent<HTMLInputElement | HTMLTextAreaElement>,
|
|
value: string
|
|
) => {
|
|
dispatch(setUserSshKeyByIndex({ index: index, sshKey: value }));
|
|
};
|
|
|
|
const stepValidation = useUsersValidation();
|
|
|
|
const handleCheckboxChange = (
|
|
_event: React.FormEvent<HTMLInputElement>,
|
|
value: boolean
|
|
) => {
|
|
dispatch(
|
|
setUserAdministratorByIndex({ index: index, isAdministrator: value })
|
|
);
|
|
};
|
|
|
|
const onRemoveUserClick = () => {
|
|
dispatch(removeUser(index));
|
|
};
|
|
|
|
return (
|
|
<>
|
|
<FormGroup isRequired label="Username">
|
|
<ValidatedInputAndTextArea
|
|
ariaLabel="blueprint user name"
|
|
value={userName || ''}
|
|
placeholder="Enter username"
|
|
onChange={(_e, value) => handleNameChange(_e, value)}
|
|
stepValidation={stepValidation}
|
|
fieldName="userName"
|
|
/>
|
|
</FormGroup>
|
|
<FormGroup isRequired label="Password">
|
|
<HookPasswordValidatedInput
|
|
ariaLabel="blueprint user password"
|
|
value={userPassword || ''}
|
|
onChange={(_e, value) => handlePasswordChange(_e, value)}
|
|
placeholder="Enter password"
|
|
stepValidation={stepValidation}
|
|
fieldName="userPassword"
|
|
/>
|
|
</FormGroup>
|
|
<FormGroup isRequired label="SSH key">
|
|
<HookValidatedInput
|
|
inputType={'textArea'}
|
|
ariaLabel="public SSH key"
|
|
value={userSshKey || ''}
|
|
type={'text'}
|
|
onChange={(_e, value) => handleSshKeyChange(_e, value)}
|
|
placeholder="Paste your public SSH key"
|
|
stepValidation={stepValidation}
|
|
fieldName="userSshKey"
|
|
/>
|
|
<Button
|
|
component="a"
|
|
target="_blank"
|
|
variant="link"
|
|
icon={<ExternalLinkAltIcon />}
|
|
iconPosition="right"
|
|
href={GENERATING_SSH_KEY_PAIRS_URL}
|
|
className="pf-v5-u-pl-0"
|
|
>
|
|
Learn more about SSH keys
|
|
</Button>
|
|
</FormGroup>
|
|
<FormGroup>
|
|
<Checkbox
|
|
label="Administrator"
|
|
isChecked={userIsAdministrator}
|
|
onChange={(_e, value) => handleCheckboxChange(_e, value)}
|
|
aria-label="Administrator"
|
|
id="user Administrator"
|
|
name="user Administrator"
|
|
/>
|
|
</FormGroup>
|
|
<Tooltip position="top-start" content={'Remove user'}>
|
|
<FormGroup>
|
|
<Button
|
|
aria-label="remove user"
|
|
onClick={onRemoveUserClick}
|
|
variant="tertiary"
|
|
icon={<TrashIcon />}
|
|
></Button>
|
|
</FormGroup>
|
|
</Tooltip>
|
|
</>
|
|
);
|
|
};
|
|
|
|
export default UserInfo;
|