wallet-connect-web-examples/dapps/react-dapp-auth/pages/index.tsx
Cali 649cf28159
fix(error-handling): close modal on reject and fix overflow error (#147)
* fix(error-handling): improve auth examples error handling & close modal on auth request rejection

* fix(bignum-overflow): convert bignumber to string to avoid overflow
2023-04-05 12:03:28 +03:00

123 lines
3.3 KiB
TypeScript

import { Box, useToast } from "@chakra-ui/react";
import AuthClient, { generateNonce } from "@walletconnect/auth-client";
import { Web3Modal } from "@web3modal/standalone";
import type { NextPage } from "next";
import { useCallback, useEffect, useState } from "react";
import DefaultView from "../views/DefaultView";
import SignedInView from "../views/SignedInView";
// 1. Get projectID at https://cloud.walletconnect.com
const projectId = process.env.NEXT_PUBLIC_PROJECT_ID;
if (!projectId) {
throw new Error("You need to provide NEXT_PUBLIC_PROJECT_ID env variable");
}
// 2. Configure web3Modal
const web3Modal = new Web3Modal({
projectId,
walletConnectVersion: 2,
});
const Home: NextPage = () => {
const [client, setClient] = useState<AuthClient | null>();
const [hasInitialized, setHasInitialized] = useState(false);
const [uri, setUri] = useState<string>("");
const [address, setAddress] = useState<string>("");
const toast = useToast();
const onSignIn = useCallback(() => {
if (!client) return;
client
.request({
aud: window.location.href,
domain: window.location.hostname.split(".").slice(-2).join("."),
chainId: "eip155:1",
type: "eip4361",
nonce: generateNonce(),
statement: "Sign in with wallet.",
})
.then(({ uri }) => {
if (uri) {
setUri(uri);
}
});
}, [client, setUri]);
useEffect(() => {
AuthClient.init({
relayUrl:
process.env.NEXT_PUBLIC_RELAY_URL || "wss://relay.walletconnect.com",
projectId: process.env.NEXT_PUBLIC_PROJECT_ID!,
metadata: {
name: "react-dapp-auth",
description: "React Example Dapp for Auth",
url: window.location.host,
icons: [],
},
})
.then((authClient) => {
setClient(authClient);
setHasInitialized(true);
})
.catch(console.error);
}, []);
useEffect(() => {
if (!client) return;
client.on("auth_response", ({ params }) => {
if ("code" in params) {
console.error(params);
return web3Modal.closeModal();
}
if ("error" in params) {
console.error(params.error);
if ("message" in params.error) {
toast({
status: "error",
title: params.error.message,
});
}
return web3Modal.closeModal();
}
toast({
status: "success",
title: "Auth request successfully approved",
colorScheme: "whatsapp",
});
setAddress(params.result.p.iss.split(":")[4]);
});
}, [client, toast]);
const [view, changeView] = useState<"default" | "qr" | "signedIn">("default");
useEffect(() => {
async function handleOpenModal() {
if (uri) {
await web3Modal.openModal({
uri,
standaloneChains: ["eip155:1"],
});
}
}
handleOpenModal();
}, [uri]);
useEffect(() => {
if (address) {
web3Modal.closeModal();
changeView("signedIn");
}
}, [address, changeView]);
return (
<Box width="100%" height="100%">
{view === "default" && (
<DefaultView onClick={onSignIn} hasInitialized={hasInitialized} />
)}
{view === "signedIn" && <SignedInView address={address} />}
</Box>
);
};
export default Home;