feat(general): add defaultNodes, defaultEdges and defaultEdgeOptions
This commit is contained in:
@@ -25,7 +25,7 @@ export default ({ deleteKeyCode, multiSelectionKeyCode }: HookParams): void => {
|
||||
const multiSelectionKeyPressed = useKeyPress(multiSelectionKeyCode);
|
||||
|
||||
useEffect(() => {
|
||||
const { nodeInternals, edges } = store.getState();
|
||||
const { nodeInternals, edges, isControlled } = store.getState();
|
||||
// @TODO: work with nodeInternals instead of converting it to an array
|
||||
const nodes = Array.from(nodeInternals).map(([_, node]) => node);
|
||||
const selectedNodes = nodes.filter((n) => n.selected);
|
||||
@@ -33,15 +33,27 @@ export default ({ deleteKeyCode, multiSelectionKeyCode }: HookParams): void => {
|
||||
|
||||
if (deleteKeyPressed && (selectedNodes || selectedEdges)) {
|
||||
const connectedEdges = getConnectedEdges(selectedNodes, edges);
|
||||
const edgeIdsToRemove = [...selectedEdges, ...connectedEdges].map((e) => e.id);
|
||||
|
||||
const nodeChanges: NodeChange[] = selectedNodes.map((n) => ({ id: n.id, type: 'remove' }));
|
||||
const edgeChanges: EdgeChange[] = [...selectedEdges, ...connectedEdges].map((e) => ({
|
||||
id: e.id,
|
||||
type: 'remove',
|
||||
}));
|
||||
if (isControlled) {
|
||||
selectedNodes.forEach((node) => {
|
||||
nodeInternals.delete(node.id);
|
||||
});
|
||||
|
||||
onNodesChange?.(nodeChanges);
|
||||
onEdgesChange?.(edgeChanges);
|
||||
store.setState({
|
||||
nodeInternals: new Map(nodeInternals),
|
||||
edges: edges.filter((e) => !edgeIdsToRemove.includes(e.id)),
|
||||
});
|
||||
} else {
|
||||
const nodeChanges: NodeChange[] = selectedNodes.map((n) => ({ id: n.id, type: 'remove' }));
|
||||
const edgeChanges: EdgeChange[] = edgeIdsToRemove.map((id) => ({
|
||||
id,
|
||||
type: 'remove',
|
||||
}));
|
||||
|
||||
onNodesChange?.(nodeChanges);
|
||||
onEdgesChange?.(edgeChanges);
|
||||
}
|
||||
|
||||
store.setState({ nodesSelectionActive: false });
|
||||
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
import { useMemo } from 'react';
|
||||
import { useStoreApi } from '../store';
|
||||
import { Edge } from '../types';
|
||||
|
||||
type FunctionParams<T> = (nodes: Edge<T>[], setEdges: (nodes: Edge<T>[]) => void) => void;
|
||||
|
||||
function useUpdateEdges<T>() {
|
||||
const store = useStoreApi();
|
||||
|
||||
const update = useMemo(() => {
|
||||
return (action: FunctionParams<T>): void => {
|
||||
const { edges, setEdges } = store.getState();
|
||||
|
||||
if (typeof action === 'function') {
|
||||
action(edges, setEdges);
|
||||
}
|
||||
};
|
||||
}, []);
|
||||
|
||||
return update;
|
||||
}
|
||||
|
||||
export default useUpdateEdges;
|
||||
@@ -0,0 +1,24 @@
|
||||
import { useMemo } from 'react';
|
||||
import { useStoreApi } from '../store';
|
||||
import { Node } from '../types';
|
||||
|
||||
type FunctionParams<T> = (nodes: Node<T>[], setNodes: (nodes: Node<T>[]) => void) => void;
|
||||
|
||||
function useUpdateNodes<T>() {
|
||||
const store = useStoreApi();
|
||||
|
||||
const update = useMemo(() => {
|
||||
return (action: FunctionParams<T>): void => {
|
||||
const { nodeInternals, setNodes } = store.getState();
|
||||
const nodes = Array.from(nodeInternals.values()) as Node<T>[];
|
||||
|
||||
if (typeof action === 'function') {
|
||||
action(nodes, setNodes);
|
||||
}
|
||||
};
|
||||
}, []);
|
||||
|
||||
return update;
|
||||
}
|
||||
|
||||
export default useUpdateNodes;
|
||||
Reference in New Issue
Block a user