Skip to content
This repository was archived by the owner on May 19, 2023. It is now read-only.

Commit 3395892

Browse files
committed
fix: exposes web3provider props in the class component
1 parent 9759d7d commit 3395892

File tree

5 files changed

+118
-13
lines changed

5 files changed

+118
-13
lines changed
Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
import React, { FC, useState } from 'react'
2+
import Web3 from 'web3'
3+
import { makeStyles, Theme } from '@material-ui/core/styles'
4+
import ProviderInfo, { EProvider } from '../../models/ProviderInfo'
5+
import { shortenString } from '../../utils'
6+
import { Button, Typography } from '../atoms'
7+
import { colors, fonts } from '../../theme'
8+
import AccountModal from './AccountModal'
9+
import NetworkIndicator from '../atoms/NetworkIndicator'
10+
import NetworkInfo from '../../models/NetworkInfo'
11+
12+
export interface AccountProps {
13+
web3?: Web3
14+
networkInfo?: NetworkInfo
15+
account?: string
16+
setProvider?: (provider: EProvider) => Promise<void>
17+
availableProviders?: ProviderInfo[]
18+
currentNetworkId?: number
19+
requiredNetworkId?: number
20+
onCorrectNetworkMessage?: string
21+
onNetworkMismatchMessage?: string
22+
noNetworkMessage?: string
23+
}
24+
25+
const useStyles = makeStyles((theme: Theme) => ({
26+
accountText: {
27+
fontSize: fonts.size.tiny,
28+
textAlign: 'center',
29+
},
30+
button: {
31+
border: `1px solid ${colors.white}`,
32+
'&:hover': {
33+
border: `1px solid ${colors.transparent}`,
34+
},
35+
},
36+
networkIndicator: {
37+
marginRight: theme.spacing(1),
38+
},
39+
}))
40+
41+
const Account: FC<AccountProps> = ({
42+
web3,
43+
networkInfo,
44+
account,
45+
setProvider,
46+
availableProviders,
47+
currentNetworkId,
48+
requiredNetworkId,
49+
onCorrectNetworkMessage,
50+
onNetworkMismatchMessage,
51+
noNetworkMessage,
52+
}) => {
53+
const classes = useStyles()
54+
55+
const [open, setOpen] = useState(false)
56+
const handleClose = (): void => setOpen(false)
57+
const handleOpen = (): void => setOpen(true)
58+
59+
const accountText = (): string => {
60+
if (!web3) return 'Connect wallet'
61+
62+
if (currentNetworkId !== requiredNetworkId) {
63+
return 'Wrong Network'
64+
}
65+
66+
if (account) {
67+
return shortenString(account)
68+
}
69+
return 'Unlock your wallet'
70+
}
71+
72+
return (
73+
<React.Fragment>
74+
<Button onClick={handleOpen} className={classes.button} variant="contained" color="primary" rounded>
75+
{
76+
!!requiredNetworkId && (
77+
<NetworkIndicator
78+
iconClassName={classes.networkIndicator}
79+
currentNetworkId={currentNetworkId}
80+
requiredNetworkId={requiredNetworkId}
81+
onCorrectNetworkMessage={onCorrectNetworkMessage}
82+
onNetworkMismatchMessage={onNetworkMismatchMessage}
83+
noNetworkMessage={noNetworkMessage}
84+
/>
85+
)
86+
}
87+
<Typography className={classes.accountText}>
88+
{accountText()}
89+
</Typography>
90+
</Button>
91+
92+
<AccountModal
93+
open={open}
94+
onClose={handleClose}
95+
networkInfo={networkInfo}
96+
web3={web3}
97+
onProviderSet={handleClose}
98+
setProvider={setProvider}
99+
availableProviders={availableProviders}
100+
/>
101+
</React.Fragment>
102+
)
103+
}
104+
105+
export default Account

src/components/molecules/AccountModal.tsx

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,13 @@ import {
44
Button, LoginOption, Modal, ModalBody, ModalFooter, ModalHeader, ModalTitle,
55
} from '../atoms'
66
import ProviderInfo, { EProvider } from '../../models/ProviderInfo'
7+
import NetworkInfo from '../../models/NetworkInfo'
78

89
export interface AccountModalProps {
910
web3?: Web3
10-
setProvider: (provider: EProvider, onProviderSet?:
11-
(account: string) => void) => Promise<void>
11+
networkInfo?: NetworkInfo
12+
setProvider?: (provider: EProvider, onProviderSet?:
13+
(account?: string) => void) => Promise<void>
1214
availableProviders?: ProviderInfo[]
1315
onClose?: () => void
1416
onProviderSet?: (account) => void
@@ -40,7 +42,7 @@ const AccountModal: FC<AccountModalProps> = ({
4042
providerInfo={providerInfo}
4143
key={providerInfo.eProvider}
4244
onClick={async (): Promise<void> => {
43-
await setProvider(providerInfo.eProvider, onProviderSet)
45+
if (setProvider) await setProvider(providerInfo.eProvider, onProviderSet)
4446
}}
4547
/>
4648
),

src/components/organisms/Account.tsx

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -141,9 +141,7 @@ const Account: FC<AccountProps> = (props) => {
141141
}}
142142
>
143143
<Typography className={classes.rightNetwork}>
144-
You are successfully connected to
145-
{networkInfo?.name}
146-
.
144+
{`You are successfully connected to ${networkInfo?.name}.`}
147145
</Typography>
148146
</Popover>
149147
<AccountModal

src/providers/Web3Provider.tsx

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ export interface Web3ProviderProps {
1717
requiredNetworkId?: number
1818
}
1919
actions: {
20-
setProvider: (
20+
setProvider?: (
2121
provider: EProvider,
2222
onStateChanged?: (account?: string) => void
2323
) => Promise<void>
@@ -29,15 +29,15 @@ export interface Web3ProviderProps {
2929
availableProviders?: ProviderInfo[]
3030
}
3131

32-
const defaultState: Web3ProviderState = {
32+
export const defaultWeb3State: Web3ProviderState = {
3333
provider: undefined,
3434
web3: undefined,
3535
account: undefined,
3636
networkInfo: undefined,
3737
}
3838

3939
export const Web3Store = createContext<Web3ProviderProps>({
40-
state: defaultState,
40+
state: defaultWeb3State,
4141
actions: {
4242
setProvider: (): Promise<void> => Promise.resolve(),
4343
onConnectedNetworkChange: (): any => 0,
@@ -86,7 +86,7 @@ const shouldReadAccount = (
8686
return false
8787
}
8888

89-
class Web3Provider extends Component<{}, Web3ProviderState> {
89+
class Web3Provider extends Component<Web3ProviderProps, Web3ProviderState> {
9090
private readonly requiredNetworkId?: number
9191

9292
private readonly requiredChainId?: number
@@ -95,7 +95,7 @@ class Web3Provider extends Component<{}, Web3ProviderState> {
9595

9696
constructor(props: Web3ProviderProps) {
9797
super(props)
98-
this.state = defaultState
98+
this.state = defaultWeb3State
9999
this.requiredNetworkId = props.requiredNetworkId
100100
this.requiredChainId = props.requiredChainId
101101
this.onConnectedNetworkChange = props.actions.onConnectedNetworkChange

src/providers/index.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
import Web3Provider, { Web3Store } from './Web3Provider'
1+
import Web3Provider, { Web3Store, defaultWeb3State } from './Web3Provider'
22

3-
export { Web3Provider, Web3Store }
3+
export { Web3Provider, Web3Store, defaultWeb3State }

0 commit comments

Comments
 (0)