Skip to content

Commit bb8d78a

Browse files
authored
Merge pull request #5410 from LiskHQ/5349-introduce-new-transaction-column
Implemented additional value column on transaction table
2 parents 5027980 + e5d2ea5 commit bb8d78a

File tree

20 files changed

+124
-75
lines changed

20 files changed

+124
-75
lines changed

src/locales/en/common.json

+1
Original file line numberDiff line numberDiff line change
@@ -770,6 +770,7 @@
770770
"Validator slot status": "Validator slot status",
771771
"Validator weight": "Validator weight",
772772
"Validators": "Validators",
773+
"Value": "Value",
773774
"Verify message": "Verify message",
774775
"Verify the integrity of a signed message": "Verify the integrity of a signed message",
775776
"Version": "Version",

src/modules/blockchainApplication/manage/hooks/useApplicationManagement.test.js

+1
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ const mockCurrentApplication = mockApplications[3];
2525
const mockSetApplication = jest.fn();
2626

2727
jest.mock('react-redux', () => ({
28+
...jest.requireActual('react-redux'),
2829
useSelector: jest.fn().mockImplementation((fn) => fn(mockState)),
2930
useDispatch: () => mockDispatch,
3031
}));

src/modules/blockchainApplication/manage/hooks/useCurrentApplication.test.js

+1
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ const mockHistory = {
3030
push: jest.fn(),
3131
};
3232
jest.mock('react-redux', () => ({
33+
...jest.requireActual('react-redux'),
3334
useSelector: jest.fn().mockImplementation((fn) => fn(mockState)),
3435
useDispatch: () => mockDispatch,
3536
}));

src/modules/blockchainApplication/manage/hooks/useGetDefaultApplication.test.js

+1
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ const refetchBlockchainApplicationMeta = jest.fn();
1717
const refetchApplicationExplore = jest.fn();
1818

1919
jest.mock('react-redux', () => ({
20+
...jest.requireActual('react-redux'),
2021
useSelector: jest.fn().mockImplementation((fn) => fn(mockState)),
2122
useDispatch: () => mockDispatch,
2223
}));

src/modules/pos/validator/components/LatestStakes/index.test.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { mockTransactions } from '@transaction/__fixtures__';
33
import { useTransactions } from '@transaction/hooks/queries';
44
import { mockAppsTokens } from '@token/fungible/__fixtures__';
55
import usePosToken from '@pos/validator/hooks/usePosToken';
6-
import { useTokenBalances } from '@token/fungible/hooks/queries';
6+
import { useNetworkSupportedTokens, useTokenBalances } from '@token/fungible/hooks/queries';
77
import { useValidators } from '../../hooks/queries';
88
import LatestStakes from './index';
99
import { mockValidators } from '../../__fixtures__';
@@ -24,6 +24,7 @@ describe('Latest stakes', () => {
2424

2525
usePosToken.mockReturnValue({ token: mockAppsTokens.data[0] });
2626
useTokenBalances.mockReturnValue({ data: mockAppsTokens.data[0] });
27+
useNetworkSupportedTokens.mockReturnValue({ data: mockAppsTokens.data });
2728

2829
it('displays initial table of stakes', () => {
2930
useValidators.mockReturnValue({

src/modules/pos/validator/components/Overview/Registrations.test.js

-6
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,6 @@ import * as queryHooks from '../../hooks/queries/useRegistrations';
44
import { useRegistrations } from '../../hooks/queries';
55
import Registrations from './Registrations';
66

7-
jest.mock('react-i18next', () => ({
8-
useTranslation: () => ({
9-
t: (key) => key,
10-
}),
11-
}));
12-
137
jest.spyOn(queryHooks, 'useRegistrations');
148

159
describe('Registrations', () => {

src/modules/transaction/components/BlockDetailsTransactions/BlockDetailsTransactions.test.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { mountWithRouter } from 'src/utils/testHelpers';
22
import mockManagedApplications from '@tests/fixtures/blockchainApplicationsManage';
3-
import { useTokenBalances } from '@token/fungible/hooks/queries';
3+
import { useNetworkSupportedTokens, useTokenBalances } from '@token/fungible/hooks/queries';
44
import { mockAppsTokens } from '@token/fungible/__fixtures__';
55
import { useCurrentApplication } from '@blockchainApplication/manage/hooks';
66
import { mockBlocks } from '@block/__fixtures__';
@@ -18,6 +18,7 @@ jest.mock('@token/fungible/hooks/queries');
1818
useTokenBalances.mockReturnValue({ data: mockAppsTokens.data[0] });
1919
useLatestBlock.mockReturnValue({ data: mockBlocks.data[0] });
2020
useCurrentApplication.mockReturnValue([mockManagedApplications[1], mockSetApplication]);
21+
useNetworkSupportedTokens.mockReturnValue({ data: mockAppsTokens.data });
2122

2223
describe('BlockDetails page', () => {
2324
let wrapper;

src/modules/transaction/components/Explorer/ExplorerTransactionsHeaderMap.js

+11-11
Original file line numberDiff line numberDiff line change
@@ -3,28 +3,28 @@ import styles from './ExplorerTransactions.css';
33

44
export default (t, activeToken, changeSort) => [
55
{
6-
title: t('ID'),
6+
title: t('Recipient'),
77
classList: `${grid['col-xs-3']} ${styles.transactionTitle}`,
88
},
99
{
10-
title: t('Height'),
10+
title: t('Type'),
1111
classList: grid['col-xs-2'],
12-
sort: {
13-
fn: changeSort,
14-
key: 'timestamp',
15-
},
1612
},
1713
{
18-
title: t('Type'),
19-
classList: grid['col-xs-3'],
14+
title: t('Value'),
15+
classList: `${grid['col-xs-2']} ${grid['col-md-2']}`,
2016
},
2117
{
2218
title: t('Date'),
23-
classList: `${grid['col-xs-2']} ${grid['col-md-2']}`,
19+
classList: `${grid['col-xs-1']} ${grid['col-md-2']}`,
2420
},
2521
{
26-
title: t('Fee'),
27-
classList: `${grid['col-xs-1']} ${grid['col-md-1']}`,
22+
title: t('Height'),
23+
classList: grid['col-xs-2'],
24+
sort: {
25+
fn: changeSort,
26+
key: 'timestamp',
27+
},
2828
},
2929
{
3030
title: t('Status'),

src/modules/transaction/components/TransactionDetailsView/index.js

+10-7
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,9 @@ import { splitModuleAndCommand } from '../../utils';
2525
const TransactionDetails = () => {
2626
const { search } = useLocation();
2727
const transactionID = parseSearchParams(search).transactionID;
28+
const showParams = JSON.parse(parseSearchParams(search).showParams || 'false');
2829
const { t } = useTranslation();
29-
const [isParamsCollapsed, setIsParamsCollapsed] = useState(false);
30+
const [isParamsCollapsed, setIsParamsCollapsed] = useState(showParams);
3031
const { data: fees } = useFees();
3132
const feeTokenID = fees?.data?.feeTokenID;
3233
const { data: token } = useAppsMetaTokens({
@@ -139,12 +140,14 @@ const TransactionDetails = () => {
139140
onToggleJsonView: () => setIsParamsCollapsed((state) => !state),
140141
}}
141142
/>
142-
<div
143-
data-testid="transaction-param-json-viewer"
144-
className={`${styles.jsonContainer} ${!isParamsCollapsed ? styles.shrink : ''}`}
145-
>
146-
<ReactJson name={false} src={transactionData.params} theme={jsonViewerTheme} />
147-
</div>
143+
{!isLoading && (
144+
<div
145+
data-testid="transaction-param-json-viewer"
146+
className={`${styles.jsonContainer} ${!isParamsCollapsed ? styles.shrink : ''}`}
147+
>
148+
<ReactJson name={false} src={transactionData.params} theme={jsonViewerTheme} />
149+
</div>
150+
)}
148151
</BoxContent>
149152
</Box>
150153
<Box isLoading={isLoading} className={styles.container}>

src/modules/transaction/components/TransactionDetailsView/styles.css

+4
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,10 @@
7070
box-sizing: border-box;
7171
font-size: var(--paragraph-font-size-s);
7272

73+
& > div:first-child {
74+
overflow-x: auto;
75+
}
76+
7377
&.shrink {
7478
display: none;
7579
}

src/modules/transaction/components/TransactionMonitor/TransactionHeaderMap.js

+6-2
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,19 @@ export default (changeSort, t) => [
1414
},
1515
{
1616
title: t('Height'),
17-
classList: `${grid['col-xs-2']} ${styles.transactionFeeCell}`,
17+
classList: `${grid['col-xs-1']} ${styles.transactionFeeCell}`,
1818
sort: {
1919
fn: changeSort,
2020
key: 'height',
2121
},
2222
},
2323
{
2424
title: t('Type'),
25-
classList: `${grid['col-xs-3']} ${grid['col-md-3']}`,
25+
classList: `${grid['col-xs-2']} ${grid['col-md-2']}`,
26+
},
27+
{
28+
title: t('Value'),
29+
classList: `${grid['col-xs-2']} ${grid['col-md-2']}`,
2630
},
2731
{
2832
title: t('Date'),

src/modules/transaction/components/TransactionMonitor/TransactionMonitorList.test.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { mountWithRouterAndQueryClient } from 'src/utils/testHelpers';
55
import { DEFAULT_LIMIT } from 'src/utils/monitor';
66
import { mockBlocks } from '@block/__fixtures__';
77
import { useLatestBlock } from '@block/hooks/queries/useLatestBlock';
8-
import { useTokenBalances } from '@token/fungible/hooks/queries';
8+
import { useNetworkSupportedTokens, useTokenBalances } from '@token/fungible/hooks/queries';
99
import { mockAppsTokens } from '@token/fungible/__fixtures__';
1010
import mockManagedApplications from '@tests/fixtures/blockchainApplicationsManage';
1111
import { useCurrentApplication } from '@blockchainApplication/manage/hooks/useCurrentApplication';
@@ -90,6 +90,7 @@ describe('Transactions monitor page', () => {
9090
};
9191

9292
useTokenBalances.mockReturnValue({ data: mockAppsTokens.data[0] });
93+
useNetworkSupportedTokens.mockReturnValue({ data: mockAppsTokens.data });
9394
useLatestBlock.mockReturnValue({ data: mockBlocks.data[0] });
9495
useCurrentApplication.mockReturnValue([mockManagedApplications[1], mockSetApplication]);
9596
useCommandSchema.mockReturnValue({

src/modules/transaction/components/TransactionRow/components.js

+13-29
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import React, { useContext } from 'react';
22
import { Link } from 'react-router-dom';
3-
import { getTransactionAmount } from '@transaction/utils/transaction';
3+
import { getTransactionValue } from '@transaction/utils/transaction';
44
import { MODULE_COMMANDS_NAME_MAP } from 'src/modules/transaction/configuration/moduleCommand';
55
import DateTimeFromTimestamp from 'src/modules/common/components/timestamp';
66
import WalletVisual from '@wallet/components/walletVisual';
@@ -22,7 +22,6 @@ import { getValidatorDetailsClass } from '@pos/validator/components/ValidatorsTa
2222
import styles from './row.css';
2323
import TransactionRowContext from '../../context/transactionRowContext';
2424
import TransactionTypeFigure from '../TransactionTypeFigure';
25-
import TransactionAmount from '../TransactionAmount';
2625

2726
export const ID = ({ isWallet }) => {
2827
const { data, address } = useContext(TransactionRowContext);
@@ -54,13 +53,20 @@ export const Type = () => {
5453
return <span className={styles.type}>{formatTransactionType(data.moduleCommand)}</span>;
5554
};
5655

57-
export const ValidatorDetails = () => {
58-
const { data, activeTab } = useContext(TransactionRowContext);
56+
export const ValidatorDetails = ({ isWallet }) => {
57+
const { data, activeTab, address } = useContext(TransactionRowContext);
5958

6059
return (
6160
<span className={getValidatorDetailsClass(activeTab)}>
6261
<div className={styles.validatorColumn}>
6362
<div className={`${styles.validatorDetails}`}>
63+
{isWallet && (
64+
<Icon
65+
name={
66+
data.sender.address === address ? 'sentTransactionIcon' : 'receivedTransactionIcon'
67+
}
68+
/>
69+
)}
6470
<WalletVisual address={data.sender.address} />
6571
<div>
6672
<p className={styles.validatorName}>{data.sender.name}</p>
@@ -72,7 +78,7 @@ export const ValidatorDetails = () => {
7278
);
7379
};
7480

75-
export const Sender = () => <ValidatorDetails />;
81+
export const Sender = ({ isWallet }) => <ValidatorDetails isWallet={isWallet} />;
7682

7783
export const Recipient = () => {
7884
const { data, avatarSize } = useContext(TransactionRowContext);
@@ -140,30 +146,8 @@ export const Date = ({ t }) => {
140146
};
141147

142148
export const Amount = () => {
143-
const { data, layout, activeToken, host, token } = useContext(TransactionRowContext);
144-
145-
if (layout !== 'full') {
146-
return (
147-
<span>
148-
<TransactionAmount
149-
host={host}
150-
token={activeToken}
151-
showRounded
152-
recipient={data.params.recipientAddress}
153-
moduleCommand={data.moduleCommand}
154-
amount={getTransactionAmount(data)}
155-
/>
156-
</span>
157-
);
158-
}
159-
return (
160-
<span className={styles.amount}>
161-
<TokenAmount val={getTransactionAmount(data)} token={token} />
162-
<span className={`${styles.fee} hideOnLargeViewPort`}>
163-
<TokenAmount val={data.fee} token={token} />
164-
</span>
165-
</span>
166-
);
149+
const { data, token } = useContext(TransactionRowContext);
150+
return <span className={styles.amount}>{getTransactionValue(data, token)}</span>;
167151
};
168152

169153
export const Fee = ({ t }) => {

src/modules/transaction/components/TransactionRow/index.js

+6-3
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import React from 'react';
22
import { withTranslation } from 'react-i18next';
33
import { Link } from 'react-router-dom';
4-
import { useTokenBalances } from '@token/fungible/hooks/queries';
4+
import { useNetworkSupportedTokens } from '@token/fungible/hooks/queries';
55
import routes from 'src/routes/routes';
66
import grid from 'flexboxgrid/dist/flexboxgrid.css';
77
import { useCurrentApplication } from '@blockchainApplication/manage/hooks';
@@ -24,8 +24,11 @@ const TransactionRow = ({
2424
}) => {
2525
const Layout = LayoutSchema[layout] || LayoutSchema.default;
2626
const [currentApplication] = useCurrentApplication();
27-
const { data: tokens } = useTokenBalances();
28-
const token = tokens?.data?.find(({ chainID }) => chainID === currentApplication.chainID) || {};
27+
const networkSupportedTokens = useNetworkSupportedTokens(currentApplication);
28+
29+
const token =
30+
networkSupportedTokens.data?.find(({ chainID }) => chainID === currentApplication.chainID) ||
31+
{};
2932

3033
return (
3134
<Link

src/modules/transaction/components/TransactionRow/index.test.js

+3-2
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { mountWithRouter } from 'src/utils/testHelpers';
22
import moment from 'moment';
33
import accounts from '@tests/constants/wallets';
44
import { truncateAddress } from '@wallet/utils/account';
5-
import { useTokenBalances } from '@token/fungible/hooks/queries';
5+
import { useNetworkSupportedTokens, useTokenBalances } from '@token/fungible/hooks/queries';
66
import { mockAppsTokens } from '@token/fungible/__fixtures__';
77
import Row from '.';
88
import { mockTransactions } from '../../__fixtures__';
@@ -56,6 +56,7 @@ const transfer = {
5656

5757
jest.mock('@token/fungible/hooks/queries');
5858
useTokenBalances.mockReturnValue({ data: mockAppsTokens.data[0] });
59+
useNetworkSupportedTokens.mockReturnValue({ data: mockAppsTokens.data });
5960

6061
describe('Transaction Row', () => {
6162
const t = (str) => str;
@@ -99,7 +100,7 @@ describe('Transaction Row', () => {
99100
layout: 'hosted',
100101
};
101102
const wrapper = mountWithRouter(Row, props, {});
102-
expect(wrapper.find('Sender')).toHaveLength(0);
103+
expect(wrapper.find('Sender')).toHaveLength(1);
103104
});
104105
});
105106

src/modules/transaction/components/TransactionRow/layoutSchema.js

+2-3
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,11 @@ import {
1010
Status,
1111
ValidatorDetails,
1212
Round,
13-
Fee,
1413
} from './components';
1514
import styles from './schemas.css';
1615

17-
const hosted = [ID, Height, Type, Date, Fee, Status];
18-
const full = [ID, Sender, Height, Type, Date, Status];
16+
const hosted = [Sender, Type, Amount, Date, Height, Status];
17+
const full = [ID, Sender, Height, Type, Amount, Date, Status];
1918
const minimal = [Counterpart, Amount];
2019
const stake = [ValidatorDetails, Date, Round, Params];
2120

src/modules/transaction/components/TransactionRow/row.css

+5-1
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
.amount {
2828
display: flex;
2929
flex-direction: column;
30-
align-items: flex-start;
30+
align-items: flex-start !important;
3131

3232
& > .fee {
3333
font-family: var(--content-font);
@@ -99,6 +99,10 @@
9999
flex-direction: row;
100100
align-items: center;
101101

102+
& > img {
103+
margin-right: 10px;
104+
}
105+
102106
& > div {
103107
display: flex;
104108
flex-direction: column;

0 commit comments

Comments
 (0)