useGraph.tsx 1.7 KB

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