import React, { useCallback, useEffect, useRef } from "react"; import classnames from "classnames"; import { ICON_MAP } from "components/icons"; import Icon from "components/Icon/Icon"; import TooltipWrapper from "components/TooltipWrapper"; import Button from "components/buttons/Button"; const baseClass = "input-icon-field"; type IconName = keyof typeof ICON_MAP; export interface IInputFieldWithIconProps { autofocus?: boolean; error?: string | null; helpText?: string[] | string; iconSvg?: IconName; label?: string; name?: string; onChange?: (value: any) => void; onClick?: (evt: React.MouseEvent) => void; clearButton?: boolean; placeholder?: string; tabIndex?: number; type?: string; className?: string; disabled?: boolean; inputOptions?: React.InputHTMLAttributes; tooltip?: string; ignore1Password?: boolean; value?: string; } const InputFieldWithIcon = ({ autofocus = false, error, helpText, iconSvg, label, name, onChange, onClick, clearButton, placeholder, tabIndex, type, className, disabled, inputOptions, tooltip, ignore1Password, value, }: IInputFieldWithIconProps): JSX.Element => { const inputRef = useRef(null); useEffect(() => { if (autofocus && inputRef.current) { inputRef.current.focus(); } }, [autofocus]); const onInputChange = useCallback( (evt: React.ChangeEvent) => { evt.preventDefault(); return onChange?.(evt.target.value); }, [onChange] ); const renderHeading = () => { const labelClasses = classnames(`${baseClass}__label`, { [`${baseClass}__errors`]: !!error, [`${baseClass}__label--disabled`]: disabled, }); return ( ); }; const renderHelpText = () => { if (helpText) { return ( {helpText} ); } return false; }; const wrapperClasses = classnames(baseClass, "form-field"); const inputClasses = classnames( `${baseClass}__input`, className, { "input-with-icon": !!iconSvg }, { [`${baseClass}__input--error`]: !!error }, { [`${baseClass}__input--password`]: !!(type === "password" && value) } ); const inputWrapperClasses = classnames(`${baseClass}__input-wrapper`, { [`${baseClass}__input-wrapper--disabled`]: disabled, }); const iconClasses = classnames( `${baseClass}__icon`, { [`${baseClass}__icon--error`]: !!error }, { [`${baseClass}__icon--active`]: !!value } ); const handleClear = () => { onChange?.(""); }; return (
{label && renderHeading()}
{iconSvg && } {clearButton && !!value && ( )}
{renderHelpText()}
); }; export default InputFieldWithIcon;