frontend client for gemstone. decentralised workplace app

fix: wrap in hooks to prevent retrying connections at the start

serenity 1f0b7387 4d21ceaf

Changed files
+25 -11
src
providers
+25 -11
src/providers/authed/SessionsProvider.tsx
···
import { useHandshakes } from "@/providers/authed/HandshakesProvider";
import { useQueries } from "@tanstack/react-query";
import type { ReactNode } from "react";
-
import { createContext, useContext } from "react";
+
import { createContext, useContext, useEffect, useState } from "react";
type SessionsMap = Map<LatticeSessionInfo, WebSocket>;
···
return await endpointQueryFn(handshake);
},
staleTime: DEFAULT_STALE_TIME,
+
retries: false,
})),
});
···
handshakesInitialising || endpointQueries.some((q) => q.isLoading);
const error = endpointQueries.find((q) => q.error)?.error ?? null;
-
const sessionsMap = new Map<LatticeSessionInfo, WebSocket>();
+
const [sessionsMap] = useState<Map<LatticeSessionInfo, WebSocket>>(
+
new Map<LatticeSessionInfo, WebSocket>(),
+
);
+
console.log(sessionsMap);
-
endpointQueries.forEach((q) => {
-
const endpoint = q.data;
-
if (!endpoint) return;
-
const { sessionInfo, shardUrl } = endpoint;
-
const websocket = connectToLattice({
-
shardUrl,
-
sessionToken: sessionInfo.token,
+
useEffect(() => {
+
endpointQueries.forEach((q) => {
+
const endpoint = q.data;
+
if (!endpoint) return;
+
const { sessionInfo, shardUrl } = endpoint;
+
const existingWs = sessionsMap.get(sessionInfo);
+
if (existingWs) return;
+
console.log(
+
"Initiating lattice connection to",
+
shardUrl,
+
"with sessionToken",
+
sessionInfo.token,
+
);
+
const websocket = connectToLattice({
+
shardUrl,
+
sessionToken: sessionInfo.token,
+
});
+
sessionsMap.set(sessionInfo, websocket);
});
-
sessionsMap.set(sessionInfo, websocket);
-
});
+
}, [sessionsMap, endpointQueries]);
const value: SessionsContextValue = {
sessionsMap,