chore(transactions): redux state
This commit is contained in:
parent
9f84092d6d
commit
bddd8e3ce6
|
@ -30,6 +30,7 @@ describe('Transactions Actions', () => {
|
|||
const payload = {
|
||||
list: [],
|
||||
zecPrice: 0,
|
||||
hasNextPage: false,
|
||||
};
|
||||
|
||||
store.dispatch(loadTransactionsSuccess(payload));
|
||||
|
|
|
@ -2,9 +2,6 @@
|
|||
|
||||
import eres from 'eres';
|
||||
import { connect } from 'react-redux';
|
||||
import flow from 'lodash.flow';
|
||||
import groupBy from 'lodash.groupby';
|
||||
import dateFns from 'date-fns';
|
||||
import { BigNumber } from 'bignumber.js';
|
||||
|
||||
import { TransactionsView } from '../views/transactions';
|
||||
|
@ -12,6 +9,7 @@ import {
|
|||
loadTransactions,
|
||||
loadTransactionsSuccess,
|
||||
loadTransactionsError,
|
||||
resetTransactionsList,
|
||||
} from '../redux/modules/transactions';
|
||||
import rpc from '../../services/api';
|
||||
import { listShieldedTransactions } from '../../services/shielded-transactions';
|
||||
|
@ -21,45 +19,64 @@ import { sortByDescend } from '../utils/sort-by-descend';
|
|||
|
||||
import type { AppState } from '../types/app-state';
|
||||
import type { Dispatch } from '../types/redux';
|
||||
import type { Transaction } from '../components/transaction-item';
|
||||
|
||||
const mapStateToProps = ({ transactions }: AppState) => ({
|
||||
transactions: transactions.list,
|
||||
isLoading: transactions.isLoading,
|
||||
error: transactions.error,
|
||||
zecPrice: transactions.zecPrice,
|
||||
hasNextPage: transactions.hasNextPage,
|
||||
});
|
||||
|
||||
const mapDispatchToProps = (dispatch: Dispatch) => ({
|
||||
getTransactions: async () => {
|
||||
export type MapStateToProps = {
|
||||
transactions: Transaction[],
|
||||
isLoading: boolean,
|
||||
error: string | null,
|
||||
zecPrice: number,
|
||||
hasNextPage: boolean,
|
||||
};
|
||||
|
||||
export type MapDispatchToProps = {|
|
||||
getTransactions: ({
|
||||
offset: number,
|
||||
count: number,
|
||||
shieldedTransactionsCount: number,
|
||||
}) => Promise<void>,
|
||||
resetTransactionsList: () => void,
|
||||
|};
|
||||
|
||||
const mapDispatchToProps = (dispatch: Dispatch): MapDispatchToProps => ({
|
||||
resetTransactionsList: () => dispatch(resetTransactionsList()),
|
||||
getTransactions: async ({ offset, count, shieldedTransactionsCount }) => {
|
||||
dispatch(loadTransactions());
|
||||
|
||||
const [transactionsErr, transactions = []] = await eres(rpc.listtransactions('', 200));
|
||||
const [transactionsErr, transactions = []] = await eres(
|
||||
rpc.listtransactions('', count, offset),
|
||||
);
|
||||
|
||||
if (transactionsErr) {
|
||||
return dispatch(loadTransactionsError({ error: transactionsErr.message }));
|
||||
}
|
||||
|
||||
const formattedTransactions = flow([
|
||||
arr => arr.map(transaction => ({
|
||||
transactionId: transaction.txid,
|
||||
const formattedTransactions = sortByDescend('date')(
|
||||
[
|
||||
...transactions,
|
||||
...listShieldedTransactions({ count, offset: shieldedTransactionsCount }),
|
||||
].map(transaction => ({
|
||||
transactionId: transaction.txid ? transaction.txid : null,
|
||||
type: transaction.category,
|
||||
date: new Date(transaction.time * 1000).toISOString(),
|
||||
address: transaction.address,
|
||||
amount: new BigNumber(transaction.amount).absoluteValue().toNumber(),
|
||||
})),
|
||||
arr => groupBy(arr, obj => dateFns.format(obj.date, 'MMM DD, YYYY')),
|
||||
obj => Object.keys(obj).map(day => ({
|
||||
day,
|
||||
jsDay: new Date(day),
|
||||
list: sortByDescend('date')(obj[day]),
|
||||
})),
|
||||
sortByDescend('jsDay'),
|
||||
])([...transactions, ...listShieldedTransactions()]);
|
||||
);
|
||||
|
||||
dispatch(
|
||||
loadTransactionsSuccess({
|
||||
list: formattedTransactions,
|
||||
zecPrice: new BigNumber(store.get('ZEC_DOLLAR_PRICE')).toNumber(),
|
||||
hasNextPage: Boolean(formattedTransactions.length),
|
||||
}),
|
||||
);
|
||||
},
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
// @flow
|
||||
|
||||
import uniq from 'lodash.uniq';
|
||||
import type { Action } from '../../types/redux';
|
||||
import type { Transaction } from '../../components/transaction-item';
|
||||
|
||||
|
@ -7,6 +7,7 @@ import type { Transaction } from '../../components/transaction-item';
|
|||
export const LOAD_TRANSACTIONS = 'LOAD_TRANSACTIONS';
|
||||
export const LOAD_TRANSACTIONS_SUCCESS = 'LOAD_TRANSACTIONS_SUCCESS';
|
||||
export const LOAD_TRANSACTIONS_ERROR = 'LOAD_TRANSACTIONS_ERROR';
|
||||
export const RESET_TRANSACTIONS_LIST = 'RESET_TRANSACTIONS_LIST';
|
||||
|
||||
export type TransactionsList = { day: string, list: Transaction[] }[];
|
||||
|
||||
|
@ -18,14 +19,17 @@ export const loadTransactions = () => ({
|
|||
export const loadTransactionsSuccess = ({
|
||||
list,
|
||||
zecPrice,
|
||||
hasNextPage,
|
||||
}: {
|
||||
list: TransactionsList,
|
||||
list: Transaction[],
|
||||
zecPrice: number,
|
||||
hasNextPage: boolean,
|
||||
}) => ({
|
||||
type: LOAD_TRANSACTIONS_SUCCESS,
|
||||
payload: {
|
||||
list,
|
||||
zecPrice,
|
||||
hasNextPage,
|
||||
},
|
||||
});
|
||||
|
||||
|
@ -34,11 +38,17 @@ export const loadTransactionsError = ({ error }: { error: string }) => ({
|
|||
payload: { error },
|
||||
});
|
||||
|
||||
export const resetTransactionsList = () => ({
|
||||
type: RESET_TRANSACTIONS_LIST,
|
||||
payload: {},
|
||||
});
|
||||
|
||||
export type State = {
|
||||
isLoading: boolean,
|
||||
error: string | null,
|
||||
list: TransactionsList,
|
||||
list: Transaction[],
|
||||
zecPrice: number,
|
||||
hasNextPage: boolean,
|
||||
};
|
||||
|
||||
const initialState = {
|
||||
|
@ -46,6 +56,7 @@ const initialState = {
|
|||
list: [],
|
||||
error: null,
|
||||
isLoading: false,
|
||||
hasNextPage: true,
|
||||
};
|
||||
|
||||
// eslint-disable-next-line
|
||||
|
@ -61,6 +72,7 @@ export default (state: State = initialState, action: Action) => {
|
|||
return {
|
||||
...state,
|
||||
...action.payload,
|
||||
list: uniq(state.list.concat(action.payload.list)),
|
||||
isLoading: false,
|
||||
error: null,
|
||||
};
|
||||
|
@ -70,6 +82,13 @@ export default (state: State = initialState, action: Action) => {
|
|||
isLoading: false,
|
||||
error: action.payload.error,
|
||||
};
|
||||
case RESET_TRANSACTIONS_LIST:
|
||||
return {
|
||||
...state,
|
||||
isLoading: false,
|
||||
error: null,
|
||||
list: [],
|
||||
};
|
||||
default:
|
||||
return state;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue