downshift
Version:
🏎 A set of primitives to build simple, flexible, WAI-ARIA compliant React autocomplete, combobox or select dropdown components.
207 lines (206 loc) • 9.21 kB
TypeScript
import React from 'react';
export type Overwrite<T, U> = Pick<T, Exclude<keyof T, keyof U>> & U;
export type AnyRef = React.Ref<any>;
export interface Environment {
addEventListener: typeof window.addEventListener;
removeEventListener: typeof window.removeEventListener;
document: Document;
Node: typeof window.Node;
}
export interface GetPropsCommonOptions {
suppressRefError?: boolean;
}
export type Callback = () => void;
export interface DownshiftState<Item> {
highlightedIndex: number | null;
inputValue: string | null;
isOpen: boolean;
selectedItem: Item | null;
}
export declare enum StateChangeTypes {
unknown = "__autocomplete_unknown__",
mouseUp = "__autocomplete_mouseup__",
itemMouseEnter = "__autocomplete_item_mouseenter__",
keyDownArrowUp = "__autocomplete_keydown_arrow_up__",
keyDownArrowDown = "__autocomplete_keydown_arrow_down__",
keyDownEscape = "__autocomplete_keydown_escape__",
keyDownEnter = "__autocomplete_keydown_enter__",
clickItem = "__autocomplete_click_item__",
blurInput = "__autocomplete_blur_input__",
changeInput = "__autocomplete_change_input__",
keyDownSpaceButton = "__autocomplete_keydown_space_button__",
clickButton = "__autocomplete_click_button__",
blurButton = "__autocomplete_blur_button__",
controlledPropUpdatedSelectedItem = "__autocomplete_controlled_prop_updated_selected_item__",
touchEnd = "__autocomplete_touchend__"
}
export interface DownshiftProps<Item> {
initialSelectedItem?: Item;
initialInputValue?: string;
initialHighlightedIndex?: number | null;
initialIsOpen?: boolean;
defaultHighlightedIndex?: number | null;
defaultIsOpen?: boolean;
itemToString?: (item: Item | null) => string;
selectedItemChanged?: (prevItem: Item, item: Item) => boolean;
getA11yStatusMessage?: (options: A11yStatusMessageOptions<Item>) => string;
onChange?: (selectedItem: Item | null, stateAndHelpers: ControllerStateAndHelpers<Item>) => void;
onSelect?: (selectedItem: Item | null, stateAndHelpers: ControllerStateAndHelpers<Item>) => void;
onStateChange?: (options: StateChangeOptions<Item>, stateAndHelpers: ControllerStateAndHelpers<Item>) => void;
onInputValueChange?: (inputValue: string, stateAndHelpers: ControllerStateAndHelpers<Item>) => void;
stateReducer?: (state: DownshiftState<Item>, changes: StateChangeOptions<Item>) => Partial<StateChangeOptions<Item>>;
itemCount?: number;
highlightedIndex?: number | null;
inputValue?: string | null;
isOpen?: boolean;
selectedItem?: Item | null;
children?: ChildrenFunction<Item>;
id?: string;
inputId?: string;
labelId?: string;
menuId?: string;
getItemId?: (index?: number) => string;
environment?: Environment;
onOuterClick?: (stateAndHelpers: ControllerStateAndHelpers<Item>) => void;
scrollIntoView?: (node: HTMLElement, menuNode: HTMLElement) => void;
onUserAction?: (options: StateChangeOptions<Item>, stateAndHelpers: ControllerStateAndHelpers<Item>) => void;
suppressRefError?: boolean;
}
export interface A11yStatusMessageOptions<Item> {
highlightedIndex: number | null;
inputValue: string;
isOpen: boolean;
itemToString: (item: Item | null) => string;
previousResultCount: number;
resultCount: number;
highlightedItem: Item;
selectedItem: Item | null;
}
export interface StateChangeOptions<Item> extends Partial<DownshiftState<Item>> {
type: StateChangeTypes;
}
export type StateChangeFunction<Item> = (state: DownshiftState<Item>) => Partial<StateChangeOptions<Item>>;
export interface GetRootPropsOptions {
refKey?: string;
ref?: React.RefObject<any>;
}
export interface GetRootPropsReturnValue {
'aria-expanded': boolean;
'aria-haspopup': 'listbox';
'aria-labelledby': string;
'aria-owns': string | undefined;
ref?: React.RefObject<any>;
role: 'combobox';
}
export interface GetInputPropsOptions extends React.HTMLProps<HTMLInputElement> {
disabled?: boolean;
}
export interface GetInputPropsReturnValue {
'aria-autocomplete': 'list';
'aria-activedescendant': string | undefined;
'aria-controls': string | undefined;
'aria-labelledby': string | undefined;
autoComplete: 'off';
id: string;
onChange?: React.ChangeEventHandler;
onChangeText?: React.ChangeEventHandler;
onInput?: React.FormEventHandler;
onKeyDown?: React.KeyboardEventHandler;
onBlur?: React.FocusEventHandler;
value: string;
}
export interface GetLabelPropsOptions extends React.HTMLProps<HTMLLabelElement> {
}
export interface GetLabelPropsReturnValue {
htmlFor: string;
id: string;
}
export interface GetToggleButtonPropsOptions extends React.HTMLProps<HTMLButtonElement> {
disabled?: boolean;
onPress?: (event: React.BaseSyntheticEvent) => void;
}
export interface GetToggleButtonPropsReturnValue {
'aria-label': 'close menu' | 'open menu';
'aria-haspopup': true;
'data-toggle': true;
onPress?: (event: React.BaseSyntheticEvent) => void;
onClick?: React.MouseEventHandler;
onKeyDown?: React.KeyboardEventHandler;
onKeyUp?: React.KeyboardEventHandler;
onBlur?: React.FocusEventHandler;
role: 'button';
type: 'button';
}
export interface GetMenuPropsOptions extends React.HTMLProps<HTMLElement>, GetPropsWithRefKey {
['aria-label']?: string;
}
export interface GetMenuPropsReturnValue {
'aria-labelledby': string | undefined;
ref?: React.RefObject<any>;
role: 'listbox';
id: string;
}
export interface GetPropsWithRefKey {
refKey?: string;
}
export interface GetItemPropsOptions<Item> extends React.HTMLProps<HTMLElement> {
index?: number;
item: Item;
isSelected?: boolean;
disabled?: boolean;
}
export interface GetItemPropsReturnValue {
'aria-selected': boolean;
id: string;
onClick?: React.MouseEventHandler;
onMouseDown?: React.MouseEventHandler;
onMouseMove?: React.MouseEventHandler;
onPress?: React.MouseEventHandler;
role: 'option';
}
export interface PropGetters<Item> {
getRootProps: <Options>(options?: GetRootPropsOptions & Options, otherOptions?: GetPropsCommonOptions) => Overwrite<GetRootPropsReturnValue, Options>;
getToggleButtonProps: <Options>(options?: GetToggleButtonPropsOptions & Options) => Overwrite<GetToggleButtonPropsReturnValue, Options>;
getLabelProps: <Options>(options?: GetLabelPropsOptions & Options) => Overwrite<GetLabelPropsReturnValue, Options>;
getMenuProps: <Options>(options?: GetMenuPropsOptions & Options, otherOptions?: GetPropsCommonOptions) => Overwrite<GetMenuPropsReturnValue, Options>;
getInputProps: <Options>(options?: GetInputPropsOptions & Options) => Overwrite<GetInputPropsReturnValue, Options>;
getItemProps: <Options>(options: GetItemPropsOptions<Item> & Options) => Omit<Overwrite<GetItemPropsReturnValue, Options>, 'index' | 'item'>;
}
export interface Actions<Item> {
reset: (otherStateToSet?: Partial<StateChangeOptions<Item>>, cb?: Callback) => void;
openMenu: (cb?: Callback) => void;
closeMenu: (cb?: Callback) => void;
toggleMenu: (otherStateToSet?: Partial<StateChangeOptions<Item>>, cb?: Callback) => void;
selectItem: (item: Item | null, otherStateToSet?: Partial<StateChangeOptions<Item>>, cb?: Callback) => void;
selectItemAtIndex: (index: number, otherStateToSet?: Partial<StateChangeOptions<Item>>, cb?: Callback) => void;
selectHighlightedItem: (otherStateToSet?: Partial<StateChangeOptions<Item>>, cb?: Callback) => void;
setHighlightedIndex: (index: number, otherStateToSet?: Partial<StateChangeOptions<Item>>, cb?: Callback) => void;
clearSelection: (cb?: Callback) => void;
clearItems: () => void;
setItemCount: (count: number) => void;
unsetItemCount: () => void;
setState: (stateToSet: Partial<StateChangeOptions<Item>> | StateChangeFunction<Item>, cb?: Callback) => void;
itemToString: (item: Item | null) => string;
}
export type ControllerStateAndHelpers<Item> = DownshiftState<Item> & PropGetters<Item> & Actions<Item>;
export type ChildrenFunction<Item> = (options: ControllerStateAndHelpers<Item>) => React.ReactNode;
export default class Downshift<Item = any> extends React.Component<DownshiftProps<Item>> {
static stateChangeTypes: {
unknown: StateChangeTypes.unknown;
mouseUp: StateChangeTypes.mouseUp;
itemMouseEnter: StateChangeTypes.itemMouseEnter;
keyDownArrowUp: StateChangeTypes.keyDownArrowUp;
keyDownArrowDown: StateChangeTypes.keyDownArrowDown;
keyDownEscape: StateChangeTypes.keyDownEscape;
keyDownEnter: StateChangeTypes.keyDownEnter;
clickItem: StateChangeTypes.clickItem;
blurInput: StateChangeTypes.blurInput;
changeInput: StateChangeTypes.changeInput;
keyDownSpaceButton: StateChangeTypes.keyDownSpaceButton;
clickButton: StateChangeTypes.clickButton;
blurButton: StateChangeTypes.blurButton;
controlledPropUpdatedSelectedItem: StateChangeTypes.controlledPropUpdatedSelectedItem;
touchEnd: StateChangeTypes.touchEnd;
};
}
export declare function resetIdCounter(): void;