import clsx from 'clsx'; import { useCallback } from 'react'; import { IconGraphCollapse, IconGraphCore, IconGraphExpand, IconGraphInputs, IconGraphInverse, IconGraphMaximize, IconGraphOutputs, IconPredecessor, IconReset } from '@/components/Icons'; import { CProps } from '@/components/props'; import MiniButton from '@/components/ui/MiniButton'; import { Graph } from '@/models/Graph'; interface ToolbarGraphSelectionProps extends CProps.Styling { graph: Graph; selected: number[]; isCore: (item: number) => boolean; isOwned?: (item: number) => boolean; setSelected: (newSelection: number[]) => void; emptySelection?: boolean; } function ToolbarGraphSelection({ className, graph, selected, isCore, isOwned, setSelected, emptySelection, ...restProps }: ToolbarGraphSelectionProps) { const handleSelectCore = useCallback(() => { const core = [...graph.nodes.keys()].filter(isCore); setSelected([...core, ...graph.expandInputs(core)]); }, [setSelected, graph, isCore]); const handleSelectOwned = useCallback( () => (isOwned ? setSelected([...graph.nodes.keys()].filter(isOwned)) : undefined), [setSelected, graph, isOwned] ); const handleInvertSelection = useCallback( () => setSelected([...graph.nodes.keys()].filter(item => !selected.includes(item))), [setSelected, selected, graph] ); return (