Skip to content

Commit 16020b2

Browse files
authored
fix(core): premature wallets detection (#743)
1 parent 90494c9 commit 16020b2

3 files changed

Lines changed: 38 additions & 0 deletions

File tree

.changeset/forty-wombats-look.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@reactive-dot/core": patch
3+
---
4+
5+
Fixed an issue where wallets could be detected prematurely before the document finished loading.

packages/core/src/wallets/injected/provider.test.ts

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
// @vitest-environment jsdom
12
import { InjectedWalletProvider } from "./provider.js";
23
import { InjectedWallet } from "./wallet.js";
34
import { getInjectedExtensions } from "polkadot-api/pjs-signer";
@@ -39,3 +40,29 @@ it("should pass options to created wallets", async () => {
3940
// @ts-expect-error for testing purposes
4041
expect(wallets[0]?.options).toEqual(options);
4142
});
43+
44+
it("should wait for load event when document is not complete", async () => {
45+
const mockExtensions = ["ext1", "ext2"];
46+
vi.mocked(getInjectedExtensions).mockReturnValue(mockExtensions);
47+
48+
Object.defineProperty(document, "readyState", {
49+
value: "loading",
50+
configurable: true,
51+
});
52+
53+
const provider = new InjectedWalletProvider();
54+
const getWalletsPromise = provider.getWallets();
55+
56+
await new Promise((resolve) => setImmediate(resolve));
57+
58+
globalThis.dispatchEvent(new Event("load"));
59+
60+
const wallets = await getWalletsPromise;
61+
expect(getInjectedExtensions).toHaveBeenCalled();
62+
expect(wallets).toHaveLength(mockExtensions.length);
63+
64+
Object.defineProperty(document, "readyState", {
65+
value: "complete",
66+
configurable: true,
67+
});
68+
});

packages/core/src/wallets/injected/provider.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,12 @@ export class InjectedWalletProvider extends WalletProvider {
99
async getWallets() {
1010
const { getInjectedExtensions } = await import("polkadot-api/pjs-signer");
1111

12+
if (globalThis.document.readyState !== "complete") {
13+
await new Promise<void>((resolve) =>
14+
globalThis.addEventListener("load", () => resolve()),
15+
);
16+
}
17+
1218
return getInjectedExtensions().map(
1319
(name) => new InjectedWallet(name, this.options),
1420
);

0 commit comments

Comments
 (0)