🏗️ DevelopersTools Harmony-React A web3-react toolkit for Harmony wallets
Harmony-React adds support for using OneWallet and MathWallet together with web3-react .
Harmony-React is not a fork of web3-react, but rather built on top of web3-react to ensure that the library can be upgraded whenever web3-react gets updated.
Using Harmony-React
Installation
Add web3-react/core
and the wallets you want to use (OneWallet, MathWallet or both) to package.json
:
Copy "@web3-react/core": "latest",
"@harmony-react/mathwallet-connector": "latest",
"@harmony-react/onewallet-connector": "latest",
Install using yarn install
or npm install
.
Usage
Import packages:
Copy import { OneWalletConnector } from '@harmony-react/onewallet-connector'
import { MathWalletConnector } from '@harmony-react/mathwallet-connector'
Instantiate wallets:
Copy const onewallet = new OneWalletConnector({ chainId: 1 }) // 1 = Mainnet, 2 = Testnet
const mathwallet = new MathWalletConnector({ chainId: 1 }) // 1 = Mainnet, 2 = Testnet
Store the wallet references in a store or a suitable structure, e.g:
Copy this.store = {
...
web3context: null,
connectorsByName: {
OneWallet: onewallet,
MathWallet: mathwallet,
}
...
}
For a more in-depth implementation example check here .
Create a wallet connection/unlock modal (or other suitable UI element):
Copy import React from "react";
import {
DialogContent,
Dialog,
Slide
} from '@material-ui/core';
import Unlock from './index.jsx';
export default function UnlockModal(props) {
const { closeModal, modalOpen } = props
const fullScreen = window.innerWidth < 450
const Transition = React.forwardRef((props, ref) => <Slide direction="up" {...props} ref={ref} />)
return (
<Dialog open={ modalOpen } onClose={ closeModal } fullWidth={ true } maxWidth={ 'sm' } TransitionComponent={ Transition } fullScreen={ fullScreen }>
<DialogContent>
<Unlock closeModal={ closeModal } />
</DialogContent>
</Dialog>
)
}
Implement the Unlock
component:
Copy ...
import { Web3ReactProvider, useWeb3React } from '@web3-react/core'
...
export default function Unlock({ closeModal }) {
...
return (
<div className={ classes.root }>
<div className={ classes.closeIcon } onClick={ closeModal }><CloseIcon /></div>
<div className={ classes.contentContainer }>
<Web3ReactProvider getLibrary={ getLibrary }>
<WalletComponent closeModal={ closeModal } />
</Web3ReactProvider>
</div>
</div>
)
}
And finally, implement the WalletComponent
:
Copy export default function WalletComponent({ closeModal }) {
const context = useWeb3React()
const localContext = store.getStore('web3context')
var localConnector = null;
if (localContext) {
localConnector = localContext.connector
}
const {
connector,
library,
account,
activate,
deactivate,
active,
error
} = context;
var connectorsByName = store.getStore('connectorsByName')
const [activatingConnector, setActivatingConnector] = React.useState()
useEffect(() => {
if (activatingConnector && activatingConnector === connector) {
setActivatingConnector(undefined);
}
}, [activatingConnector, connector]);
useEffect(() => {
if (account && active && library) {
store.setStore({ account: { address: account }, web3context: context })
emitter.emit(CONNECTION_CONNECTED)
}
}, [account, active, closeModal, context, library]);
const [hoveredConnectorButtons, setHoveredConnectorButtons] = React.useState(new Map());
const updateHoveredConnectorButtons = (k,v) => {
setHoveredConnectorButtons(new Map(hoveredConnectorButtons.set(k,v)));
}
// useEffect(() => {
// if (storeContext && storeContext.active && !active) {
// console.log("we are deactive: "+storeContext.account)
// store.setStore({ account: {}, web3context: null })
// }
// }, [active, storeContext]);
// handle logic to eagerly connect to the injected ethereum provider, if it exists and has granted access already
// const triedEager = useEagerConnect();
// handle logic to connect in reaction to certain events on the injected ethereum provider, if it exists
// useInactiveListener(!triedEager || !!activatingConnector);
const width = window.innerWidth
return (
<div style={{ display: 'flex', flexWrap: 'wrap', justifyContent: (width > 650 ? 'space-between' : 'center'), alignItems: 'center' }}>
{Object.keys(connectorsByName).map(name => {
const currentConnector = connectorsByName[name];
const activating = currentConnector === activatingConnector;
const connected = (currentConnector === connector||currentConnector === localConnector);
const disabled =
!!activatingConnector || !!error;
var url;
var display = (hovered && connected) ? 'Disconnect' : name;
if (name === 'OneWallet') {
url = HarmonyLogo
} else if (name === 'MathWallet') {
url = MathWalletLogo
}
return (
// UI to generate list of wallets
)
}) }
// UI to disconnect active wallet
)
}
For full reference implementations of Store
, UnlockModal
, Unlock
, and WalletComponent
: