review: Follow a swapped client

This commit is contained in:
Valere
2026-09-02 19:27:44 +02:00
parent c807b8ef7d
commit b7efa02adc
2 changed files with 35 additions and 3 deletions
+27 -2
View File
@@ -13,11 +13,11 @@ import { type FC } from "react";
import { ClientProvider, useClientState } from "./ClientContext";
const mockClient = (): MatrixClient =>
const mockClient = (userId = "@alice:example.org"): MatrixClient =>
({
on: vi.fn(),
removeListener: vi.fn(),
getUserId: () => "@alice:example.org",
getUserId: () => userId,
getDeviceId: () => "AAAA",
stopClient: vi.fn(),
}) as Partial<MatrixClient> as MatrixClient;
@@ -67,3 +67,28 @@ test("does not claim exclusive use of storage when given a client", () => {
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");
});
+8 -1
View File
@@ -163,7 +163,14 @@ export const ClientProvider: FC<Props> = ({ children, client }) => {
const initializing = useRef(false);
useEffect(() => {
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())
PosthogAnalytics.instance.startListeningToSettingsChanges();
return;