Skip to content

Commit a22f3d9

Browse files
author
Michael Moldoveanu
authored
fix(wc): wc connection should persist across refreshes (#1162)
1 parent 844a481 commit a22f3d9

File tree

9 files changed

+86
-41
lines changed

9 files changed

+86
-41
lines changed

account-kit/core/src/hydrate.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ export function hydrate(
7070
initialState != null && "wagmi" in initialState
7171
? initialState.wagmi
7272
: undefined;
73+
7374
const { onMount: wagmi_onMount } = wagmi_hydrate(
7475
config._internal.wagmiConfig,
7576
{

account-kit/core/src/utils/cookies.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ export function cookieToInitialState(
7979

8080
const wagmiClientState = wagmiCookieToInitialState(
8181
config._internal.wagmiConfig,
82-
cookie
82+
decodeURIComponent(cookie)
8383
);
8484

8585
return {

account-kit/react/src/components/auth/card/eoa.tsx

Lines changed: 29 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,14 @@ import { walletConnect } from "wagmi/connectors";
22
import { useChain } from "../../../hooks/useChain.js";
33
import { Spinner } from "../../../icons/spinner.js";
44
import { WalletConnectIcon } from "../../../icons/walletConnectIcon.js";
5+
import { ls } from "../../../strings.js";
56
import { Button } from "../../button.js";
67
import { useAuthContext } from "../context.js";
8+
import { useConnectEOA } from "../hooks/useConnectEOA.js";
9+
import { useWalletConnectAuthConfig } from "../hooks/useWalletConnectAuthConfig.js";
710
import { CardContent } from "./content.js";
811
import { ConnectionError } from "./error/connection-error.js";
912
import { EOAWallets } from "./error/types.js";
10-
import { useConnectEOA } from "../hooks/useConnectEOA.js";
11-
import { useWalletConnectAuthConfig } from "../hooks/useWalletConnectAuthConfig.js";
12-
import { ls } from "../../../strings.js";
1313

1414
export const EoaConnectCard = () => {
1515
const { setAuthStep, authStep } = useAuthContext("eoa_connect");
@@ -153,30 +153,32 @@ export const EoaPickCard = () => {
153153

154154
const { walletConnectParams } = useWalletConnectAuthConfig();
155155

156-
const connectorButtons = connectors.map((connector) => {
157-
return (
158-
<Button
159-
className="justify-start"
160-
variant="social"
161-
key={connector.id}
162-
icon={
163-
connector.icon && (
164-
<img
165-
src={connector.icon}
166-
alt={connector.name}
167-
height={20}
168-
width={20}
169-
/>
170-
)
171-
}
172-
onClick={() => {
173-
connect({ connector, chainId: chain.id });
174-
}}
175-
>
176-
{connector.name}
177-
</Button>
178-
);
179-
});
156+
const connectorButtons = connectors
157+
.filter((x) => x.type !== "walletConnect")
158+
.map((connector) => {
159+
return (
160+
<Button
161+
className="justify-start"
162+
variant="social"
163+
key={connector.id}
164+
icon={
165+
connector.icon && (
166+
<img
167+
src={connector.icon}
168+
alt={connector.name}
169+
height={20}
170+
width={20}
171+
/>
172+
)
173+
}
174+
onClick={() => {
175+
connect({ connector, chainId: chain.id });
176+
}}
177+
>
178+
{connector.name}
179+
</Button>
180+
);
181+
});
180182

181183
const walletConnectConnector = walletConnectParams
182184
? walletConnect(walletConnectParams)

account-kit/react/src/components/auth/hooks/useWalletConnectAuthConfig.tsx

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import type { WalletConnectParameters } from "wagmi/connectors";
44
import { useAuthConfig } from "../../../hooks/internal/useAuthConfig.js";
5+
import { getWalletConnectParams } from "../../../utils.js";
56
import type { AuthType } from "../types.js";
67

78
export const useWalletConnectAuthConfig = (): {
@@ -21,18 +22,7 @@ export const useWalletConnectAuthConfig = (): {
2122
});
2223

2324
// Add z-index to the wallet connect modal if not already set
24-
const walletConnectParams = walletConnectAuthConfig
25-
? ({
26-
...walletConnectAuthConfig,
27-
qrModalOptions: {
28-
...walletConnectAuthConfig.qrModalOptions,
29-
themeVariables: {
30-
"--wcm-z-index": "1000000",
31-
...walletConnectAuthConfig.qrModalOptions?.themeVariables,
32-
},
33-
},
34-
} as WalletConnectParameters)
35-
: undefined;
25+
const walletConnectParams = getWalletConnectParams(walletConnectAuthConfig);
3626

3727
return {
3828
walletConnectParams,

account-kit/react/src/createConfig.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,11 @@ import {
33
type AlchemyAccountsConfig,
44
type CreateConfigProps,
55
} from "@account-kit/core";
6+
import { walletConnect } from "wagmi/connectors";
7+
import type { AuthType } from "./components/auth/types.js";
68
import { ReactLogger } from "./metrics.js";
79
import type { AlchemyAccountsUIConfig } from "./types";
10+
import { getWalletConnectParams } from "./utils.js";
811

912
export type AlchemyAccountsConfigWithUI = AlchemyAccountsConfig & {
1013
ui?: AlchemyAccountsUIConfig;
@@ -54,6 +57,25 @@ export const createConfig = (
5457
props.enablePopupOauth = true;
5558
}
5659

60+
const externalWalletSection = ui?.auth?.sections
61+
.find((x) => x.some((y) => y.type === "external_wallets"))
62+
?.find((x) => x.type === "external_wallets") as
63+
| Extract<AuthType, { type: "external_wallets" }>
64+
| undefined;
65+
66+
if (
67+
externalWalletSection?.walletConnect &&
68+
!props.connectors?.some((x) => "type" in x && x.type === "walletConnect")
69+
) {
70+
const walletConnectAuthConfig = externalWalletSection?.walletConnect;
71+
const walletConnectParams = getWalletConnectParams(
72+
walletConnectAuthConfig
73+
)!;
74+
75+
props.connectors ??= [];
76+
props.connectors.push(walletConnect(walletConnectParams));
77+
}
78+
5779
const config = createCoreConfig(props);
5880

5981
ReactLogger.trackEvent({

account-kit/react/src/hooks/useUser.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,11 @@ export const useUser = (): UseUserResult => {
3333
() => getUser(config) ?? null
3434
);
3535
const eoaUser = useMemo(() => {
36-
if (account.status !== "connected") {
36+
if (account.status !== "connected" && account.status !== "reconnecting") {
37+
return null;
38+
}
39+
40+
if (!account.address) {
3741
return null;
3842
}
3943

account-kit/react/src/utils.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import type { WalletConnectParameters } from "wagmi/connectors";
2+
13
export function capitalize(str: string) {
24
return str
35
.split(" ")
@@ -8,3 +10,22 @@ export function capitalize(str: string) {
810
export function assertNever(msg: string) {
911
throw new Error(msg);
1012
}
13+
14+
export function getWalletConnectParams(
15+
walletConnectAuthConfig: WalletConnectParameters | undefined
16+
): WalletConnectParameters | undefined {
17+
if (!walletConnectAuthConfig) return undefined;
18+
19+
return walletConnectAuthConfig
20+
? ({
21+
...walletConnectAuthConfig,
22+
qrModalOptions: {
23+
...walletConnectAuthConfig.qrModalOptions,
24+
themeVariables: {
25+
"--wcm-z-index": "1000000",
26+
...walletConnectAuthConfig.qrModalOptions?.themeVariables,
27+
},
28+
},
29+
} as WalletConnectParameters)
30+
: undefined;
31+
}

examples/ui-demo/src/app/config.tsx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { cookieStorage, createConfig } from "@account-kit/react";
44
import { AccountKitTheme } from "@account-kit/react/tailwind";
55
import { type KnownAuthProvider } from "@account-kit/signer";
66
import { QueryClient } from "@tanstack/react-query";
7+
import { walletConnect } from "wagmi/connectors";
78

89
export type Config = {
910
auth: {
@@ -75,6 +76,9 @@ export const alchemyConfig = () =>
7576
chain: arbitrumSepolia,
7677
ssr: true,
7778
policyId: process.env.NEXT_PUBLIC_PAYMASTER_POLICY_ID,
79+
connectors: [
80+
walletConnect({ projectId: "30e7ffaff99063e68cc9870c105d905b" }),
81+
],
7882
storage: cookieStorage,
7983
enablePopupOauth: true,
8084
},

examples/ui-demo/src/state/index.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ export function ConfigSync() {
8686
classes.forEach((x) => root.classList.add(x));
8787

8888
const uiConfig = convertDemoConfigToUiConfig(config);
89+
8990
updateConfig(uiConfig);
9091
}, [config, updateConfig]);
9192

0 commit comments

Comments
 (0)