1
0
Fork 0
mirror of https://github.com/plankanban/planka.git synced 2025-07-25 16:19:47 +02:00

Add visibility toggle of password input. Closes #2

This commit is contained in:
Maksim Eltyshev 2019-11-15 03:45:59 +05:00
parent 7a3805e64c
commit 390d96cc19
25 changed files with 111 additions and 92 deletions

View file

@ -1,28 +1,11 @@
import React from 'react';
import PropTypes from 'prop-types';
import { Input as SemanticUIInput } from 'semantic-ui-react';
import MaskedInput from './MaskedInput';
import InputPassword from './InputPassword';
import InputMask from './InputMask';
const Input = React.forwardRef(({ mask, maskChar, ...props }, ref) => {
const nextProps = props;
const Input = SemanticUIInput;
if (mask) {
nextProps.input = <MaskedInput mask={mask} maskChar={maskChar} />;
}
Input.Password = InputPassword;
Input.Mask = InputMask;
// eslint-disable-next-line react/jsx-props-no-spreading
return <SemanticUIInput {...nextProps} ref={ref} />;
});
Input.propTypes = {
mask: PropTypes.string,
maskChar: PropTypes.string,
};
Input.defaultProps = {
mask: undefined,
maskChar: undefined,
};
export default React.memo(Input);
export default Input;

View file

@ -0,0 +1,21 @@
import React from 'react';
import PropTypes from 'prop-types';
import { Input } from 'semantic-ui-react';
import MaskedInput from './MaskedInput';
const InputMask = React.forwardRef(({ mask, maskChar, ...props }, ref) => (
// eslint-disable-next-line react/jsx-props-no-spreading
<Input {...props} ref={ref} input={<MaskedInput mask={mask} maskChar={maskChar} />} />
));
InputMask.propTypes = {
mask: PropTypes.string.isRequired,
maskChar: PropTypes.string,
};
InputMask.defaultProps = {
maskChar: undefined,
};
export default React.memo(InputMask);

View file

@ -0,0 +1,22 @@
import React, { useCallback } from 'react';
import { Icon, Input } from 'semantic-ui-react';
import { useToggle } from '../../../hooks';
const InputPassword = React.forwardRef((props, ref) => {
const [isHidden, toggleHidden] = useToggle(true);
const handleToggleClick = useCallback(() => {
toggleHidden();
}, [toggleHidden]);
return (
<Input
{...props} // eslint-disable-line react/jsx-props-no-spreading
ref={ref}
type={isHidden ? 'password' : 'text'}
icon={<Icon link name={isHidden ? 'eye slash' : 'eye'} onClick={handleToggleClick} />}
/>
);
});
export default React.memo(InputPassword);