downshift
Version:
🏎 A set of primitives to build simple, flexible, WAI-ARIA compliant React autocomplete, combobox or select dropdown components.
302 lines (301 loc) • 14 kB
TypeScript
import { AnyRef, Environment, GetPropsCommonOptions, Overwrite } from '../../downshift.types';
export interface UseComboboxState<Item> {
highlightedIndex: number;
selectedItem: Item | null;
isOpen: boolean;
inputValue: string;
}
export declare enum UseComboboxStateChangeTypes {
InputKeyDownArrowDown = "__input_keydown_arrow_down__",
InputKeyDownArrowUp = "__input_keydown_arrow_up__",
InputKeyDownEscape = "__input_keydown_escape__",
InputKeyDownHome = "__input_keydown_home__",
InputKeyDownEnd = "__input_keydown_end__",
InputKeyDownPageUp = "__input_keydown_page_up__",
InputKeyDownPageDown = "__input_keydown_page_down__",
InputKeyDownEnter = "__input_keydown_enter__",
InputChange = "__input_change__",
InputBlur = "__input_blur__",
InputClick = "__input_click__",
MenuMouseLeave = "__menu_mouse_leave__",
ItemMouseMove = "__item_mouse_move__",
ItemClick = "__item_click__",
ToggleButtonClick = "__togglebutton_click__",
FunctionToggleMenu = "__function_toggle_menu__",
FunctionOpenMenu = "__function_open_menu__",
FunctionCloseMenu = "__function_close_menu__",
FunctionSetHighlightedIndex = "__function_set_highlighted_index__",
FunctionSelectItem = "__function_select_item__",
FunctionSetInputValue = "__function_set_input_value__",
FunctionReset = "__function_reset__",
ControlledPropUpdatedSelectedItem = "__controlled_prop_updated_selected_item__"
}
export type UseComboboxInputKeyDownArrowDownAction = {
type: UseComboboxStateChangeTypes.InputKeyDownArrowDown;
altKey: boolean;
};
export type UseComboboxInputKeyDownArrowUpAction = {
type: UseComboboxStateChangeTypes.InputKeyDownArrowUp;
altKey: boolean;
};
export type UseComboboxInputKeyDownHomeAction = {
type: UseComboboxStateChangeTypes.InputKeyDownHome;
};
export type UseComboboxInputKeyDownEndAction = {
type: UseComboboxStateChangeTypes.InputKeyDownEnd;
};
export type UseComboboxInputKeyDownEscapeAction = {
type: UseComboboxStateChangeTypes.InputKeyDownEscape;
};
export type UseComboboxInputKeyDownEnterAction = {
type: UseComboboxStateChangeTypes.InputKeyDownEnter;
};
export type UseComboboxInputKeyDownPageUpAction = {
type: UseComboboxStateChangeTypes.InputKeyDownPageUp;
};
export type UseComboboxInputKeyDownPageDownAction = {
type: UseComboboxStateChangeTypes.InputKeyDownPageDown;
};
export type UseComboboxInputChangeAction = {
type: UseComboboxStateChangeTypes.InputChange;
inputValue: string;
};
export type UseComboboxInputBlurAction = {
type: UseComboboxStateChangeTypes.InputBlur;
selectItem?: boolean;
};
export type UseComboboxInputClickAction = {
type: UseComboboxStateChangeTypes.InputClick;
};
export type UseComboboxMenuMouseLeaveAction = {
type: UseComboboxStateChangeTypes.MenuMouseLeave;
};
export type UseComboboxItemMouseMoveAction = {
type: UseComboboxStateChangeTypes.ItemMouseMove;
index: number;
disabled: boolean;
};
export type UseComboboxItemClickAction = {
type: UseComboboxStateChangeTypes.ItemClick;
index: number;
};
export type UseComboboxToggleButtonClickAction = {
type: UseComboboxStateChangeTypes.ToggleButtonClick;
};
export type UseComboboxFunctionToggleMenuAction = {
type: UseComboboxStateChangeTypes.FunctionToggleMenu;
};
export type UseComboboxFunctionOpenMenuAction = {
type: UseComboboxStateChangeTypes.FunctionOpenMenu;
};
export type UseComboboxFunctionCloseMenuAction = {
type: UseComboboxStateChangeTypes.FunctionCloseMenu;
};
export type UseComboboxFunctionSetHighlightedIndexAction = {
type: UseComboboxStateChangeTypes.FunctionSetHighlightedIndex;
highlightedIndex: number;
};
export type UseComboboxFunctionSelectItemAction<Item> = {
type: UseComboboxStateChangeTypes.FunctionSelectItem;
selectedItem: Item | null;
};
export type UseComboboxFunctionSetInputValueAction = {
type: UseComboboxStateChangeTypes.FunctionSetInputValue;
inputValue: string;
};
export type UseComboboxFunctionResetAction = {
type: UseComboboxStateChangeTypes.FunctionReset;
};
export type UseComboboxControlledPropUpdatedSelectedItemAction = {
type: UseComboboxStateChangeTypes.ControlledPropUpdatedSelectedItem;
inputValue: string;
};
export type UseComboboxReducerAction<Item> = UseComboboxInputKeyDownArrowDownAction | UseComboboxInputKeyDownArrowUpAction | UseComboboxInputKeyDownHomeAction | UseComboboxInputKeyDownEndAction | UseComboboxInputKeyDownEscapeAction | UseComboboxInputKeyDownEnterAction | UseComboboxInputKeyDownPageUpAction | UseComboboxInputKeyDownPageDownAction | UseComboboxInputChangeAction | UseComboboxInputBlurAction | UseComboboxInputClickAction | UseComboboxMenuMouseLeaveAction | UseComboboxItemMouseMoveAction | UseComboboxItemClickAction | UseComboboxToggleButtonClickAction | UseComboboxFunctionToggleMenuAction | UseComboboxFunctionOpenMenuAction | UseComboboxFunctionCloseMenuAction | UseComboboxFunctionSetHighlightedIndexAction | UseComboboxFunctionSelectItemAction<Item> | UseComboboxFunctionSetInputValueAction | UseComboboxFunctionResetAction | UseComboboxControlledPropUpdatedSelectedItemAction;
export interface UseComboboxProps<Item> {
items: Item[];
isItemDisabled?(item: Item, index: number): boolean;
itemToString?: (item: Item | null) => string;
itemToKey?: (item: Item | null) => any;
getA11yStatusMessage?: (options: UseComboboxState<Item>) => string;
highlightedIndex?: number;
initialHighlightedIndex?: number;
defaultHighlightedIndex?: number;
isOpen?: boolean;
initialIsOpen?: boolean;
defaultIsOpen?: boolean;
selectedItem?: Item | null;
initialSelectedItem?: Item | null;
defaultSelectedItem?: Item | null;
inputValue?: string;
initialInputValue?: string;
defaultInputValue?: string;
id?: string;
labelId?: string;
menuId?: string;
toggleButtonId?: string;
inputId?: string;
getItemId?: (index: number) => string;
scrollIntoView?: (node: HTMLElement, menuNode: HTMLElement) => void;
stateReducer?: (state: UseComboboxState<Item>, actionAndChanges: UseComboboxStateChangeOptions<Item>) => Partial<UseComboboxState<Item>>;
onSelectedItemChange?: (changes: UseComboboxSelectedItemChange<Item>) => void;
onIsOpenChange?: (changes: UseComboboxIsOpenChange<Item>) => void;
onHighlightedIndexChange?: (changes: UseComboboxHighlightedIndexChange<Item>) => void;
onStateChange?: (changes: UseComboboxStateChange<Item>) => void;
onInputValueChange?: (changes: UseComboboxInputValueChange<Item>) => void;
environment?: Environment;
}
export type UseComboboxMergedProps<Item> = Omit<UseComboboxProps<Item>, 'itemToString' | 'itemToKey' | 'stateReducer' | 'scrollIntoView' | 'isItemDisabled'> & Required<Pick<UseComboboxProps<Item>, 'itemToString' | 'itemToKey' | 'stateReducer' | 'scrollIntoView' | 'isItemDisabled'>>;
export interface UseComboboxStateChangeOptions<Item> extends UseComboboxDispatchAction<Item> {
changes: Partial<UseComboboxState<Item>>;
props: UseComboboxMergedProps<Item>;
}
export interface UseComboboxDispatchAction<Item> {
type: UseComboboxStateChangeTypes;
altKey?: boolean;
inputValue?: string;
index?: number;
highlightedIndex?: number;
selectedItem?: Item | null;
selectItem?: boolean;
}
export interface UseComboboxStateChange<Item> extends Partial<UseComboboxState<Item>> {
type: UseComboboxStateChangeTypes;
}
export interface UseComboboxSelectedItemChange<Item> extends UseComboboxStateChange<Item> {
selectedItem: Item | null;
}
export interface UseComboboxHighlightedIndexChange<Item> extends UseComboboxStateChange<Item> {
highlightedIndex: number;
}
export interface UseComboboxIsOpenChange<Item> extends UseComboboxStateChange<Item> {
isOpen: boolean;
}
export interface UseComboboxInputValueChange<Item> extends UseComboboxStateChange<Item> {
inputValue: string;
}
export interface UseComboboxGetMenuPropsOptions extends React.HTMLProps<HTMLElement> {
refKey?: string;
ref?: AnyRef;
}
export interface UseComboboxGetMenuPropsReturnValue {
'aria-label': string | undefined;
'aria-labelledby': string | undefined;
ref?: AnyRef;
role: 'listbox';
id: string;
onMouseLeave: React.MouseEventHandler;
}
export type UseComboboxGetMenuProps = <Options>(options?: UseComboboxGetMenuPropsOptions & Options, otherOptions?: GetPropsCommonOptions) => Overwrite<UseComboboxGetMenuPropsReturnValue, Options>;
export interface UseComboboxGetToggleButtonPropsOptions extends React.HTMLProps<HTMLElement> {
disabled?: boolean;
refKey?: string;
ref?: AnyRef;
onPress?: (event: React.BaseSyntheticEvent) => void;
}
export interface UseComboboxGetToggleButtonPropsReturnValue {
'aria-controls': string;
'aria-expanded': boolean;
id: string;
onPress?: (event: React.BaseSyntheticEvent) => void;
onClick?: React.MouseEventHandler;
ref?: AnyRef;
tabIndex: -1;
}
export type UseComboboxGetToggleButtonProps = <Options>(options?: UseComboboxGetToggleButtonPropsOptions & Options) => Overwrite<UseComboboxGetToggleButtonPropsReturnValue, Options>;
export interface UseComboboxGetLabelPropsOptions extends React.HTMLProps<HTMLElement> {
}
export interface UseComboboxGetLabelPropsReturnValue {
htmlFor: string;
id: string;
}
export type UseComboboxGetLabelProps = <Options>(options?: UseComboboxGetLabelPropsOptions & Options) => Overwrite<UseComboboxGetLabelPropsReturnValue, Options>;
export interface UseComboboxGetItemPropsOptions<Item> extends React.HTMLProps<HTMLElement> {
index?: number;
item?: Item;
refKey?: string;
ref?: AnyRef;
onPress?: (event: React.BaseSyntheticEvent) => void;
}
export interface UseComboboxGetItemPropsReturnValue {
'aria-selected': boolean;
'aria-disabled': boolean;
id: string;
onClick?: React.MouseEventHandler;
onMouseDown?: React.MouseEventHandler;
onMouseMove?: React.MouseEventHandler;
onPress?: React.MouseEventHandler;
ref?: AnyRef;
role: 'option';
}
export type UseComboboxGetItemProps<Item> = <Options>(options?: UseComboboxGetItemPropsOptions<Item> & Options) => Omit<Overwrite<UseComboboxGetItemPropsReturnValue, Options>, 'index' | 'item'>;
export interface UseComboboxGetInputPropsOptions extends React.HTMLProps<HTMLInputElement> {
refKey?: string;
ref?: React.Ref<HTMLInputElement>;
onChangeText?: (event: React.BaseSyntheticEvent) => void;
}
export interface UseComboboxGetInputPropsReturnValue {
ref?: AnyRef;
'aria-activedescendant': string;
'aria-autocomplete': 'list';
'aria-controls': string;
'aria-expanded': boolean;
'aria-labelledby': string | undefined;
'aria-label': string | undefined;
autoComplete: 'off';
id: string;
role: 'combobox';
value: string;
onBlur?: React.FocusEventHandler;
onChange?: React.ChangeEventHandler;
onChangeText?: React.ChangeEventHandler;
onClick?: React.MouseEventHandler;
onInput?: React.FormEventHandler;
onKeyDown?: React.KeyboardEventHandler;
}
export type UseComboboxGetInputProps = <Options>(options?: UseComboboxGetInputPropsOptions & Options, otherOptions?: GetPropsCommonOptions) => Overwrite<UseComboboxGetInputPropsReturnValue, Options>;
export interface UseComboboxPropGetters<Item> {
getToggleButtonProps: UseComboboxGetToggleButtonProps;
getLabelProps: UseComboboxGetLabelProps;
getMenuProps: UseComboboxGetMenuProps;
getItemProps: UseComboboxGetItemProps<Item>;
getInputProps: UseComboboxGetInputProps;
}
export interface UseComboboxActions<Item> {
reset: () => void;
openMenu: () => void;
closeMenu: () => void;
toggleMenu: () => void;
selectItem: (item: Item | null) => void;
setHighlightedIndex: (index: number) => void;
setInputValue: (inputValue: string) => void;
}
export type UseComboboxReturnValue<Item> = UseComboboxState<Item> & UseComboboxPropGetters<Item> & UseComboboxActions<Item>;
export interface UseComboboxInterface {
<Item>(props: UseComboboxProps<Item>): UseComboboxReturnValue<Item>;
stateChangeTypes: {
InputKeyDownArrowDown: UseComboboxStateChangeTypes.InputKeyDownArrowDown;
InputKeyDownArrowUp: UseComboboxStateChangeTypes.InputKeyDownArrowUp;
InputKeyDownEscape: UseComboboxStateChangeTypes.InputKeyDownEscape;
InputKeyDownHome: UseComboboxStateChangeTypes.InputKeyDownHome;
InputKeyDownEnd: UseComboboxStateChangeTypes.InputKeyDownEnd;
InputKeyDownPageDown: UseComboboxStateChangeTypes.InputKeyDownPageDown;
InputKeyDownPageUp: UseComboboxStateChangeTypes.InputKeyDownPageUp;
InputKeyDownEnter: UseComboboxStateChangeTypes.InputKeyDownEnter;
InputChange: UseComboboxStateChangeTypes.InputChange;
InputBlur: UseComboboxStateChangeTypes.InputBlur;
InputClick: UseComboboxStateChangeTypes.InputClick;
MenuMouseLeave: UseComboboxStateChangeTypes.MenuMouseLeave;
ItemMouseMove: UseComboboxStateChangeTypes.ItemMouseMove;
ItemClick: UseComboboxStateChangeTypes.ItemClick;
ToggleButtonClick: UseComboboxStateChangeTypes.ToggleButtonClick;
FunctionToggleMenu: UseComboboxStateChangeTypes.FunctionToggleMenu;
FunctionOpenMenu: UseComboboxStateChangeTypes.FunctionOpenMenu;
FunctionCloseMenu: UseComboboxStateChangeTypes.FunctionCloseMenu;
FunctionSetHighlightedIndex: UseComboboxStateChangeTypes.FunctionSetHighlightedIndex;
FunctionSelectItem: UseComboboxStateChangeTypes.FunctionSelectItem;
FunctionSetInputValue: UseComboboxStateChangeTypes.FunctionSetInputValue;
FunctionReset: UseComboboxStateChangeTypes.FunctionReset;
ControlledPropUpdatedSelectedItem: UseComboboxStateChangeTypes.ControlledPropUpdatedSelectedItem;
};
}
export declare const useCombobox: UseComboboxInterface;