import type { KeyboardEvent } from "react"; import { forwardRef, useRef, useImperativeHandle, useLayoutEffect, useState, } from "react"; import clsx from "clsx"; import "./TextField.scss"; import { Button } from "./Button"; import { eyeIcon, eyeClosedIcon } from "./icons"; 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; } & ({ value: string } | { defaultValue: string }); export const TextField = forwardRef( ( { onChange, label, fullWidth, placeholder, readonly, selectOnRender, onKeyDown, isRedacted = false, icon, className, ...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} /> {isRedacted && ( )}
); }, );