143 lines
3.9 KiB
TypeScript
143 lines
3.9 KiB
TypeScript
import {
|
|
Button,
|
|
Container,
|
|
Text,
|
|
Divider,
|
|
Flex,
|
|
Heading,
|
|
Image,
|
|
SimpleGrid,
|
|
useToast,
|
|
} from "@chakra-ui/react";
|
|
import AuthClient from "@walletconnect/auth-client";
|
|
import { version } from "@walletconnect/auth-client/package.json";
|
|
import type { NextPage } from "next";
|
|
import Link from "next/link";
|
|
import Qrcode from "qrcode";
|
|
import { Fragment, useCallback, useEffect, useRef, useState } from "react";
|
|
|
|
console.log(`AuthClient@${version}`);
|
|
|
|
const Home: NextPage = () => {
|
|
const [client, setClient] = useState<AuthClient | null>();
|
|
const [uri, setUri] = useState<string>("");
|
|
const [accepted, setAccepted] = useState<boolean>(false);
|
|
const toast = useToast();
|
|
const canvasRef = useRef(null);
|
|
|
|
const onSignIn = useCallback(() => {
|
|
if (!client) return;
|
|
client
|
|
.request({
|
|
aud: "http://localhost:3000/",
|
|
domain: "localhost:3000",
|
|
chainId: "eip155:1",
|
|
type: "eip4361",
|
|
nonce: "nonce",
|
|
statement: "Sign in with wallet.",
|
|
})
|
|
.then(({ 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);
|
|
})
|
|
.catch(console.log);
|
|
}, [setClient]);
|
|
|
|
useEffect(() => {
|
|
if (!client) return;
|
|
client.on("auth_response", (res) => {
|
|
if (!!res.params.result.s) {
|
|
setAccepted(true);
|
|
}
|
|
});
|
|
}, [client]);
|
|
|
|
useEffect(() => {
|
|
if (uri && canvasRef.current) Qrcode.toCanvas(canvasRef.current, uri);
|
|
}, [uri, canvasRef]);
|
|
return (
|
|
<Container>
|
|
<Flex gap={20} height={"100%"} direction="column">
|
|
<Flex
|
|
boxShadow={"inner"}
|
|
p={5}
|
|
backgroundColor={"gray.50"}
|
|
direction="column"
|
|
justifyContent="space-evenly"
|
|
borderRadius={10}
|
|
border={"solid 2px black"}
|
|
>
|
|
<Heading color={"black"} textAlign="center" mb={5}>
|
|
Sign In
|
|
</Heading>
|
|
<Divider mb={5}></Divider>
|
|
<Text color={"black"} textAlign="center" padding={5}>
|
|
Initiate the auth cycle by sending an auth request
|
|
</Text>
|
|
<form>
|
|
<Container></Container>
|
|
<Flex alignItems={"center"} gap={4} direction="column">
|
|
<Button
|
|
p={2}
|
|
color={"black"}
|
|
onClick={onSignIn}
|
|
leftIcon={<Image width={10} src="/walletconnect.png" />}
|
|
>
|
|
Sign in with WalletConnect
|
|
</Button>
|
|
{uri && (
|
|
<Fragment>
|
|
<canvas
|
|
onClick={() => {
|
|
navigator.clipboard.writeText(uri).then(() => {
|
|
toast({
|
|
title: "URI copied to clipboard",
|
|
status: "success",
|
|
duration: 1000,
|
|
});
|
|
});
|
|
}}
|
|
ref={canvasRef}
|
|
/>
|
|
<Text
|
|
color="gray.400"
|
|
style={{ fontStyle: "italic", fontSize: "0.75em" }}
|
|
>
|
|
(You can copy the URI by clicking the QR code above)
|
|
</Text>
|
|
</Fragment>
|
|
)}
|
|
</Flex>
|
|
</form>
|
|
{accepted && (
|
|
<Button
|
|
_hover={{ cursor: "pointer" }}
|
|
p={10}
|
|
colorScheme="green"
|
|
isActive={false}
|
|
>
|
|
Authenticated
|
|
</Button>
|
|
)}
|
|
</Flex>
|
|
</Flex>
|
|
</Container>
|
|
);
|
|
};
|
|
|
|
export default Home;
|