Passed
Push — master ( 669be3...4762c7 )
by Guangyu
19:25 queued 10s
created

src/hooks/useBulkSelect.js   A

Complexity

Total Complexity 2
Complexity/F 0

Size

Lines of Code 38
Function Count 0

Duplication

Duplicated Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
wmc 2
eloc 31
mnd 2
bc 2
fnc 0
dl 0
loc 38
bpm 0
cpm 0
noi 0
c 0
b 0
f 0
rs 10
1
import { useEffect, useState } from 'react';
2
3
const useBulkSelect = items => {
4
  const [selectedItems, setSelectedItems] = useState([]);
5
  const [isAllSelected, setIsAllSelected] = useState(false);
6
  const [isIndeterminate, setIsIndeterminate] = useState(false);
7
8
  const toggleSelectedItem = id => {
9
    const isAlreadySelected = selectedItems.find(item => item === id);
10
    if (isAlreadySelected) {
11
      setSelectedItems(selectedItems.filter(item => item !== id));
12
    } else {
13
      setSelectedItems([...selectedItems, id]);
14
    }
15
  };
16
17
  const toggleIsAllSelected = () => {
18
    if (isAllSelected || isIndeterminate) {
19
      setSelectedItems([]);
20
    } else {
21
      setSelectedItems(items);
22
    }
23
  };
24
25
  const isSelectedItem = id => {
26
    return !!selectedItems.find(item => item === id);
27
  };
28
29
  useEffect(() => {
30
    setIsAllSelected(selectedItems.length === items.length);
31
    setIsIndeterminate(!!selectedItems.length && selectedItems.length < items.length);
32
  }, [selectedItems, items]);
33
34
  return { selectedItems, isAllSelected, isIndeterminate, toggleSelectedItem, toggleIsAllSelected, isSelectedItem };
35
};
36
37
export default useBulkSelect;
38