ahooks
Version:
react hooks library
74 lines • 2.15 kB
JavaScript
import { __read } from "tslib";
import { useMemo, useState } from 'react';
import useMemoizedFn from '../useMemoizedFn';
export default function useSelections(items, defaultSelected) {
if (defaultSelected === void 0) {
defaultSelected = [];
}
var _a = __read(useState(defaultSelected), 2),
selected = _a[0],
setSelected = _a[1];
var selectedSet = useMemo(function () {
return new Set(selected);
}, [selected]);
var isSelected = function (item) {
return selectedSet.has(item);
};
var select = function (item) {
selectedSet.add(item);
return setSelected(Array.from(selectedSet));
};
var unSelect = function (item) {
selectedSet.delete(item);
return setSelected(Array.from(selectedSet));
};
var toggle = function (item) {
if (isSelected(item)) {
unSelect(item);
} else {
select(item);
}
};
var selectAll = function () {
items.forEach(function (o) {
selectedSet.add(o);
});
setSelected(Array.from(selectedSet));
};
var unSelectAll = function () {
items.forEach(function (o) {
selectedSet.delete(o);
});
setSelected(Array.from(selectedSet));
};
var noneSelected = useMemo(function () {
return items.every(function (o) {
return !selectedSet.has(o);
});
}, [items, selectedSet]);
var allSelected = useMemo(function () {
return items.every(function (o) {
return selectedSet.has(o);
}) && !noneSelected;
}, [items, selectedSet, noneSelected]);
var partiallySelected = useMemo(function () {
return !noneSelected && !allSelected;
}, [noneSelected, allSelected]);
var toggleAll = function () {
return allSelected ? unSelectAll() : selectAll();
};
return {
selected: selected,
noneSelected: noneSelected,
allSelected: allSelected,
partiallySelected: partiallySelected,
setSelected: setSelected,
isSelected: isSelected,
select: useMemoizedFn(select),
unSelect: useMemoizedFn(unSelect),
toggle: useMemoizedFn(toggle),
selectAll: useMemoizedFn(selectAll),
unSelectAll: useMemoizedFn(unSelectAll),
toggleAll: useMemoizedFn(toggleAll)
};
}