PluginProbe
Code Snippets / 3.10.2
Code Snippets v3.10.2
4.0.0-beta.2 3.10.2 3.10.1 3.10.0 3.10.0-beta.2 3.10.0-beta.1 4.0.0-beta.1 3.9.6 trunk 2.10.0 2.10.1 2.12.0 2.12.1 2.13.0 2.13.1 2.13.2 2.13.3 2.14.0 2.14.1 2.14.2 2.14.3 2.14.4 2.14.5 2.14.6 3.0.0 All 65 releases
code-snippets / js / hooks / useSelection.ts

useSelection.ts in Code Snippets 3.10.2, at js/hooks/useSelection.ts

56 lines 1.2 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 import { useState } from 'react'
2
3 export interface UseSelection<T, K> {
4 selectAll: VoidFunction
5 toggleItem: (itemKey: K) => void
6 selectedItems: Set<K>
7 isAllSelected: boolean
8 availableItems: T[]
9 clearSelection: VoidFunction
10 getSelectedItems: () => T[]
11 }
12
13 export const useSelection = <T, K>(availableItems: T[], getKey: (item: T) => K): UseSelection<T, K> => {
14 const [selectedItems, setSelectedItems] = useState<Set<K>>(new Set())
15
16 const toggleItem = (itemKey: K) => {
17 const newSelected = new Set(selectedItems)
18
19 if (newSelected.has(itemKey)) {
20 newSelected.delete(itemKey)
21 } else {
22 newSelected.add(itemKey)
23 }
24
25 setSelectedItems(newSelected)
26 }
27
28 const selectAll = () => {
29 if (selectedItems.size === availableItems.length) {
30 clearSelection()
31 } else {
32 setSelectedItems(new Set(availableItems.map(getKey)))
33 }
34 }
35
36 const clearSelection = () => {
37 setSelectedItems(new Set())
38 }
39
40 const getSelectedItems = () =>
41 availableItems.filter(item =>
42 selectedItems.has(getKey(item)))
43
44 const isAllSelected = selectedItems.size === availableItems.length && 0 < availableItems.length
45
46 return {
47 availableItems,
48 selectedItems,
49 toggleItem,
50 selectAll,
51 clearSelection,
52 getSelectedItems,
53 isAllSelected
54 }
55 }
56