UNPKG

@trellixio/roaster-coffee

Version:
69 lines (66 loc) 2.37 kB
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