Skip to content

Commit 523b642

Browse files
author
Dominik Piatek
committed
Fix spaces being set multiple times on init
1 parent 1e81850 commit 523b642

File tree

2 files changed

+26
-24
lines changed

2 files changed

+26
-24
lines changed

demo/src/components/SpacesContext.tsx

+22-17
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,38 @@
11
import * as React from 'react';
2+
import { AblyProvider } from '@ably-labs/react-hooks';
3+
24
import Spaces, { type Space } from '@ably/spaces';
35
import { Realtime } from 'ably';
46
import { nanoid } from 'nanoid';
57

68
import { getSpaceNameFromUrl } from '../utils';
79

8-
const clientId = nanoid();
9-
10-
export const ably = new Realtime.Promise({
11-
authUrl: `/api/ably-token-request?clientId=${clientId}`,
12-
clientId,
13-
});
14-
15-
const spaces = new Spaces(ably);
16-
1710
export const SpacesContext = React.createContext<Space | undefined>(undefined);
1811

1912
const SpaceContextProvider: React.FC<{ children: React.ReactNode }> = ({ children }) => {
2013
const [space, setSpace] = React.useState<Space | undefined>(undefined);
14+
const spaceName = getSpaceNameFromUrl();
15+
16+
const [spaces, ably] = React.useMemo(() => {
17+
const clientId = nanoid();
18+
19+
const ably = new Realtime.Promise({
20+
authUrl: `/api/ably-token-request?clientId=${clientId}`,
21+
clientId,
22+
});
23+
24+
return [new Spaces(ably), ably];
25+
}, []);
2126

2227
React.useEffect(() => {
23-
let ignore: boolean = false;
28+
let ignore = false;
2429

2530
const init = async () => {
26-
if (ignore) {
27-
return;
28-
}
29-
3031
const spaceInstance = await spaces.get(getSpaceNameFromUrl(), {
3132
offlineTimeout: 10_000,
3233
});
3334

34-
if (spaceInstance && !space) {
35+
if (spaceInstance && !space && !ignore) {
3536
setSpace(spaceInstance);
3637
}
3738
};
@@ -41,9 +42,13 @@ const SpaceContextProvider: React.FC<{ children: React.ReactNode }> = ({ childre
4142
return () => {
4243
ignore = true;
4344
};
44-
});
45+
}, [spaceName, spaces]);
4546

46-
return <SpacesContext.Provider value={space}>{children}</SpacesContext.Provider>;
47+
return (
48+
<AblyProvider client={ably}>
49+
<SpacesContext.Provider value={space}>{children}</SpacesContext.Provider>{' '}
50+
</AblyProvider>
51+
);
4752
};
4853

4954
export { SpaceContextProvider };

demo/src/main.tsx

+4-7
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,19 @@
11
import React from 'react';
22
import ReactDOM from 'react-dom/client';
3-
import { AblyProvider } from '@ably-labs/react-hooks';
43
import App from './App';
54
import './index.css';
65

7-
import { ably, SpaceContextProvider } from './components';
6+
import { SpaceContextProvider } from './components';
87
import { SlidesStateContextProvider } from './components/SlidesStateContext.tsx';
98

109
const root = ReactDOM.createRoot(document.getElementById('root') as HTMLElement);
1110

1211
root.render(
1312
<React.StrictMode>
1413
<SpaceContextProvider>
15-
<AblyProvider client={ably}>
16-
<SlidesStateContextProvider>
17-
<App />
18-
</SlidesStateContextProvider>
19-
</AblyProvider>
14+
<SlidesStateContextProvider>
15+
<App />
16+
</SlidesStateContextProvider>
2017
</SpaceContextProvider>
2118
</React.StrictMode>,
2219
);

0 commit comments

Comments
 (0)