mars-v2-frontend/components/Wallet/ConnectedButton.tsx
Linkie Link c4f8f4eab0
Mp 1757 wallet connect (#66)
* MP-1757: implemented the WalletProvider and connect buttons

* tidy: tidy up the search

* MP-1691: moved modals outside of the DOM

* MP-1691: changed CreditManager into AccountDetails

* fix: fixed the naming

* MP-1691: UX approvements

* MP-1691: global confirm and delete modal added

* fix: merged the credit-account and wallet branch

* MP-1757: added the status store

* fix: updated the store interaction

* MP-1757: major cleanup of stores

* tidy: format
2022-12-08 21:14:38 +01:00

173 lines
6.1 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import {
ChainInfoID,
SimpleChainInfoList,
useWallet,
useWalletManager,
} from '@marsprotocol/wallet-connector'
import classNames from 'classnames'
import { useCallback, useEffect, useState } from 'react'
import useClipboard from 'react-use-clipboard'
import Button from 'components/Button'
import CircularProgress from 'components/CircularProgress'
import FormattedNumber from 'components/FormattedNumber'
import CheckIcon from 'components/Icons/check.svg'
import CopyIcon from 'components/Icons/copy.svg'
import ExternalLinkIcon from 'components/Icons/external-link.svg'
import OsmoIcon from 'components/Icons/osmo.svg'
import WalletIcon from 'components/Icons/wallet.svg'
import { Overlay } from 'components/Overlay'
import Text from 'components/Text'
import useTokenBalance from 'hooks/useTokenBalance'
import { formatValue, truncate } from 'utils/formatters'
const ConnectedButton = () => {
// ---------------
// EXTERNAL HOOKS
// ---------------
const { disconnect } = useWalletManager()
const { chainInfo, address, name } = useWallet()
// ---------------
// LOCAL HOOKS
// ---------------
const { data } = useTokenBalance()
// ---------------
// LOCAL STATE
// ---------------
const [isLoading, setIsLoading] = useState(false)
const [showDetails, setShowDetails] = useState(false)
const [isCopied, setCopied] = useClipboard(address || '', {
successDuration: 1000 * 5,
})
// ---------------
// VARIABLES
// ---------------
const explorerName =
chainInfo && SimpleChainInfoList[chainInfo.chainId as ChainInfoID].explorerName
const viewOnFinder = useCallback(() => {
const explorerUrl = chainInfo && SimpleChainInfoList[chainInfo.chainId as ChainInfoID].explorer
window.open(`${explorerUrl}account/${address}`, '_blank')
}, [chainInfo, address])
useEffect(() => {
const loading = !(address && name && chainInfo)
setIsLoading(loading)
}, [address, name, chainInfo])
return (
<div className={'relative'}>
{chainInfo?.chainId !== ChainInfoID.Osmosis1 && (
<Text
className='absolute -right-2 -top-2.5 rounded-lg bg-secondary-highlight p-0.5 px-2'
size='3xs'
uppercase
>
{chainInfo?.chainId}
</Text>
)}
<button
className={classNames(
'flex h-[31px] flex-1 flex-nowrap content-center items-center justify-center rounded-2xl border border-white/60 bg-secondary-dark/70 px-4 py-0 text-sm text-white ',
'hover:border-white hover:bg-secondary-dark',
'active:border-white active:bg-secondary-dark-10',
)}
onClick={() => {
setShowDetails(!showDetails)
}}
>
<span className='flex h-4 w-4 items-center justify-center'>
{chainInfo?.chainId === ChainInfoID.Osmosis1 ||
chainInfo?.chainId === ChainInfoID.OsmosisTestnet ? (
<OsmoIcon />
) : (
<WalletIcon />
)}
</span>
<span className='ml-2'>{name ? name : truncate(address, [2, 4])}</span>
<div
className={classNames(
'number relative ml-2 flex h-full items-center pl-2',
'before:content-[" "] before:absolute before:top-1.5 before:bottom-1.5 before:left-0 before:h-[calc(100%-12px)] before:border-l before:border-white',
)}
>
{!isLoading ? (
`${formatValue(data, 2, 2, true, false, ` ${chainInfo?.stakeCurrency?.coinDenom}`)}`
) : (
<CircularProgress size={12} />
)}
</div>
</button>
<Overlay className='right-0 mt-2' show={showDetails} setShow={setShowDetails}>
<div className='flex w-[420px] flex-wrap p-6'>
<div className='flex-0 mb-4 flex w-full flex-nowrap items-start'>
<div className='flex w-auto flex-1'>
<div className='mr-2 flex h-[31px] items-end pb-0.5 text-secondary-dark text-base-caps'>
{chainInfo?.stakeCurrency?.coinDenom}
</div>
<div className='flex-0 flex flex-wrap justify-end'>
<FormattedNumber
animate
className='flex items-end text-2xl text-secondary-dark'
amount={data}
/>
</div>
</div>
<div className='flex h-[31px] w-[116px] justify-end'>
<Button color='secondary' onClick={disconnect} text='Disconnect' />
</div>
</div>
<div className='flex w-full flex-wrap'>
<Text uppercase className='mb-1 break-all text-secondary-dark/80'>
{name ? `${name}` : 'Your Address'}
</Text>
<Text
size='sm'
className='mb-1 hidden break-all font-bold text-secondary-dark md:block'
>
{address}
</Text>
<Text size='sm' className='mb-1 break-all font-bold text-secondary-dark md:hidden'>
{truncate(address, [14, 14])}
</Text>
<div className='flex w-full pt-1'>
<button
className='mr-10 flex w-auto appearance-none items-center border-none py-2 text-secondary-dark opacity-70 hover:opacity-100'
onClick={setCopied}
>
<span className='mr-1 w-4'>
<CopyIcon />
</span>
{isCopied ? (
<Text size='sm'>
Copied <CheckIcon />
</Text>
) : (
<Text size='sm'>Copy Address</Text>
)}
</button>
<button
className='flex w-auto appearance-none items-center border-none py-2 text-secondary-dark opacity-70 hover:opacity-100'
onClick={viewOnFinder}
>
<span className='mr-1 w-4'>
<ExternalLinkIcon />
</span>
<Text size='sm'>View on {explorerName}</Text>
</button>
</div>
</div>
</div>
</Overlay>
</div>
)
}
export default ConnectedButton