Skip to content

Commit

Permalink
types(hooks): improve Typescript for onChange funtions (#1580)
Browse files Browse the repository at this point in the history
* types(hooks): improve for onChange funtions

* migration guide

* fix doctoc
  • Loading branch information
silviuaavram committed Mar 13, 2024
1 parent 7997f76 commit d2b42e8
Show file tree
Hide file tree
Showing 3 changed files with 98 additions and 15 deletions.
34 changes: 34 additions & 0 deletions src/hooks/MIGRATION_V9.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
# Migration from v8 to v9

Downshift v8 receives a list of breaking changes, which are necessary to improve
both the user and the developer experience. The changes are only affecting the
hooks and are detailed below.

## Table of Contents

<!-- START doctoc generated TOC please keep comment here to allow auto update -->
<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->

- [onChange Typescript Improvements](#onchange-typescript-improvements)

<!-- END doctoc generated TOC please keep comment here to allow auto update -->

## onChange Typescript Improvements

The handlers below have their types improved to reflect that they will always
get called with their corresponding state prop:

- useCombobox
- onSelectedItemChange: selectedItem is non optional
- onIsOpenChange: isOpen is non optional
- onHighlightedIndexChange: highlightedIndex is non optional

- useSelect
- onSelectedItemChange: selectedItem is non optional
- onIsOpenChange: isOpen is non optional
- onHighlightedIndexChange: highlightedIndex is non optional
- onInputValueChange: inputValue is non optional

- useMultipleSelection
- onActiveIndexChange: activeIndex is non optional
- onSelectedItemsChange: selectedItems is non optional
11 changes: 5 additions & 6 deletions test/useCombobox.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -32,12 +32,11 @@ export default function DropdownCombobox() {
} = useCombobox({
items: inputItems,
onInputValueChange: ({inputValue}) => {
inputValue !== undefined &&
setInputItems(
colors.filter(item =>
item.toLowerCase().startsWith(inputValue.toLowerCase()),
),
)
setInputItems(
colors.filter(item =>
item.toLowerCase().startsWith(inputValue.toLowerCase()),
),
)
},
})
return (
Expand Down
68 changes: 59 additions & 9 deletions typings/index.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -363,9 +363,11 @@ export interface UseSelectProps<Item> {
state: UseSelectState<Item>,
actionAndChanges: UseSelectStateChangeOptions<Item>,
) => Partial<UseSelectState<Item>>
onSelectedItemChange?: (changes: UseSelectStateChange<Item>) => void
onIsOpenChange?: (changes: UseSelectStateChange<Item>) => void
onHighlightedIndexChange?: (changes: UseSelectStateChange<Item>) => void
onSelectedItemChange?: (changes: UseSelectSelectedItemChange<Item>) => void
onIsOpenChange?: (changes: UseSelectIsOpenChange<Item>) => void
onHighlightedIndexChange?: (
changes: UseSelectHighlightedIndexChange<Item>,
) => void
onStateChange?: (changes: UseSelectStateChange<Item>) => void
environment?: Environment
}
Expand All @@ -390,6 +392,21 @@ export interface UseSelectStateChange<Item>
type: UseSelectStateChangeTypes
}

export interface UseSelectSelectedItemChange<Item>
extends UseSelectStateChange<Item> {
selectedItem: Item
}

export interface UseSelectHighlightedIndexChange<Item>
extends UseSelectStateChange<Item> {
highlightedIndex: index
}

export interface UseSelectIsOpenChange<Item>
extends UseSelectStateChange<Item> {
isOpen: boolean
}

export interface UseSelectGetMenuPropsOptions
extends GetPropsWithRefKey,
GetMenuPropsOptions {}
Expand Down Expand Up @@ -565,11 +582,13 @@ export interface UseComboboxProps<Item> {
state: UseComboboxState<Item>,
actionAndChanges: UseComboboxStateChangeOptions<Item>,
) => Partial<UseComboboxState<Item>>
onSelectedItemChange?: (changes: UseComboboxStateChange<Item>) => void
onIsOpenChange?: (changes: UseComboboxStateChange<Item>) => void
onHighlightedIndexChange?: (changes: UseComboboxStateChange<Item>) => void
onSelectedItemChange?: (changes: UseComboboxSelectedItemChange<Item>) => void
onIsOpenChange?: (changes: UseComboboxIsOpenChange<Item>) => void
onHighlightedIndexChange?: (
changes: UseComboboxHighlightedIndexChange<Item>,
) => void
onStateChange?: (changes: UseComboboxStateChange<Item>) => void
onInputValueChange?: (changes: UseComboboxStateChange<Item>) => void
onInputValueChange?: (changes: UseComboboxInputValueChange<Item>) => void
environment?: Environment
}

Expand All @@ -593,6 +612,25 @@ export interface UseComboboxStateChange<Item>
type: UseComboboxStateChangeTypes
}

export interface UseComboboxSelectedItemChange<Item>
extends UseComboboxStateChange<Item> {
selectedItem: Item
}
export interface UseComboboxHighlightedIndexChange<Item>
extends UseComboboxStateChange<Item> {
highlightedIndex: index
}

export interface UseComboboxIsOpenChange<Item>
extends UseComboboxStateChange<Item> {
isOpen: boolean
}

export interface UseComboboxInputValueChange<Item>
extends UseComboboxStateChange<Item> {
inputValue: string
}

export interface UseComboboxGetMenuPropsOptions
extends GetPropsWithRefKey,
GetMenuPropsOptions {}
Expand Down Expand Up @@ -746,9 +784,11 @@ export interface UseMultipleSelectionProps<Item> {
activeIndex?: number
initialActiveIndex?: number
defaultActiveIndex?: number
onActiveIndexChange?: (changes: UseMultipleSelectionStateChange<Item>) => void
onActiveIndexChange?: (
changes: UseMultipleSelectionActiveIndexChange<Item>,
) => void
onSelectedItemsChange?: (
changes: UseMultipleSelectionStateChange<Item>,
changes: UseMultipleSelectionSelectedItemsChange<Item>,
) => void
onStateChange?: (changes: UseMultipleSelectionStateChange<Item>) => void
keyNavigationNext?: string
Expand All @@ -774,6 +814,16 @@ export interface UseMultipleSelectionStateChange<Item>
type: UseMultipleSelectionStateChangeTypes
}

export interface UseMultipleSelectionActiveIndexChange<Item>
extends UseMultipleSelectionStateChange<Item> {
activeIndex: number
}

export interface UseMultipleSelectionSelectedItemsChange<Item>
extends UseMultipleSelectionStateChange<Item> {
selectedItems: Item[]
}

export interface A11yRemovalMessage<Item> {
itemToString: (item: Item) => string
resultCount: number
Expand Down

0 comments on commit d2b42e8

Please sign in to comment.