UNPKG

@trellixio/roaster-coffee

Version:
61 lines (60 loc) 2.65 kB
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, }; }