File size: 1,776 Bytes
03fbff6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
// Like described in https://reactflow.dev/learn/advanced-use/state-management
// but with https://github.com/joebobmiles/zustand-middleware-yjs/ added.
import {
  type Edge,
  type Node,
  type OnNodesChange,
  type OnEdgesChange,
  type OnConnect,
} from '@xyflow/react';
import * as apiTypes from "../apiTypes.ts";
import * as Y from "yjs";
import yjs from "zustand-middleware-yjs";
export const doc = new Y.Doc();

export type FlowState = {
  env: string;
  nodes: apiTypes.WorkspaceNode[];
  edges: apiTypes.WorkspaceEdge[];
  onNodesChange: OnNodesChange<Node>;
  onEdgesChange: OnEdgesChange;
  onConnect: OnConnect;
  setNodes: (nodes: Node[]) => void;
  setEdges: (edges: Edge[]) => void;
  setEnv: (env: string) => void;
};

import { create } from 'zustand';
import { addEdge, applyNodeChanges, applyEdgeChanges } from '@xyflow/react';

export const useStore = create<FlowState>(yjs(doc, "shared", (set: any, get: any) => ({
  env: 'LynxKite',
  nodes: [],
  edges: [],
  onNodesChange: (changes: any[]) => {
    set({
      nodes: applyNodeChanges(changes, get().nodes),
    });
  },
  onEdgesChange: (changes: any[]) => {
    set({
      edges: applyEdgeChanges(changes, get().edges),
    });
  },
  onConnect: (connection: any) => {
    set({
      edges: addEdge(connection, get().edges),
    });
  },
  setNodes: (nodes: Node[]) => {
    console.log("setNodes", { nodes });
    set({ nodes });
  },
  setEdges: (edges: Edge[]) => {
    set({ edges });
  },
  setEnv: (env: string) => {
    set({ env });
  },
})));

export const selector = (state: FlowState) => ({
  nodes: state.nodes,
  edges: state.edges,
  env: state.env,
  onNodesChange: state.onNodesChange,
  onEdgesChange: state.onEdgesChange,
  onConnect: state.onConnect,
  setEnv: state.setEnv,
});