import clsx from "clsx"; import { forwardRef, useRef, useImperativeHandle, useLayoutEffect, useState, } from "react"; import { Button } from "./Button"; import { eyeIcon, eyeClosedIcon } from "./icons"; import "./TextField.scss"; import type { KeyboardEvent } from "react"; type TextFieldProps = { onChange?: (value: string) => void; onClick?: () => void; onKeyDown?: (event: KeyboardEvent) => void; readonly?: boolean; fullWidth?: boolean; selectOnRender?: boolean; icon?: React.ReactNode; label?: string; className?: string; placeholder?: string; isRedacted?: boolean; type?: "text" | "search"; } & ({ value: string } | { defaultValue: string }); export const TextField = forwardRef( ( { onChange, label, fullWidth, placeholder, readonly, selectOnRender, onKeyDown, isRedacted = false, icon, className, type, ...rest }, ref, ) => { const innerRef = useRef(null); useImperativeHandle(ref, () => innerRef.current!); useLayoutEffect(() => { if (selectOnRender) { // focusing first is needed because vitest/jsdom innerRef.current?.focus(); innerRef.current?.select(); } }, [selectOnRender]); const [isTemporarilyUnredacted, setIsTemporarilyUnredacted] = useState(false); return (
{ innerRef.current?.focus(); }} > {icon} {label &&
{label}
}
onChange?.(event.target.value)} onKeyDown={onKeyDown} type={type} /> {isRedacted && ( )}
); }, );