@trellixio/roaster-coffee
Version:
Beans' product component library
61 lines (60 loc) • 2.65 kB
JavaScript
import * as React from 'react';
export var SelectionType;
(function (SelectionType) {
SelectionType["All"] = "all";
SelectionType["Page"] = "page";
SelectionType["Single"] = "single";
})(SelectionType || (SelectionType = {}));
function defaultResourceIDResolver(resource) {
if ('id' in resource) {
return resource.id.toString();
}
throw new Error('Your resource does not directly contain an `id`. Pass a `resourceIDResolver` to `useSelectableResourceState`');
}
export function useSelectableResourceState(resources, { selectedResources: initSelectedResources = [], allResourcesSelected: initAllResourcesSelected = false, resourceIDResolver = defaultResourceIDResolver, } = {
selectedResources: [],
allResourcesSelected: false,
resourceIDResolver: defaultResourceIDResolver,
}) {
const [selectedResources, setSelectedResources] = React.useState(initSelectedResources);
const [allResourcesSelected, setAllResourcesSelected] = React.useState(initAllResourcesSelected);
const removeResource = React.useCallback((resource) => {
const selectedResourcesCopy = [...selectedResources];
const newSelectedResources = selectedResourcesCopy.filter((currentResource) => currentResource !== resource);
setSelectedResources(newSelectedResources);
if (newSelectedResources.length === 0) {
setAllResourcesSelected(false);
}
}, [selectedResources]);
const clearSelection = React.useCallback(() => {
setSelectedResources([]);
setAllResourcesSelected(false);
}, []);
const handleSelectionChange = React.useCallback((selectionType, selection) => {
if (selectedResources.includes(selection)) {
removeResource(selection);
setAllResourcesSelected(false);
}
else {
if (selectionType === SelectionType.Single) {
setSelectedResources((newSelectedResources) => [...newSelectedResources, selection.toString()]);
}
if (selectionType === SelectionType.All || selectionType === SelectionType.Page) {
if (allResourcesSelected) {
clearSelection();
}
else {
setSelectedResources(resources.map(resourceIDResolver));
setAllResourcesSelected(true);
}
}
}
}, [allResourcesSelected, selectedResources.length, resources, resourceIDResolver]);
return {
selectedResources,
allResourcesSelected,
handleSelectionChange,
clearSelection,
removeResource,
};
}