-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathRealtimeFlowBuilder.tsx
More file actions
62 lines (53 loc) · 1.88 KB
/
RealtimeFlowBuilder.tsx
File metadata and controls
62 lines (53 loc) · 1.88 KB
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
import React, { useEffect, useState, useRef } from 'react';
import ReactFlow, { useNodesState, useEdgesState, addEdge, Connection, Edge, Node } from 'reactflow';
import 'reactflow/dist/style.css';
import { setupRealtime } from '../utils/yjsRealtime';
export default function RealtimeFlowBuilder({ flowId }) {
const [nodes, setNodes, onNodesChange] = useNodesState([]);
const [edges, setEdges, onEdgesChange] = useEdgesState([]);
const [ready, setReady] = useState(false);
useEffect(() => {
const roomName = `flowmind-${flowId}`;
const { provider, yNodes, yEdges } = setupRealtime(roomName);
// Sync Yjs → React state
const syncNodes = () => setNodes([...yNodes.toArray()]);
const syncEdges = () => setEdges([...yEdges.toArray()]);
yNodes.observe(syncNodes);
yEdges.observe(syncEdges);
// First load
setNodes([...yNodes.toArray()]);
setEdges([...yEdges.toArray()]);
setReady(true);
// React → Yjs: update Yjs arrays on local changes
const unsubscribeNodes = onNodesChange((nextNodes) => {
yNodes.delete(0, yNodes.length);
yNodes.push([...nextNodes]);
});
const unsubscribeEdges = onEdgesChange((nextEdges) => {
yEdges.delete(0, yEdges.length);
yEdges.push([...nextEdges]);
});
return () => {
yNodes.unobserve(syncNodes);
yEdges.unobserve(syncEdges);
provider.destroy();
unsubscribeNodes();
unsubscribeEdges();
};
// eslint-disable-next-line
}, [flowId]);
if (!ready) return <div>Loading real-time collab…</div>;
const onConnect = (params: Edge | Connection) => setEdges((eds) => addEdge(params, eds));
return (
<div style={{ width: '100%', height: 600 }}>
<ReactFlow
nodes={nodes}
edges={edges}
onNodesChange={onNodesChange}
onEdgesChange={onEdgesChange}
onConnect={onConnect}
fitView
/>
</div>
);
}