UNPKG

@trail-ui/react

Version:
78 lines (75 loc) 2.45 kB
import { useDOMRef } from "./chunk-4CU75PXA.mjs"; // src/input/use-input.ts import { dataAttr } from "@trail-ui/shared-utils"; import { useCallback } from "react"; import { mergeProps, useFocusRing, useHover, usePress } from "react-aria"; function useInput(props) { const { ref, onClear, ...otherProps } = props; const domRef = useDOMRef(ref); const handleClear = useCallback(() => { if (domRef == null ? void 0 : domRef.current) { domRef.current.value = ""; domRef.current.focus(); } onClear == null ? void 0 : onClear(); }, [domRef, onClear]); const { hoverProps, isHovered } = useHover({}); const { isFocused, isFocusVisible, focusProps } = useFocusRing({ isTextInput: true, autoFocus: props.autoFocus }); const { focusProps: clearFocusProps, isFocusVisible: isClearButtonFocusVisible } = useFocusRing(); const { pressProps: clearPressProps } = usePress({ isDisabled: !!(props == null ? void 0 : props.disabled), onPress: handleClear }); const inputValue = props["data-value"]; const isFilled = !!inputValue; const isInvalid = !!props["aria-invalid"] && props["aria-invalid"] !== "false"; const getInputWrapperProps = useCallback( (inputWrapperProps = {}) => { return { "data-filled": dataAttr(isFilled), "data-focused": dataAttr(isFocused), "data-focus-visible": dataAttr(isFocusVisible), "data-hovered": dataAttr(isHovered), "data-disabled": dataAttr(props.disabled), "data-invalid": dataAttr(isInvalid), ...inputWrapperProps }; }, [isFilled, isFocusVisible, isFocused, isHovered, isInvalid, props.disabled] ); const getInputProps = useCallback( (inputProps = {}) => { return { "data-filled": dataAttr(isFilled), ...mergeProps(otherProps, focusProps, hoverProps, inputProps), ref: domRef }; }, [domRef, focusProps, hoverProps, isFilled, otherProps] ); const getClearButtonProps = useCallback( (clearButtonProps = {}) => { return { role: "button", tabIndex: 0, "data-focus-visible": dataAttr(isClearButtonFocusVisible), ...mergeProps(clearFocusProps, clearPressProps, clearButtonProps) }; }, [clearFocusProps, clearPressProps, isClearButtonFocusVisible] ); return { domRef, getInputWrapperProps, getInputProps, getClearButtonProps }; } export { useInput };