Skip to content
This repository was archived by the owner on Apr 9, 2025. It is now read-only.

Commit 032bfa5

Browse files
committed
Add EIP-6963 Wallet connect modal
1 parent 1ae9075 commit 032bfa5

File tree

3 files changed

+148
-0
lines changed

3 files changed

+148
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
.walletModalContent {
2+
display: flex;
3+
flex-direction: column;
4+
padding-bottom: 2rem;
5+
6+
h4 {
7+
color: var(--gray-extra-dark);
8+
margin-bottom: 2rem;
9+
text-align: center;
10+
}
11+
}
12+
13+
.walletModalLogo {
14+
align-self: center;
15+
margin-bottom: 3.125rem;
16+
}
17+
18+
.walletModalProviderList {
19+
display: flex;
20+
flex-direction: column;
21+
gap: 0.5rem;
22+
23+
.providerOption {
24+
background-color: var(--gray-medium-light);
25+
border-radius: 46px;
26+
}
27+
}
28+
29+
.providerOptionBtn {
30+
display: flex;
31+
align-items: center;
32+
padding: 0.5rem 2rem;
33+
gap: 0.75rem;
34+
background: none;
35+
border: none;
36+
font: inherit;
37+
outline: inherit;
38+
color: var(--gray-extra-dark);
39+
cursor: pointer;
40+
width: 100%;
41+
border-radius: 46px;
42+
43+
&:hover,
44+
&:focus {
45+
background-color: var(--gray-extra-dark);
46+
color: var(--white);
47+
}
48+
}
49+
50+
.providerOptionLogo {
51+
object-fit: cover;
52+
width: 45px;
53+
height: 45px;
54+
}
55+
56+
@media screen and (max-width: 1000px) {
57+
.walletModal {
58+
max-width: unset;
59+
}
60+
61+
.walletModalLogo {
62+
margin-bottom: 2rem;
63+
}
64+
}

src/components/WalletModal/index.tsx

+74
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
import { FC, useState } from 'react'
2+
import { Modal, ModalProps } from '../Modal'
3+
import { LogoIconRound } from '../icons/LogoIconRound.tsx'
4+
import classes from './index.module.css'
5+
import { useEIP6963ProviderInfoList } from '../../hooks/useEIP6963ProviderInfoList.ts'
6+
import { EIP6963ProviderInfo } from '../../utils/types.ts'
7+
import { useEIP6963 } from '../../hooks/useEIP6963.ts'
8+
9+
interface WalletModalProps extends Pick<ModalProps, 'isOpen' | 'closeModal'> {
10+
next: () => void
11+
}
12+
13+
interface ProviderOptionProps extends Pick<EIP6963ProviderInfo, 'rdns' | 'name' | 'icon'> {
14+
isLoading: boolean
15+
onSelectProvider: (rdns: string) => void
16+
}
17+
18+
const ProviderOption: FC<ProviderOptionProps> = ({ rdns, name, icon, onSelectProvider, isLoading }) => {
19+
if (!rdns) {
20+
return null
21+
}
22+
23+
return (
24+
<div className={classes.providerOption}>
25+
<button
26+
className={classes.providerOptionBtn}
27+
onClick={() => onSelectProvider(rdns)}
28+
disabled={isLoading}
29+
>
30+
<img className={classes.providerOptionLogo} src={icon} alt={name} />
31+
{name}
32+
</button>
33+
</div>
34+
)
35+
}
36+
37+
export const WalletModal: FC<WalletModalProps> = ({ isOpen, closeModal, next }) => {
38+
const { setCurrentProviderByRdns } = useEIP6963()
39+
const providerInfoList = useEIP6963ProviderInfoList()
40+
41+
const [isLoading, setIsLoading] = useState(false)
42+
43+
const onSelectProvider = (rdns: string) => {
44+
setIsLoading(true)
45+
setCurrentProviderByRdns(rdns)
46+
next()
47+
setIsLoading(false)
48+
}
49+
50+
const providerInfoOptionsList = providerInfoList.map(({ uuid, rdns, name, icon }) => (
51+
<ProviderOption
52+
key={uuid}
53+
rdns={rdns}
54+
name={name}
55+
icon={icon}
56+
isLoading={isLoading}
57+
onSelectProvider={onSelectProvider}
58+
/>
59+
))
60+
61+
return (
62+
<Modal isOpen={isOpen} closeModal={closeModal} disableBackdropClick>
63+
<div className={classes.walletModalContent}>
64+
<div className={classes.walletModalLogo}>
65+
<LogoIconRound />
66+
</div>
67+
68+
<h4>Connect a wallet</h4>
69+
70+
<div className={classes.walletModalProviderList}>{providerInfoOptionsList}</div>
71+
</div>
72+
</Modal>
73+
)
74+
}
+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import { useEIP6963Manager } from './useEIP6963Manager.ts'
2+
import { EIP6963ProviderInfo } from '../utils/types.ts'
3+
4+
export const useEIP6963ProviderInfoList = (): EIP6963ProviderInfo[] => {
5+
const {
6+
state: { providerList },
7+
} = useEIP6963Manager()
8+
9+
return providerList.map(({ info }) => info)
10+
}

0 commit comments

Comments
 (0)