Skip to content

Commit

Permalink
Merge pull request #1469 from LiskHQ/1343-duplicated-pending-initiali…
Browse files Browse the repository at this point in the history
…sation

Fix duplicated initialisation transaction - Closes #1343
  • Loading branch information
michaeltomasik committed Nov 13, 2018
2 parents 6ff918c + 68ed242 commit b597a56
Show file tree
Hide file tree
Showing 5 changed files with 42 additions and 14 deletions.
6 changes: 5 additions & 1 deletion src/components/dashboard/index.js
Expand Up @@ -12,6 +12,7 @@ import routes from '../../constants/routes';
import FollowedAccounts from '../followedAccounts/index';
import QuickTips from '../quickTips';
import NewsFeed from '../newsFeed';
import removeDuplicateTransactions from '../../utils/transactions';

import styles from './dashboard.css';

Expand Down Expand Up @@ -80,7 +81,10 @@ class Dashboard extends React.Component {
}

const mapStateToProps = state => ({
transactions: [...state.transactions.pending, ...state.transactions.confirmed].slice(0, 5),
transactions: removeDuplicateTransactions(
state.transactions.pending,
state.transactions.confirmed,
).slice(0, 5),
pendingTransactions: state.transactions.pending,
account: state.account,
loading: state.loading.length > 0,
Expand Down
7 changes: 6 additions & 1 deletion src/components/transactions/walletTransactions/index.js
Expand Up @@ -7,12 +7,17 @@ import { searchAccount } from '../../../actions/search';
import WalletTransactions from './walletTransactions';
import actionTypes from '../../../constants/actions';
import txFilters from './../../../constants/transactionFilters';
import removeDuplicateTransactions from '../../../utils/transactions';

/* istanbul ignore next */
const mapStateToProps = state => ({
account: state.account,
transaction: state.transaction,
transactions: [...state.transactions.pending, ...state.transactions.confirmed],
transactions:
removeDuplicateTransactions(
state.transactions.pending,
state.transactions.confirmed,
),
votes: state.account.votes ?
state.account.votes :
state.search.votes[state.account.addres],
Expand Down
7 changes: 7 additions & 0 deletions src/utils/transactions.js
@@ -0,0 +1,7 @@

export default (pendingTransactions, confirmedTransactions) =>
[...pendingTransactions, ...confirmedTransactions]
.filter((transactionA, index, self) =>
index === self.findIndex(transactionB => (
transactionB.id === transactionA.id
)));
16 changes: 11 additions & 5 deletions test/integration/dashboard.test.js
Expand Up @@ -55,11 +55,17 @@ describe('@integration: Dashboard', () => {
}

const generateTransactions = (n) => {
const transactionExample = {
id: 10385202636, senderId: 'sample_address', receiverId: 'some_address', type: txTypes.send,
};
const transactions = new Array(n);
transactions.fill(transactionExample);
const transactions = [];
for (let i = 0; i <= n; i++) {
const transactionExample = {
id: 10385202636 + i,
senderId: 'sample_address',
receiverId: 'some_address',
type: txTypes.send,
confirmations: 1,
};
transactions.push(transactionExample);
}
return transactions;
};

Expand Down
20 changes: 13 additions & 7 deletions test/integration/wallet.test.js
Expand Up @@ -74,12 +74,18 @@ describe('@integration: Wallet', () => {
const successMessage = 'Transaction is being processed and will be confirmed. It may take up to 15 minutes to be secured in the blockchain.';
const errorMessage = 'An error occurred while creating the transaction.';

const generateTransactions = (n) => {
const transactionExample = {
senderId: 'sample_address', receiverId: 'some_address', type: txTypes.send, id: '123456',
};
const transactions = new Array(n);
transactions.fill(transactionExample);
const generateTransactions = (n, firstRun = false) => {
const transactions = [];
for (let i = 0; i < n; i++) {
const transactionExample = {
id: (i === 0 && firstRun) ? 123456 : Math.random() * i,
senderId: 'sample_address',
receiverId: 'some_address',
type: txTypes.send,
confirmations: 1,
};
transactions.push(transactionExample);
}
return transactions;
};

Expand Down Expand Up @@ -337,7 +343,7 @@ describe('@integration: Wallet', () => {
address: match.defined,
limit: 25,
filter: txFilters.all,
}).returnsPromise().resolves({ data: generateTransactions(25), meta: { count: 50 } });
}).returnsPromise().resolves({ data: generateTransactions(25, true), meta: { count: 50 } });

// loadTransactions does not pass filter
getTransactionsStub.withArgs({
Expand Down

0 comments on commit b597a56

Please sign in to comment.