import { useState } from 'react' export interface UseSelection { selectAll: VoidFunction toggleItem: (itemKey: K) => void selectedItems: Set isAllSelected: boolean availableItems: T[] clearSelection: VoidFunction getSelectedItems: () => T[] } export const useSelection = (availableItems: T[], getKey: (item: T) => K): UseSelection => { const [selectedItems, setSelectedItems] = useState>(new Set()) const toggleItem = (itemKey: K) => { const newSelected = new Set(selectedItems) if (newSelected.has(itemKey)) { newSelected.delete(itemKey) } else { newSelected.add(itemKey) } setSelectedItems(newSelected) } const selectAll = () => { if (selectedItems.size === availableItems.length) { clearSelection() } else { setSelectedItems(new Set(availableItems.map(getKey))) } } const clearSelection = () => { setSelectedItems(new Set()) } const getSelectedItems = () => availableItems.filter(item => selectedItems.has(getKey(item))) const isAllSelected = selectedItems.size === availableItems.length && 0 < availableItems.length return { availableItems, selectedItems, toggleItem, selectAll, clearSelection, getSelectedItems, isAllSelected } }