@project44-manifest/react
Version:
Manifest Design System react components
40 lines (36 loc) • 1.14 kB
text/typescript
import * as React from 'react';
import { useMenuTriggerState } from '@react-stately/menu';
import type { MultiSelectProps, MultiSelectState } from '../../types';
import { useMultiSelectListState } from '../useMultiSelectListState/useMultiSelectListState';
/**
* Pulled directly from the following library and augmented for our needs:
*
* https://github.com/so99ynoodles/headless-react/blob/main/packages/select/src/hooks/useMultiSelectState.tsx
*/
export function useMultiSelectState<T extends object>(
props: MultiSelectProps<T>,
): MultiSelectState<T> {
const [isFocused, setFocused] = React.useState(false);
const triggerState = useMenuTriggerState(props);
const listState = useMultiSelectListState(props);
return {
...listState,
...triggerState,
close() {
triggerState.close();
},
open() {
// Don't open if the collection is empty.
if (listState.collection.size > 0) {
triggerState.open();
}
},
toggle(focusStrategy) {
if (listState.collection.size > 0) {
triggerState.toggle(focusStrategy);
}
},
isFocused,
setFocused,
};
}