Skip to content

Commit

Permalink
chore: add support validationBehavior autocomplete
Browse files Browse the repository at this point in the history
  • Loading branch information
ryo-manba committed Mar 30, 2024
1 parent 602685d commit 60f26b8
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 15 deletions.
45 changes: 30 additions & 15 deletions packages/components/autocomplete/src/use-autocomplete.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ import type {AutocompleteVariantProps, SlotsToClasses, AutocompleteSlots} from "
import {DOMAttributes, HTMLNextUIProps, mapPropsVariants, PropGetter} from "@nextui-org/system";
import {autocomplete} from "@nextui-org/theme";
import {useFilter} from "@react-aria/i18n";
import {useComboBox} from "@react-aria/combobox";
import {FilterFn, useComboBoxState} from "@react-stately/combobox";
import {ReactRef, useDOMRef} from "@nextui-org/react-utils";
import {ReactNode, useCallback, useEffect, useMemo, useRef} from "react";
Expand All @@ -16,6 +15,7 @@ import {ScrollShadowProps} from "@nextui-org/scroll-shadow";
import {chain, mergeProps} from "@react-aria/utils";
import {ButtonProps} from "@nextui-org/button";
import {AsyncLoadable, PressEvent} from "@react-types/shared";
import {useComboBox} from "@react-aria/combobox";

interface Props<T> extends Omit<HTMLNextUIProps<"input">, keyof ComboBoxProps<T>> {
/**
Expand Down Expand Up @@ -154,6 +154,7 @@ export function useAutocomplete<T extends object>(originalProps: UseAutocomplete
allowsCustomValue = false,
className,
classNames,
errorMessage,
onOpenChange,
onClose,
isReadOnly = false,
Expand Down Expand Up @@ -193,6 +194,26 @@ export function useAutocomplete<T extends object>(originalProps: UseAutocomplete
const inputRef = useDOMRef<HTMLInputElement>(ref);
const scrollShadowRef = useDOMRef<HTMLElement>(scrollRefProp);

const {
buttonProps,
inputProps,
listBoxProps,
isInvalid: isAriaInvalid,
validationDetails,
validationErrors,
} = useComboBox(
{
...originalProps,
inputRef,
buttonRef,
listBoxRef,
popoverRef,
},
state,
);

const isInvalid = originalProps.isInvalid || isAriaInvalid;

const slotsProps: {
inputProps: InputProps;
popoverProps: UseAutocompleteProps<T>["popoverProps"];
Expand Down Expand Up @@ -248,7 +269,7 @@ export function useAutocomplete<T extends object>(originalProps: UseAutocomplete
size: "sm",
variant: "light",
radius: "full",
color: originalProps?.isInvalid ? "danger" : originalProps?.color,
color: isInvalid ? "danger" : originalProps?.color,
isIconOnly: true,
disableAnimation,
},
Expand All @@ -259,7 +280,7 @@ export function useAutocomplete<T extends object>(originalProps: UseAutocomplete
size: "sm",
variant: "light",
radius: "full",
color: originalProps?.isInvalid ? "danger" : originalProps?.color,
color: isInvalid ? "danger" : originalProps?.color,
isIconOnly: true,
disableAnimation,
},
Expand Down Expand Up @@ -290,17 +311,6 @@ export function useAutocomplete<T extends object>(originalProps: UseAutocomplete
}
}, [isOpen, allowsCustomValue]);

const {buttonProps, inputProps, listBoxProps} = useComboBox(
{
...originalProps,
inputRef,
buttonRef,
listBoxRef,
popoverRef,
},
state,
);

const Component = as || "div";

const slots = useMemo(
Expand Down Expand Up @@ -328,7 +338,7 @@ export function useAutocomplete<T extends object>(originalProps: UseAutocomplete
);

const getBaseProps: PropGetter = () => ({
"data-invalid": dataAttr(originalProps?.isInvalid),
"data-invalid": dataAttr(isInvalid),
"data-open": dataAttr(state.isOpen),
className: slots.base({class: baseStyles}),
});
Expand Down Expand Up @@ -369,6 +379,11 @@ export function useAutocomplete<T extends object>(originalProps: UseAutocomplete
...otherProps,
...inputProps,
...slotsProps.inputProps,
isInvalid,
errorMessage:
typeof errorMessage === "function"
? errorMessage({isInvalid, validationErrors, validationDetails})
: errorMessage || validationErrors.join(" "),
onClick: chain(slotsProps.inputProps.onClick, otherProps.onClick),
} as unknown as InputProps);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,12 @@ export default {
type: "boolean",
},
},
validationBehavior: {
control: {
type: "select",
},
options: ["aria", "native"],
},
},
decorators: [
(Story) => (
Expand Down Expand Up @@ -762,6 +768,7 @@ export const WithErrorMessage = {

args: {
...defaultProps,
isInvalid: true,
errorMessage: "Please select an animal",
},
};
Expand Down

0 comments on commit 60f26b8

Please sign in to comment.