mirror of
https://github.com/vector-im/element-call.git
synced 2026-09-10 21:55:19 +00:00
review: Follow a swapped client
This commit is contained in:
@@ -13,11 +13,11 @@ import { type FC } from "react";
|
|||||||
|
|
||||||
import { ClientProvider, useClientState } from "./ClientContext";
|
import { ClientProvider, useClientState } from "./ClientContext";
|
||||||
|
|
||||||
const mockClient = (): MatrixClient =>
|
const mockClient = (userId = "@alice:example.org"): MatrixClient =>
|
||||||
({
|
({
|
||||||
on: vi.fn(),
|
on: vi.fn(),
|
||||||
removeListener: vi.fn(),
|
removeListener: vi.fn(),
|
||||||
getUserId: () => "@alice:example.org",
|
getUserId: () => userId,
|
||||||
getDeviceId: () => "AAAA",
|
getDeviceId: () => "AAAA",
|
||||||
stopClient: vi.fn(),
|
stopClient: vi.fn(),
|
||||||
}) as Partial<MatrixClient> as MatrixClient;
|
}) as Partial<MatrixClient> as MatrixClient;
|
||||||
@@ -67,3 +67,28 @@ test("does not claim exclusive use of storage when given a client", () => {
|
|||||||
|
|
||||||
postMessage.mockRestore();
|
postMessage.mockRestore();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test("follows the client when the host swaps it", () => {
|
||||||
|
const first = mockClient();
|
||||||
|
const second = mockClient("@bob:example.org");
|
||||||
|
|
||||||
|
const { container, rerender } = render(
|
||||||
|
<BrowserRouter>
|
||||||
|
<ClientProvider client={first}>
|
||||||
|
<ShowClientState />
|
||||||
|
</ClientProvider>
|
||||||
|
</BrowserRouter>,
|
||||||
|
);
|
||||||
|
expect(container.textContent).toBe("@alice:example.org");
|
||||||
|
|
||||||
|
// A host that re-authenticates hands us a new client on a mounted component
|
||||||
|
rerender(
|
||||||
|
<BrowserRouter>
|
||||||
|
<ClientProvider client={second}>
|
||||||
|
<ShowClientState />
|
||||||
|
</ClientProvider>
|
||||||
|
</BrowserRouter>,
|
||||||
|
);
|
||||||
|
|
||||||
|
expect(container.textContent).toBe("@bob:example.org");
|
||||||
|
});
|
||||||
|
|||||||
@@ -163,7 +163,14 @@ export const ClientProvider: FC<Props> = ({ children, client }) => {
|
|||||||
const initializing = useRef(false);
|
const initializing = useRef(false);
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (client !== undefined) {
|
if (client !== undefined) {
|
||||||
// Nothing to load, but analytics still need to follow the user's choices.
|
// Nothing to load, but a host may hand us a different client later — on
|
||||||
|
// re-authenticating, say — so follow whichever one it has given us.
|
||||||
|
setInitClientState((current) =>
|
||||||
|
current?.client === client
|
||||||
|
? current
|
||||||
|
: { client, passwordlessUser: false },
|
||||||
|
);
|
||||||
|
// Analytics still need to follow the user's choices.
|
||||||
if (PosthogAnalytics.instance.isEnabled())
|
if (PosthogAnalytics.instance.isEnabled())
|
||||||
PosthogAnalytics.instance.startListeningToSettingsChanges();
|
PosthogAnalytics.instance.startListeningToSettingsChanges();
|
||||||
return;
|
return;
|
||||||
|
|||||||
Reference in New Issue
Block a user