zepio/app/components/transaction-item.js

135 lines
3.7 KiB
JavaScript
Raw Normal View History

2018-12-12 13:14:58 -08:00
// @flow
2019-02-04 20:41:45 -08:00
2018-12-12 13:14:58 -08:00
import React from 'react';
import styled from 'styled-components';
import dateFns from 'date-fns';
import SentIcon from '../assets/images/transaction_sent_icon.svg';
import ReceivedIcon from '../assets/images/transaction_received_icon.svg';
import { RowComponent } from './row';
import { ColumnComponent } from './column';
import { TextComponent } from './text';
import { ModalComponent } from './modal';
import { TransactionDetailsComponent } from './transaction-details';
2018-12-12 13:14:58 -08:00
import theme from '../theme';
2019-01-29 07:36:13 -08:00
import { formatNumber } from '../utils/format-number';
import { truncateAddress } from '../utils/truncate-address';
2018-12-12 13:14:58 -08:00
const Wrapper = styled(RowComponent)`
background-color: ${props => props.theme.colors.cardBackgroundColor};
padding: 15px 17px;
cursor: pointer;
&:hover {
2019-01-24 06:56:49 -08:00
background-color: #0a0a0a;
}
2018-12-12 13:14:58 -08:00
`;
const Icon = styled.img`
width: 20px;
height: 20px;
`;
/* eslint-disable max-len */
2018-12-12 13:14:58 -08:00
const TransactionTypeLabel = styled(TextComponent)`
color: ${(props: PropsWithTheme<{ isReceived: boolean }>) => (props.isReceived ? props.theme.colors.transactionReceived : props.theme.colors.transactionSent)};
2018-12-12 13:14:58 -08:00
text-transform: capitalize;
`;
/* eslint-enable max-len */
2018-12-12 13:14:58 -08:00
2019-01-24 06:56:49 -08:00
const TransactionAddress = styled(TextComponent)`
color: #a7a7a7;
${String(Wrapper)}:hover & {
2019-01-24 06:56:49 -08:00
color: #fff;
}
`;
2018-12-12 13:14:58 -08:00
const TransactionTime = styled(TextComponent)`
color: ${props => props.theme.colors.inactiveItem};
2018-12-12 13:14:58 -08:00
`;
2018-12-12 13:19:45 -08:00
const TransactionColumn = styled(ColumnComponent)`
2018-12-12 13:14:58 -08:00
margin-left: 10px;
2018-12-12 13:19:45 -08:00
margin-right: 80px;
min-width: 60px;
2018-12-12 13:14:58 -08:00
`;
export type Transaction = {
type: 'send' | 'receive',
2018-12-12 13:14:58 -08:00
date: string,
address: string,
amount: number,
zecPrice: number,
transactionId: string,
2018-12-12 13:14:58 -08:00
};
export const TransactionItemComponent = ({
2018-12-15 07:10:39 -08:00
type,
date,
address,
amount,
zecPrice,
transactionId,
}: Transaction) => {
const isReceived = type === 'receive';
2018-12-15 07:10:39 -08:00
const transactionTime = dateFns.format(new Date(date), 'HH:mm A');
const transactionValueInZec = formatNumber({
value: amount,
append: `${isReceived ? '+' : '-'}ZEC `,
});
const transactionValueInUsd = formatNumber({
value: amount * zecPrice,
append: `${isReceived ? '+' : '-'}USD $`,
});
const transactionAddress = truncateAddress(address);
2018-12-12 13:14:58 -08:00
return (
<ModalComponent
renderTrigger={toggleVisibility => (
<Wrapper
2019-01-23 11:37:35 -08:00
id={`transaction-item-${transactionId}`}
alignItems='center'
justifyContent='space-between'
onClick={toggleVisibility}
>
<RowComponent alignItems='center'>
<RowComponent alignItems='center'>
<Icon src={isReceived ? ReceivedIcon : SentIcon} alt='Transaction Type Icon' />
<TransactionColumn>
<TransactionTypeLabel isReceived={isReceived} value={type} isBold />
<TransactionTime value={transactionTime} />
</TransactionColumn>
</RowComponent>
2019-01-24 06:56:49 -08:00
<TransactionAddress value={transactionAddress} />
</RowComponent>
<ColumnComponent alignItems='flex-end'>
<TextComponent
isBold
value={transactionValueInZec}
color={isReceived ? theme.colors.transactionReceived : theme.colors.transactionSent}
/>
<TextComponent value={transactionValueInUsd} color={theme.colors.inactiveItem} />
</ColumnComponent>
</Wrapper>
)}
>
{toggleVisibility => (
<TransactionDetailsComponent
amount={amount}
date={date}
from={address}
to=''
transactionId={transactionId}
handleClose={toggleVisibility}
type={type}
zecPrice={zecPrice}
2018-12-12 13:14:58 -08:00
/>
)}
</ModalComponent>
2018-12-12 13:14:58 -08:00
);
};