@@ -3,11 +3,15 @@ import React, { Component } from 'react';
33import { observer } from 'mobx-react' ;
44import { defineMessages , intlShape , FormattedHTMLMessage } from 'react-intl' ;
55import SVGInline from 'react-svg-inline' ;
6- import { get , map , orderBy } from 'lodash' ;
6+ import { get , map } from 'lodash' ;
77import classNames from 'classnames' ;
8- import { BigNumber } from 'bignumber.js' ;
98import { Link } from 'react-polymorph/lib/components/Link' ;
109import { LinkSkin } from 'react-polymorph/lib/skins/simple/LinkSkin' ;
10+ import {
11+ bigNumberComparator ,
12+ stringComparator ,
13+ dateComparator ,
14+ } from '../../../utils/sortComparators' ;
1115import BorderedBox from '../../widgets/BorderedBox' ;
1216import LoadingSpinner from '../../widgets/LoadingSpinner' ;
1317import sortIcon from '../../../assets/images/ascending.inline.svg' ;
@@ -66,6 +70,21 @@ const messages = defineMessages({
6670 } ,
6771} ) ;
6872
73+ const REWARD_FIELDS = {
74+ WALLET_NAME : 'wallet' ,
75+ IS_RESTORING : 'isRestoring' ,
76+ POOL : 'pool' ,
77+ NAME : 'name' ,
78+ TICKER : 'ticker' ,
79+ REWARD : 'reward' ,
80+ DATE : 'date' ,
81+ } ;
82+
83+ const REWARD_ORDERS = {
84+ ASCENDING : 'asc' ,
85+ DESCENDING : 'desc' ,
86+ } ;
87+
6988type Props = {
7089 rewards : Array < Reward > ,
7190 isLoading : boolean ,
@@ -87,46 +106,89 @@ export default class StakingRewards extends Component<Props, State> {
87106 isLoading : false ,
88107 } ;
89108
90- constructor ( ) {
91- super ( ) ;
109+ constructor ( props : Props ) {
110+ super ( props ) ;
92111 this . state = {
93- rewardsOrder : 'desc' ,
94- rewardsSortBy : 'date' ,
112+ rewardsOrder : REWARD_ORDERS . DESCENDING ,
113+ rewardsSortBy : REWARD_FIELDS . DATE ,
95114 } ;
96115 }
97116
98- render ( ) {
117+ getSortedRewards = ( ) : Array < Reward > => {
118+ const { rewards } = this . props ;
99119 const { rewardsOrder, rewardsSortBy } = this . state ;
100- const { rewards , isLoading , onLearnMoreClick } = this . props ;
120+ return rewards . slice ( ) . sort ( ( rewardA : Reward , rewardB : Reward ) => {
121+ const rewardCompareResult = bigNumberComparator (
122+ rewardA . reward ,
123+ rewardB . reward ,
124+ rewardsOrder === REWARD_ORDERS . ASCENDING
125+ ) ;
126+ const walletNameCompareResult = stringComparator (
127+ rewardA . wallet ,
128+ rewardB . wallet ,
129+ rewardsOrder === REWARD_ORDERS . ASCENDING
130+ ) ;
131+ const poolCompareResult = stringComparator (
132+ rewardA . pool . name ,
133+ rewardB . pool . name ,
134+ rewardsOrder === REWARD_ORDERS . ASCENDING
135+ ) ;
136+ const dateCompareResult = dateComparator (
137+ rewardA . date ,
138+ rewardB . date ,
139+ rewardsOrder === REWARD_ORDERS . ASCENDING
140+ ) ;
141+ if ( rewardsSortBy === REWARD_FIELDS . REWARD ) {
142+ if ( rewardCompareResult === 0 ) {
143+ return walletNameCompareResult ;
144+ }
145+ return rewardCompareResult ;
146+ }
147+ if ( rewardsSortBy === REWARD_FIELDS . WALLET_NAME ) {
148+ if ( walletNameCompareResult === 0 ) {
149+ return rewardCompareResult ;
150+ }
151+ return walletNameCompareResult ;
152+ }
153+ if ( rewardsSortBy === REWARD_FIELDS . DATE ) {
154+ if ( dateCompareResult === 0 ) {
155+ return walletNameCompareResult ;
156+ }
157+ return dateCompareResult ;
158+ }
159+ if ( rewardsSortBy === REWARD_FIELDS . POOL ) {
160+ if ( poolCompareResult === 0 ) {
161+ return walletNameCompareResult ;
162+ }
163+ return poolCompareResult ;
164+ }
165+
166+ return 0 ;
167+ } ) ;
168+ } ;
101169
170+ render ( ) {
171+ const { rewards , isLoading , onLearnMoreClick } = this . props ;
172+ const { rewardsOrder , rewardsSortBy } = this . state ;
102173 const { intl } = this . context ;
103174 const noRewards = ! isLoading && ( ( rewards && ! rewards . length ) || ! rewards ) ;
104175 const showRewards = rewards && rewards . length > 0 && ! isLoading ;
105-
106- let sortedRewards ;
107- if ( showRewards ) {
108- sortedRewards = orderBy (
109- rewards ,
110- rewardsSortBy === 'pool' ? 'pool.name' : rewardsSortBy ,
111- rewardsOrder
112- ) ;
113- }
114-
176+ const sortedRewards = showRewards ? this . getSortedRewards ( ) : [ ] ;
115177 const availableTableHeaders = [
116178 {
117- name : 'date' ,
179+ name : REWARD_FIELDS . DATE ,
118180 title : intl . formatMessage ( messages . tableHeaderDate ) ,
119181 } ,
120182 {
121- name : 'pool' ,
183+ name : REWARD_FIELDS . POOL ,
122184 title : intl . formatMessage ( messages . tableHeaderPool ) ,
123185 } ,
124186 {
125- name : 'wallet' ,
187+ name : REWARD_FIELDS . WALLET_NAME ,
126188 title : intl . formatMessage ( messages . tableHeaderWallet ) ,
127189 } ,
128190 {
129- name : 'reward' ,
191+ name : REWARD_FIELDS . REWARD ,
130192 title : intl . formatMessage ( messages . tableHeaderReward ) ,
131193 } ,
132194 ] ;
@@ -179,12 +241,28 @@ export default class StakingRewards extends Component<Props, State> {
179241 </ thead >
180242 < tbody >
181243 { map ( sortedRewards , ( reward , key ) => {
182- const rewardDate = get ( reward , 'date' , '' ) ;
183- const rewardPoolTicker = get ( reward , [ 'pool' , 'ticker' ] , '' ) ;
184- const rewardPoolName = get ( reward , [ 'pool' , 'name' ] , '' ) ;
185- const rewardWallet = get ( reward , 'wallet' , '' ) ;
186- const rewardAmount = get ( reward , 'reward' , '' ) ;
187- const isRestoring = get ( reward , 'isRestoring' ) ;
244+ const rewardDate = get ( reward , REWARD_FIELDS . DATE , '' ) ;
245+ const rewardPoolTicker = get (
246+ reward ,
247+ [ REWARD_FIELDS . POOL , REWARD_FIELDS . TICKER ] ,
248+ ''
249+ ) ;
250+ const rewardPoolName = get (
251+ reward ,
252+ [ REWARD_FIELDS . POOL , REWARD_FIELDS . NAME ] ,
253+ ''
254+ ) ;
255+ const rewardWallet = get (
256+ reward ,
257+ REWARD_FIELDS . WALLET_NAME ,
258+ ''
259+ ) ;
260+ const isRestoring = get ( reward , REWARD_FIELDS . IS_RESTORING ) ;
261+ const rewardAmount = get (
262+ reward ,
263+ REWARD_FIELDS . REWARD
264+ ) . toFormat ( DECIMAL_PLACES_IN_ADA ) ;
265+
188266 return (
189267 < tr key = { key } >
190268 < td > { rewardDate } </ td >
@@ -197,13 +275,7 @@ export default class StakingRewards extends Component<Props, State> {
197275 </ p >
198276 </ td >
199277 < td > { rewardWallet } </ td >
200- < td >
201- { isRestoring
202- ? '-'
203- : `${ new BigNumber ( rewardAmount ) . toFormat (
204- DECIMAL_PLACES_IN_ADA
205- ) } ADA`}
206- </ td >
278+ < td > { isRestoring ? '-' : `${ rewardAmount } ADA` } </ td >
207279 </ tr >
208280 ) ;
209281 } ) }
0 commit comments