Skip to content

Commit 08cdbaf

Browse files
committed
fixes websockets loading before env eval
1 parent 45d1a37 commit 08cdbaf

File tree

6 files changed

+57
-59
lines changed

6 files changed

+57
-59
lines changed

nakar-client-web/src/components/room/Canvas.tsx

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { useContext, useEffect, useState } from "react";
1+
import { useEffect, useState } from "react";
22
import { Edge, GraphLabel, Node } from "../../../src-gen";
33
import { Labels } from "./Labels.tsx";
44
import { GraphRendererD3 } from "./GraphRendererD3.tsx";
@@ -7,18 +7,22 @@ import { Stack } from "react-bootstrap";
77
import { GraphRendererEngine } from "../../lib/graph-renderer/GraphRendererEngine.ts";
88
import { NodeDetails } from "./NodeDetails.tsx";
99
import { EdgeDetails } from "./EdgeDetails.tsx";
10-
import { WebSocketsManagerContext } from "../../lib/ws/WebSocketsManagerContext.ts";
10+
import { WebSocketsManager } from "../../lib/ws/WebSocketsManager.ts";
1111

12-
export function Canvas(props: { renderer: GraphRendererEngine }) {
13-
const webSocketsManager = useContext(WebSocketsManagerContext);
12+
export function Canvas(props: {
13+
renderer: GraphRendererEngine;
14+
webSocketsManager: WebSocketsManager;
15+
}) {
1416
const [detailsNode, setDetailsNode] = useState<Node | null>(null);
1517
const [detailsEdge, setDetailsEdge] = useState<Edge | null>(null);
1618
const [graphLabels, setGraphLabels] = useState<GraphLabel[]>([]);
1719

1820
useEffect(() => {
19-
const s1 = webSocketsManager.onScenarioDataChanged$.subscribe((sd) => {
20-
setGraphLabels(sd.graph.metaData.labels);
21-
});
21+
const s1 = props.webSocketsManager.onScenarioDataChanged$.subscribe(
22+
(sd) => {
23+
setGraphLabels(sd.graph.metaData.labels);
24+
},
25+
);
2226

2327
return () => {
2428
s1.unsubscribe();
@@ -32,6 +36,7 @@ export function Canvas(props: { renderer: GraphRendererEngine }) {
3236
>
3337
{props.renderer === "d3" && (
3438
<GraphRendererD3
39+
webSockets={props.webSocketsManager}
3540
onNodeClicked={(n) => {
3641
setDetailsNode(n);
3742
setDetailsEdge(null);

nakar-client-web/src/components/room/GraphRendererD3.tsx

Lines changed: 29 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,47 +1,47 @@
1-
import { createRef, useContext, useEffect, useState } from "react";
1+
import { createRef, useEffect, useState } from "react";
22
import { useTheme } from "../../lib/theme/useTheme.ts";
33
import { D3Renderer } from "../../lib/d3/D3Renderer.ts";
4-
import { WebSocketsManagerContext } from "../../lib/ws/WebSocketsManagerContext.ts";
54
import { Node, Edge } from "../../../src-gen";
5+
import { WebSocketsManager } from "../../lib/ws/WebSocketsManager.ts";
66

77
export function GraphRendererD3(props: {
88
onNodeClicked: (node: Node) => void;
99
onEdgeClicked: (edge: Edge) => void;
10+
webSockets: WebSocketsManager;
1011
}) {
1112
const svgRef = createRef<SVGSVGElement>();
1213
const theme = useTheme();
1314
const [graphRenderer] = useState(new D3Renderer(theme));
14-
const webSockets = useContext(WebSocketsManagerContext);
1515

1616
useEffect(() => {
17-
const s1 = webSockets.onScenarioDataChanged$.subscribe((scenraioData) => {
18-
graphRenderer.loadGraphContent(scenraioData.graph);
19-
});
20-
const s2 = graphRenderer.onNodesMoved(() => {
21-
webSockets.sendMessage({
22-
type: "WSActionMoveNodes",
23-
nodes: graphRenderer.graphState.nodes.map((n) => ({
24-
id: n.id,
25-
position: { x: n.x, y: n.y },
26-
})),
27-
});
28-
});
29-
const s3 = webSockets.onNodesMoved$.subscribe((onMove) => {
30-
graphRenderer.updateNodePositions(onMove);
31-
});
32-
const s4 = graphRenderer.onDisplayNodeData((n) => {
33-
props.onNodeClicked(n);
34-
});
35-
const s5 = graphRenderer.onDisplayLinkData((l) => {
36-
props.onEdgeClicked(l);
37-
});
17+
const supscriptions = [
18+
props.webSockets.onScenarioDataChanged$.subscribe((scenraioData) => {
19+
graphRenderer.loadGraphContent(scenraioData.graph);
20+
}),
21+
graphRenderer.onNodesMoved(() => {
22+
props.webSockets.sendMessage({
23+
type: "WSActionMoveNodes",
24+
nodes: graphRenderer.graphState.nodes.map((n) => ({
25+
id: n.id,
26+
position: { x: n.x, y: n.y },
27+
})),
28+
});
29+
}),
30+
props.webSockets.onNodesMoved$.subscribe((onMove) => {
31+
graphRenderer.updateNodePositions(onMove);
32+
}),
33+
graphRenderer.onDisplayNodeData((n) => {
34+
props.onNodeClicked(n);
35+
}),
36+
graphRenderer.onDisplayLinkData((l) => {
37+
props.onEdgeClicked(l);
38+
}),
39+
];
3840

3941
return () => {
40-
s1.unsubscribe();
41-
s2.unsubscribe();
42-
s3.unsubscribe();
43-
s4.unsubscribe();
44-
s5.unsubscribe();
42+
supscriptions.forEach((s) => {
43+
s.unsubscribe();
44+
});
4545
};
4646
}, []);
4747

nakar-client-web/src/components/room/ToastStack.tsx

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
11
import { Toast, ToastContainer } from "react-bootstrap";
2-
import { useContext, useEffect, useState } from "react";
3-
import { WebSocketsManagerContext } from "../../lib/ws/WebSocketsManagerContext.ts";
2+
import { useEffect, useState } from "react";
43
import { v4 } from "uuid";
4+
import { WebSocketsManager } from "../../lib/ws/WebSocketsManager.ts";
55

6-
export function ToastStack() {
6+
export function ToastStack(props: { websocketsManager: WebSocketsManager }) {
77
const [message, setMessages] = useState<ToastMessage[]>([]);
8-
const websocketsManager = useContext(WebSocketsManagerContext);
98

109
const pushMessage = (message: ToastMessage) => {
1110
setMessages((messages: ToastMessage[]): ToastMessage[] => [
@@ -23,31 +22,31 @@ export function ToastStack() {
2322

2423
useEffect(() => {
2524
const subscriptions = [
26-
websocketsManager.onScenarioDataChanged$.subscribe((event) => {
25+
props.websocketsManager.onScenarioDataChanged$.subscribe((event) => {
2726
pushMessage({
2827
id: v4(),
2928
message: `Scenario loaded: ${event.scenarioTitle}`,
3029
date: new Date(event.date),
3130
title: "Graph",
3231
});
3332
}),
34-
websocketsManager.onError$.subscribe((event) => {
33+
props.websocketsManager.onError$.subscribe((event) => {
3534
pushMessage({
3635
id: v4(),
3736
message: event.message,
3837
date: new Date(event.date),
3938
title: "Error",
4039
});
4140
}),
42-
websocketsManager.onUserJoined$.subscribe((event) => {
41+
props.websocketsManager.onUserJoined$.subscribe((event) => {
4342
pushMessage({
4443
id: v4(),
4544
message: `User ${event.userName} joined the room.`,
4645
date: new Date(event.date),
4746
title: "User joined",
4847
});
4948
}),
50-
websocketsManager.onUserLeft$.subscribe((event) => {
49+
props.websocketsManager.onUserLeft$.subscribe((event) => {
5150
pushMessage({
5251
id: v4(),
5352
message: `User ${event.userName} left the room. (${event.message})`,

nakar-client-web/src/lib/ws/WebSocketsManagerContext.ts

Lines changed: 0 additions & 4 deletions
This file was deleted.

nakar-client-web/src/lib/ws/useWebSocketsState.ts

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
import { SocketState } from "./SocketState.ts";
2-
import { useContext, useEffect, useState } from "react";
3-
import { WebSocketsManagerContext } from "./WebSocketsManagerContext.ts";
2+
import { useEffect, useState } from "react";
3+
import { WebSocketsManager } from "./WebSocketsManager.ts";
44

5-
export function useWebSocketsState(): SocketState {
6-
const manager = useContext(WebSocketsManagerContext);
5+
export function useWebSocketsState(manager: WebSocketsManager): SocketState {
76
const [current, setCurrent] = useState<SocketState>(manager.socketState);
87

98
useEffect(() => {

nakar-client-web/src/pages/Room.tsx

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,14 @@ import { SideToolbar } from "../components/room/SideToolbar.tsx";
44
import { DatabaseList } from "../components/room/DatabaseList.tsx";
55
import { Canvas } from "../components/room/Canvas.tsx";
66
import { DataTable } from "../components/room/DataTable.tsx";
7-
import { useContext, useEffect, useState } from "react";
7+
import { useEffect, useState } from "react";
88
import { Room as RoomSchema, getRoom } from "../../src-gen";
99
import { LoaderFunctionArgs, useLoaderData } from "react-router";
1010
import { resultOrThrow } from "../lib/data/resultOrThrow.ts";
1111
import { GraphRendererEngine } from "../lib/graph-renderer/GraphRendererEngine.ts";
12-
1312
import { useWebSocketsState } from "../lib/ws/useWebSocketsState.ts";
14-
import { WebSocketsManagerContext } from "../lib/ws/WebSocketsManagerContext.ts";
1513
import { ToastStack } from "../components/room/ToastStack.tsx";
14+
import { WebSocketsManager } from "../lib/ws/WebSocketsManager.ts";
1615

1716
export async function RoomLoader(
1817
args: LoaderFunctionArgs,
@@ -36,8 +35,8 @@ export function Room() {
3635
const [tableDataOpened, setTableDataOpened] = useState(false);
3736
const [scenarioLoading, setScenarioLoading] = useState<string | null>(null);
3837
const [renderer, setRenderer] = useState<GraphRendererEngine>("d3");
39-
const socketState = useWebSocketsState();
40-
const webSockets = useContext(WebSocketsManagerContext);
38+
const [webSockets] = useState(new WebSocketsManager());
39+
const socketState = useWebSocketsState(webSockets);
4140

4241
useEffect(() => {
4342
if (socketState.type === "connected") {
@@ -97,7 +96,7 @@ export function Room() {
9796
onChange: setRenderer,
9897
}}
9998
></AppNavbar>
100-
<ToastStack></ToastStack>
99+
<ToastStack websocketsManager={webSockets}></ToastStack>
101100
<Stack
102101
direction={"horizontal"}
103102
className={"align-items-stretch flex-grow-1"}
@@ -117,7 +116,7 @@ export function Room() {
117116
></DatabaseList>
118117
)}
119118
</SideToolbar>
120-
<Canvas renderer={renderer}></Canvas>
119+
<Canvas renderer={renderer} webSocketsManager={webSockets}></Canvas>
121120
<SideToolbar hidden={!tableDataOpened} width={700}>
122121
{() => <DataTable tableData={tableData}></DataTable>}
123122
</SideToolbar>

0 commit comments

Comments
 (0)