in packages/graph-explorer/src/hooks/useRemoveFromGraph.ts [20:87]
export function useRemoveFromGraph() {
const setVertices = useSetAtom(nodesAtom);
const setEdges = useSetAtom(edgesAtom);
const setSelectedVertices = useSetAtom(nodesSelectedIdsAtom);
const setSelectedEdges = useSetAtom(edgesSelectedIdsAtom);
const setOutOfFocusVertices = useSetAtom(nodesOutOfFocusIdsAtom);
const setOutOfFocusEdges = useSetAtom(edgesOutOfFocusIdsAtom);
const setFilteredVertices = useSetAtom(nodesFilteredIdsAtom);
const setFilteredEdges = useSetAtom(edgesFilteredIdsAtom);
const allEdges = useAtomValue(edgesAtom);
const updateGraphStorage = useUpdateGraphSession();
return useCallback(
async (entities: { vertices?: VertexId[]; edges?: EdgeId[] }) => {
const vertices = new Set(entities.vertices ?? []);
const edges = new Set(entities.edges ?? []);
// Ensure there is something to remove
if (vertices.size === 0 && edges.size === 0) {
return;
}
// Find associated edges for removed vertices
const associatedEdges = new Set(
allEdges
.entries()
.filter(
([_id, edge]) =>
vertices.has(edge.source) || vertices.has(edge.target)
)
.map(([id]) => id)
);
const edgesToRemove = edges.union(associatedEdges);
// Remove vertices
if (vertices.size > 0) {
setVertices(prev => deleteFromMap(prev, vertices));
setSelectedVertices(prev => prev.difference(vertices));
setOutOfFocusVertices(prev => prev.difference(vertices));
setFilteredVertices(prev => prev.difference(vertices));
}
// Remove edges
if (edgesToRemove.size > 0) {
setEdges(prev => deleteFromMap(prev, edgesToRemove));
setSelectedEdges(prev => prev.difference(edgesToRemove));
setOutOfFocusEdges(prev => prev.difference(edgesToRemove));
setFilteredEdges(prev => prev.difference(edgesToRemove));
}
await updateGraphStorage();
},
[
allEdges,
updateGraphStorage,
setVertices,
setSelectedVertices,
setOutOfFocusVertices,
setFilteredVertices,
setEdges,
setSelectedEdges,
setOutOfFocusEdges,
setFilteredEdges,
]
);
}