@trellixio/roaster-coffee
Version:
Beans' product component library
69 lines (66 loc) • 2.37 kB
JavaScript
import * as React from 'react';
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`"
);
}
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 === "single" /* Single */) {
setSelectedResources((newSelectedResources) => [...newSelectedResources, selection.toString()]);
}
if (selectionType === "all" /* All */ || selectionType === "page" /* Page */) {
if (allResourcesSelected) {
clearSelection();
} else {
setSelectedResources(resources.map(resourceIDResolver));
setAllResourcesSelected(true);
}
}
}
},
[allResourcesSelected, selectedResources.length, resources, resourceIDResolver]
);
return {
selectedResources,
allResourcesSelected,
handleSelectionChange,
clearSelection,
removeResource
};
}
export { useSelectableResourceState };
//# sourceMappingURL=index.js.map