Skip to content

Commit

Permalink
Merge pull request #386 from forbole/dev
Browse files Browse the repository at this point in the history
Dev
  • Loading branch information
calvinkei committed Oct 13, 2021
2 parents b0a53fa + cb0cef0 commit 6a90171
Show file tree
Hide file tree
Showing 28 changed files with 481 additions and 123 deletions.
92 changes: 72 additions & 20 deletions components/ActivitiesTable/Row.tsx
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import { Box, Avatar, Typography, Link } from '@material-ui/core'
import { Box, Avatar, Typography, Link, useTheme } from '@material-ui/core'
import useTranslation from 'next-translate/useTranslation'
import React from 'react'
import { useGetStyles } from './styles'
import { formatCrypto, formatTokenAmount, getVoteAnswer } from '../../misc/utils'
import { formatTokenAmount, getVoteAnswer } from '../../misc/utils'
import useIsMobile from '../../misc/useIsMobile'
import AccountAvatar from '../AccountAvatar'
import ValidatorAvatar from '../ValidatorAvatar'
Expand All @@ -24,6 +24,7 @@ interface RowProps {

const Row: React.FC<RowProps> = ({ activity, account, crypto, address }) => {
const { classes } = useGetStyles(activity.tag)
const theme = useTheme()
const { t, lang } = useTranslation('common')
const isMobile = useIsMobile()
const accountDetail = account
Expand Down Expand Up @@ -200,27 +201,78 @@ const Row: React.FC<RowProps> = ({ activity, account, crypto, address }) => {
}
if (activity.tag === 'multisend') {
return (
<>
<Box display="flex" alignItems="center" flexWrap="wrap">
<Avatar className={classes.accountAvatar} alt={accountDetail.name} src={crypto.image} />
<Typography className={classes.validatorTypography}>{accountDetail.name}</Typography>
<Typography>
{t(`${activity.tag}Activity`)}
<span className={classes.amount}>
{formatTokenAmount(activity.amount, crypto.name, lang)}
</span>
{t('toTheFollowingRecepients')}
</Typography>
</Box>
<Box>
{activity.detail.inputs.map((input, i) => {
return (
<Box
key={`${input.address}_${i}`}
mr={1}
display="flex"
alignItems="center"
flexWrap="wrap"
>
<Link
href={`${crypto.blockExplorerBaseUrl}/accounts/${input.address}`}
target="_blank"
variant="body1"
style={{ marginRight: theme.spacing(1) }}
>
{input.address === account.address ? (
<AccountAvatar
ledgerIconDisabled
account={account}
address={address}
hideAddress
size="small"
/>
) : (
input.address
)}
</Link>
<Typography>{t(`${activity.tag}Activity`)}</Typography>
<span className={classes.amount}>
{formatTokenAmount(input.tokenAmount, crypto.name, lang)}
</span>
{i === activity.detail.inputs.length - 1 ? (
<Typography>{t('toTheFollowingRecepients')}</Typography>
) : null}
</Box>
)
})}
<Box className={classes.detail}>
{activity.detail.map((x, i) => (
<Typography key={`${x.address}_${i}`}>
{x.address} {t('received')}{' '}
<span className={classes.amount}>{formatCrypto(x.amount, crypto.name, lang)}</span>
</Typography>
{activity.detail.outputs.map((output, i) => (
<Box
key={`${output.address}_${i}`}
display="flex"
alignItems="center"
flexWrap="wrap"
>
<Link
href={`${crypto.blockExplorerBaseUrl}/accounts/${output.address}`}
target="_blank"
variant="body1"
style={{ marginRight: theme.spacing(1) }}
>
{output.address === account.address ? (
<AccountAvatar
ledgerIconDisabled
account={account}
address={address}
hideAddress
size="small"
/>
) : (
output.address
)}
</Link>
<Typography>{t('received')}</Typography>
<span className={classes.amount}>
{formatTokenAmount(output.tokenAmount, crypto.name, lang)}
</span>
</Box>
))}
</Box>
</>
</Box>
)
}
if (activity.tag === 'createValidator') {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
import React from 'react'
import { Box, Divider, Typography, useTheme } from '@material-ui/core'
import useTranslation from 'next-translate/useTranslation'
import SendIcon from '../../../assets/images/icons/icon_send_tx.svg'
import { formatTokenAmount, getTokenAmountFromDenoms } from '../../../misc/utils'

interface MultiSendContentProps {
totalAmount: TokenAmount
msgs: TransactionMsgMultiSend[]
denoms: TokenPrice[]
account: Account
}

const MultiSendContent: React.FC<MultiSendContentProps> = ({
msgs,
denoms,
totalAmount,
account,
}) => {
const { t, lang } = useTranslation('common')
const theme = useTheme()
return (
<>
<Box display="flex" flexDirection="column" alignItems="center" mt={6}>
<SendIcon width={theme.spacing(6)} height={theme.spacing(6)} />
<Box mt={2} mb={4}>
<Typography variant="h4">
{t('send')} {formatTokenAmount(totalAmount, account.crypto, lang, ', ')}
</Typography>
</Box>
</Box>
<Divider />
<Box my={1}>
<Typography>{t('from')}</Typography>
<Typography color="textSecondary">{account.address}</Typography>
</Box>
<Divider />
{msgs[0].value.outputs.map((m, i) => (
<React.Fragment key={m.address}>
<Box my={1}>
<Typography>{t('send to', { number: `# ${i + 1}` })}</Typography>
<Typography color="textSecondary" gutterBottom>
{m.address}
</Typography>
<Typography>{t('amount')}</Typography>
<Typography color="textSecondary">
{formatTokenAmount(
getTokenAmountFromDenoms(m.coins, denoms || []),
account.crypto,
lang
)}
</Typography>
</Box>
<Divider />
</React.Fragment>
))}
</>
)
}

export default MultiSendContent
10 changes: 10 additions & 0 deletions components/ConfirmTransactionDialog/ConfirmStageContent/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ import VoteContent from './VoteContent'
import DepositContent from './DepositContent'
import SaveProfileContent from './SaveProfileContent'
import SetWithdrawAddressContent from './SetWithdrawAddressContent'
import MultiSendContent from './MultiSendContent'

const ReactJson = dynamic(() => import('react-json-view'), { ssr: false })

Expand Down Expand Up @@ -65,6 +66,15 @@ const ConfirmStageContent: React.FC<ConfirmStageContentProps> = ({
msgs={transactionData.msgs as TransactionMsgSend[]}
/>
)
case '/cosmos.bank.v1beta1.MsgMultiSend':
return (
<MultiSendContent
account={account}
denoms={denoms}
totalAmount={totalAmount}
msgs={transactionData.msgs as TransactionMsgMultiSend[]}
/>
)
case '/cosmos.staking.v1beta1.MsgDelegate':
return (
<DelegateContent
Expand Down
8 changes: 7 additions & 1 deletion components/ConfirmTransactionDialog/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,12 @@ const ConfirmTransactionDialog: React.FC<ConfirmTransactionDialogProps> = ({
const totalAmount = getTokenAmountFromDenoms(
flatten(
transactionData.msgs
.map((msg) => (msg.value as any).amount || (msg.value as any).token)
.map(
(msg) =>
(msg.value as any).amount ||
(msg.value as any).token ||
flatten(get(msg, 'value.inputs', []).map((i) => i.coins))
)
.filter((a) => a)
),
denoms
Expand All @@ -139,6 +144,7 @@ const ConfirmTransactionDialog: React.FC<ConfirmTransactionDialogProps> = ({
const successMessage = React.useMemo(() => {
switch (get(transactionData, 'msgs[0].typeUrl', '')) {
case '/cosmos.bank.v1beta1.MsgSend':
case '/cosmos.bank.v1beta1.MsgMultiSend':
case '/ibc.applications.transfer.v1.MsgTransfer':
return t('successfully sent', {
title: formatTokenAmount(totalAmount, crypto, lang),
Expand Down
32 changes: 4 additions & 28 deletions components/Layout/LeftMenu.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import React from 'react'
import useTranslation from 'next-translate/useTranslation'
import {
Avatar,
Box,
Button,
List,
Expand All @@ -20,11 +19,11 @@ import AddressBookIcon from '../../assets/images/icons/icon_address_book.svg'
import Logo from '../../assets/images/logo.svg'
import LogoExpended from '../../assets/images/logo_expended.svg'
import useStyles from './styles'
import StarredAccount from './StarredAccount'
import useIconProps from '../../misc/useIconProps'
import { MenuWidth } from '.'
import { useGeneralContext } from '../../contexts/GeneralContext'
import { CustomTheme } from '../../misc/theme'
import cryptocurrencies from '../../misc/cryptocurrencies'
import { useWalletsContext } from '../../contexts/WalletsContext'

interface LeftMenuProps {
Expand Down Expand Up @@ -179,32 +178,9 @@ const LeftMenu: React.FC<LeftMenuProps> = ({ activeItem, isMenuExpanded, setIsMe
</Link>
{accounts
.filter((account) => account.fav)
.map((account) => {
const crypto = cryptocurrencies[account.crypto]
return (
<Link
key={account.address}
href="/account/[address]"
as={`/account/${account.address}`}
>
<ListItem className={classes.favMenuItem} button component="a">
<ListItemIcon>
<Avatar
alt={crypto.name}
src={crypto.image}
style={{ height: themeStyle.spacing(3), width: themeStyle.spacing(3) }}
/>
</ListItemIcon>
<ListItemText
primary={account.name}
primaryTypographyProps={{
variant: 'h6',
}}
/>
</ListItem>
</Link>
)
})}
.map((account) => (
<StarredAccount account={account} />
))}
</Box>
</List>
</Paper>
Expand Down
88 changes: 88 additions & 0 deletions components/Layout/StarredAccount.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
import React from 'react'
import Link from 'next/link'
import useTranslation from 'next-translate/useTranslation'
import { gql, useSubscription } from '@apollo/client'
import {
Avatar,
Box,
ListItem,
ListItemIcon,
ListItemText,
useTheme,
CircularProgress,
Typography,
} from '@material-ui/core'
import { useGeneralContext } from '../../contexts/GeneralContext'
import {
formatCurrency,
formatTokenAmount,
getTotalBalance,
getTotalTokenAmount,
transformGqlAcountBalance,
} from '../../misc/utils'
import { CustomTheme } from '../../misc/theme'
import cryptocurrencies from '../../misc/cryptocurrencies'
import useStyles from './styles'
import { getLatestAccountBalance } from '../../graphql/queries/accountBalances'

interface StarredAccountProps {
account: Account
}

const StarredAccount: React.FC<StarredAccountProps> = ({ account }) => {
const themeStyle: CustomTheme = useTheme()
const { lang } = useTranslation('common')
const { currency } = useGeneralContext()
const classes = useStyles()
const crypto = cryptocurrencies[account.crypto]
// Latest data
const { data: balanceData, loading } = useSubscription(
gql`
${getLatestAccountBalance(account.crypto)}
`,
{ variables: { address: account.address } }
)
const { tokenAmounts, usdBalance } = React.useMemo(() => {
const accountBalance = transformGqlAcountBalance(balanceData, Date.now())
return {
tokenAmounts: getTotalTokenAmount(accountBalance).amount,
usdBalance: getTotalBalance(accountBalance).balance,
}
}, [balanceData])
return (
<Link key={account.address} href="/account/[address]" as={`/account/${account.address}`}>
<ListItem className={classes.favMenuItem} button component="a">
<ListItemIcon>
<Avatar
alt={crypto.name}
src={crypto.image}
style={{ height: themeStyle.spacing(4), width: themeStyle.spacing(4) }}
/>
</ListItemIcon>
<Box display="flex" flexDirection="column">
<ListItemText
primary={account.name}
primaryTypographyProps={{
variant: 'h6',
}}
/>
{loading ? (
<Box>
<CircularProgress size={20} />
</Box>
) : (
<Box mt={-1}>
<Typography variant="body2" color="textSecondary">
{formatTokenAmount(tokenAmounts, account.crypto, lang)}
</Typography>
{/* after USD balance is added */}
{/* <Typography>{formatCurrency(usdBalance, currency, lang)}</Typography> */}
</Box>
)}
</Box>
</ListItem>
</Link>
)
}

export default StarredAccount
Loading

0 comments on commit 6a90171

Please sign in to comment.