@trail-ui/react
Version:
78 lines (75 loc) • 2.45 kB
JavaScript
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
};