Files
channels-seerr/src/components/Common/SensitiveInput/index.tsx
soup e97a13e1e4 feat(ui): prevent password manager interference & improve service links (#1396)
* feat(ui): prevent password manager interference & improve service links (#3989)

(cherry picked from commit ef18b5d1de)

* feat(ui): prevent password manager autofill on Jellyfin setup form

* fix: rebase mess

* feat(ui): set data-form-type attribute

For Dashlane password manager

* feat(ui): add data attribs for dashlane

* feat(ui): set data-form-type to JellyfinLogin
2025-03-04 08:10:27 +08:00

58 lines
1.4 KiB
TypeScript

import { EyeIcon, EyeSlashIcon } from '@heroicons/react/24/solid';
import { Field } from 'formik';
import { useState } from 'react';
interface CustomInputProps extends React.ComponentProps<'input'> {
as?: 'input';
}
interface CustomFieldProps extends React.ComponentProps<typeof Field> {
as?: 'field';
}
type SensitiveInputProps = CustomInputProps | CustomFieldProps;
const SensitiveInput = ({ as = 'input', ...props }: SensitiveInputProps) => {
const [isHidden, setHidden] = useState(true);
const Component = as === 'input' ? 'input' : Field;
const componentProps =
as === 'input'
? props
: {
...props,
as: props.type === 'textarea' && !isHidden ? 'textarea' : undefined,
};
return (
<>
<Component
autoComplete="off"
data-form-type="other"
data-1pignore="true"
data-lpignore="true"
data-bwignore="true"
{...componentProps}
className={`rounded-l-only ${componentProps.className ?? ''}`}
type={
isHidden
? 'password'
: props.type !== 'password'
? props.type ?? 'text'
: 'text'
}
/>
<button
onClick={(e) => {
e.preventDefault();
setHidden(!isHidden);
}}
type="button"
className="input-action"
>
{isHidden ? <EyeSlashIcon /> : <EyeIcon />}
</button>
</>
);
};
export default SensitiveInput;