useGraph.tsx 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. import { getChildrenEdges } from "src/utils/getChildrenEdges";
  2. import { getOutgoers } from "src/utils/getOutgoers";
  3. import create from "zustand";
  4. export interface Graph {
  5. nodes: NodeData[];
  6. edges: EdgeData[];
  7. collapsedNodes: string[];
  8. collapsedEdges: string[];
  9. collapsedParents: string[];
  10. }
  11. interface GraphActions {
  12. setGraphValue: (key: keyof Graph, value: any) => void;
  13. expandNodes: (nodeId: string) => void;
  14. collapseNodes: (nodeId: string) => void;
  15. }
  16. const initialStates: Graph = {
  17. nodes: [],
  18. edges: [],
  19. collapsedNodes: [],
  20. collapsedEdges: [],
  21. collapsedParents: [],
  22. };
  23. const useGraph = create<Graph & GraphActions>((set, get) => ({
  24. ...initialStates,
  25. setGraphValue: (key, value) =>
  26. set({
  27. collapsedNodes: [],
  28. collapsedEdges: [],
  29. [key]: value,
  30. }),
  31. expandNodes: nodeId => {
  32. const [childrenNodes, matchingNodes] = getOutgoers(
  33. nodeId,
  34. get().nodes,
  35. get().edges,
  36. get().collapsedParents
  37. );
  38. const childrenEdges = getChildrenEdges(childrenNodes, get().edges);
  39. const nodeIds = childrenNodes.map(node => node.id).concat(matchingNodes);
  40. const edgeIds = childrenEdges.map(edge => edge.id);
  41. const collapsedParents = get().collapsedParents.filter(cp => cp !== nodeId);
  42. const collapsedNodes = get().collapsedNodes.filter(
  43. nodeId => !nodeIds.includes(nodeId)
  44. );
  45. const collapsedEdges = get().collapsedEdges.filter(
  46. edgeId => !edgeIds.includes(edgeId)
  47. );
  48. set({
  49. collapsedParents,
  50. collapsedNodes,
  51. collapsedEdges,
  52. });
  53. },
  54. collapseNodes: nodeId => {
  55. const [childrenNodes] = getOutgoers(nodeId, get().nodes, get().edges);
  56. const childrenEdges = getChildrenEdges(childrenNodes, get().edges);
  57. const nodeIds = childrenNodes.map(node => node.id);
  58. const edgeIds = childrenEdges.map(edge => edge.id);
  59. set({
  60. collapsedParents: get().collapsedParents.concat(nodeId),
  61. collapsedNodes: get().collapsedNodes.concat(nodeIds),
  62. collapsedEdges: get().collapsedEdges.concat(edgeIds),
  63. });
  64. },
  65. }));
  66. export default useGraph;