Skip to content

Commit 79190d9

Browse files
committed
[DDW-1012] Review changes
1 parent 4797f4f commit 79190d9

File tree

7 files changed

+107
-110
lines changed

7 files changed

+107
-110
lines changed

CHANGELOG.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212

1313
### Fixes
1414

15+
- Fixed performance issue on stake pool list view ([PR 2924](https://github.com/input-output-hk/daedalus/pull/2924))
1516
- Fixed catalyst fund name ([PR 2946](https://github.com/input-output-hk/daedalus/pull/2946))
1617
- Fixed position of popup on syncing screen ([PR 2921](https://github.com/input-output-hk/daedalus/pull/2921))
1718
- Fixed issue with missing character when copying address from PDF ([PR 2925](https://github.com/input-output-hk/daedalus/pull/2925))
@@ -21,7 +22,6 @@
2122
- Fix warning sign displayed when recommend decimals is zero ([PR 2905](https://github.com/input-output-hk/daedalus/pull/2905))
2223
- Fixed discrete tooltip being clipped by loading overlay when stake pools are adjusted ([PR 2902](https://github.com/input-output-hk/daedalus/pull/2902))
2324
- Sets minimum transaction fee to ada input field when tokens are removed ([PR 2918](https://github.com/input-output-hk/daedalus/pull/2918))
24-
- Fixed performance issue on stake pool list view ([PR 2924](https://github.com/input-output-hk/daedalus/pull/2924))
2525

2626
### Chores
2727

source/renderer/app/components/staking/stake-pools/StakePoolsTable.tsx

Lines changed: 22 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -7,28 +7,28 @@ import List from 'react-virtualized/dist/commonjs/List';
77
import WindowScroller from 'react-virtualized/dist/commonjs/WindowScroller';
88
import AutoSizer from 'react-virtualized/dist/commonjs/AutoSizer';
99
import { Intl } from '../../../types/i18nTypes';
10-
1110
import { StakingPageScrollContext } from '../layouts/StakingWithNavigation';
1211
import styles from './StakePoolsTable.scss';
1312
import StakePool from '../../../domains/StakePool';
1413
import LoadingSpinner from '../../widgets/LoadingSpinner';
1514
import BorderedBox from '../../widgets/BorderedBox';
16-
import { StakePoolsTableHeader } from './StakePoolsTableHeader';
15+
import { StakePoolsTableHeaderCell } from './StakePoolsTableHeaderCell';
1716
import {
1817
useSortedStakePoolList,
1918
useCreateColumns,
20-
} from './StakePoolsTable.hooks';
19+
StakePoolsOrder,
20+
} from './hooks';
2121

2222
export const defaultTableOrdering = {
23-
ranking: 'asc',
24-
ticker: 'asc',
25-
saturation: 'asc',
26-
cost: 'asc',
27-
profitMargin: 'asc',
28-
producedBlocks: 'desc',
29-
nonMyopicMemberRewards: 'desc',
30-
pledge: 'asc',
31-
retiring: 'asc',
23+
ranking: StakePoolsOrder.Asc,
24+
ticker: StakePoolsOrder.Asc,
25+
saturation: StakePoolsOrder.Asc,
26+
cost: StakePoolsOrder.Asc,
27+
profitMargin: StakePoolsOrder.Asc,
28+
producedBlocks: StakePoolsOrder.Desc,
29+
nonMyopicMemberRewards: StakePoolsOrder.Desc,
30+
pledge: StakePoolsOrder.Asc,
31+
retiring: StakePoolsOrder.Asc,
3232
};
3333
// Maximum number of stake pools for which we do not need to use the preloading
3434
const PRELOADER_THRESHOLD = 100;
@@ -51,12 +51,12 @@ type Props = {
5151
};
5252
type State = {
5353
isPreloading: boolean;
54-
stakePoolsOrder: 'asc' | 'desc';
55-
stakePoolsSortBy: string;
54+
stakePoolsOrder: StakePoolsOrder;
55+
stakePoolsSortBy: keyof StakePool;
5656
};
5757
const initialState: State = {
5858
isPreloading: true,
59-
stakePoolsOrder: 'asc',
59+
stakePoolsOrder: StakePoolsOrder.Asc,
6060
stakePoolsSortBy: 'ranking',
6161
};
6262

@@ -81,12 +81,15 @@ function StakePoolsTableComponent({
8181
}, []);
8282

8383
const handleSort = useCallback(
84-
(newSortBy: string) => {
84+
(newSortBy: keyof StakePool) => {
8585
const { stakePoolsOrder, stakePoolsSortBy } = state;
8686
let newOrder = defaultTableOrdering[newSortBy];
8787

8888
if (newSortBy === stakePoolsSortBy) {
89-
newOrder = stakePoolsOrder === 'asc' ? 'desc' : 'asc';
89+
newOrder =
90+
stakePoolsOrder === StakePoolsOrder.Asc
91+
? StakePoolsOrder.Desc
92+
: StakePoolsOrder.Asc;
9093
}
9194

9295
setState((s) => ({
@@ -197,7 +200,7 @@ function StakePoolsTableComponent({
197200
className={styles.tr}
198201
>
199202
{headerGroup.headers.map((column) => (
200-
<StakePoolsTableHeader
203+
<StakePoolsTableHeaderCell
201204
{...column.getHeaderProps({
202205
style: { width: undefined },
203206
})}
@@ -208,7 +211,7 @@ function StakePoolsTableComponent({
208211
key={column.id}
209212
>
210213
{column.render('Header')}
211-
</StakePoolsTableHeader>
214+
</StakePoolsTableHeaderCell>
212215
))}
213216
</div>
214217
))}

source/renderer/app/components/staking/stake-pools/StakePoolsTableHeader.tsx renamed to source/renderer/app/components/staking/stake-pools/StakePoolsTableHeaderCell.tsx

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ type TableHeaderProps = {
1717
};
1818

1919
@observer
20-
class StakePoolsTableHeader extends Component<TableHeaderProps> {
20+
class StakePoolsTableHeaderCell extends Component<TableHeaderProps> {
2121
render() {
2222
const {
2323
name,
@@ -27,9 +27,7 @@ class StakePoolsTableHeader extends Component<TableHeaderProps> {
2727
children,
2828
...headerProps
2929
} = this.props;
30-
const isSorted =
31-
name === stakePoolsSortBy ||
32-
(name === 'ticker' && stakePoolsSortBy === 'ticker');
30+
const isSorted = name === stakePoolsSortBy;
3331
const defaultOrdering = defaultTableOrdering[name];
3432
const sortIconClasses = classNames([
3533
styles.sortIcon,
@@ -50,4 +48,4 @@ class StakePoolsTableHeader extends Component<TableHeaderProps> {
5048
}
5149
}
5250

53-
export { StakePoolsTableHeader };
51+
export { StakePoolsTableHeaderCell };
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
export { useCreateColumns } from './useCreateColumns';
2+
export {
3+
useSortedStakePoolList,
4+
StakePoolsOrder,
5+
} from './useSortedStakePoolList';

source/renderer/app/components/staking/stake-pools/StakePoolsTable.hooks.tsx renamed to source/renderer/app/components/staking/stake-pools/hooks/useCreateColumns.tsx

Lines changed: 20 additions & 83 deletions
Original file line numberDiff line numberDiff line change
@@ -1,94 +1,31 @@
11
import React, { useMemo } from 'react';
2-
import { orderBy } from 'lodash';
32
import classNames from 'classnames';
43
import BigNumber from 'bignumber.js';
54
import moment from 'moment';
65
import { FormattedHTMLMessage } from 'react-intl';
6+
import { Column } from 'react-table';
77
import { PopOver } from 'react-polymorph/lib/components/PopOver';
8-
import { PoolPopOver } from '../widgets/PoolPopOver';
9-
import { Intl } from '../../../types/i18nTypes';
10-
11-
import styles from './StakePoolsTable.scss';
12-
import StakePool from '../../../domains/StakePool';
13-
import { getColorFromRange, getSaturationColor } from '../../../utils/colors';
8+
import { PoolPopOver } from '../../widgets/PoolPopOver';
9+
import { Intl } from '../../../../types/i18nTypes';
10+
import styles from '../StakePoolsTable.scss';
11+
import StakePool from '../../../../domains/StakePool';
12+
import {
13+
getColorFromRange,
14+
getSaturationColor,
15+
} from '../../../../utils/colors';
1416
import {
1517
formattedWalletAmount,
1618
toFixedUserFormat,
17-
} from '../../../utils/formatters';
18-
import { messages } from './StakePoolsTable.messages';
19-
20-
const ascOrder = 'asc';
21-
const descOrder = 'desc';
22-
23-
export const defaultTableOrdering = {
24-
ranking: ascOrder,
25-
ticker: ascOrder,
26-
saturation: ascOrder,
27-
cost: ascOrder,
28-
profitMargin: ascOrder,
29-
producedBlocks: descOrder,
30-
nonMyopicMemberRewards: descOrder,
31-
pledge: ascOrder,
32-
retiring: ascOrder,
33-
};
34-
35-
interface UseSortedStakePoolListArgs {
36-
stakePoolList: StakePool[];
37-
sortBy: string;
38-
order: 'asc' | 'desc';
39-
}
40-
41-
export const useSortedStakePoolList = ({
42-
stakePoolList,
43-
sortBy,
44-
order,
45-
}: UseSortedStakePoolListArgs) =>
46-
useMemo(
47-
() =>
48-
orderBy(
49-
stakePoolList.map((stakePool) => {
50-
let calculatedPledge;
51-
let calculatedCost;
52-
let formattedTicker;
53-
54-
if (sortBy === 'ticker') {
55-
formattedTicker = stakePool.ticker
56-
.replace(/[^\w\s]/gi, '')
57-
.toLowerCase();
58-
}
59-
60-
if (sortBy === 'pledge') {
61-
const formattedPledgeValue = stakePool.pledge.toFixed(2);
62-
calculatedPledge = Number(
63-
parseFloat(formattedPledgeValue).toFixed(2)
64-
);
65-
}
66-
67-
if (sortBy === 'cost') {
68-
const formattedCostValue = stakePool.cost.toFixed(2);
69-
calculatedCost = Number(parseFloat(formattedCostValue).toFixed(2));
70-
}
71-
72-
return {
73-
...stakePool,
74-
calculatedPledge,
75-
calculatedCost,
76-
formattedTicker,
77-
};
78-
}),
79-
['formattedTicker', 'calculatedPledge', 'calculatedCost', sortBy],
80-
[order, order, order, order]
81-
),
82-
[stakePoolList, order, sortBy]
83-
);
19+
} from '../../../../utils/formatters';
20+
import { messages } from '../StakePoolsTable.messages';
8421

8522
type UseCreateColumnsArgs = {
8623
currentTheme: string;
8724
showWithSelectButton?: boolean;
88-
onSelect?: (...args: Array<any>) => any;
25+
onSelect?: (poolId: string) => void;
8926
containerClassName: string;
9027
numberOfRankedStakePools: number;
91-
onOpenExternalLink: (...args: Array<any>) => any;
28+
onOpenExternalLink: (url: string) => void;
9229
intl: Intl;
9330
};
9431

@@ -101,7 +38,7 @@ export const useCreateColumns = ({
10138
containerClassName,
10239
showWithSelectButton,
10340
}: UseCreateColumnsArgs) =>
104-
useMemo(
41+
useMemo<Column<StakePool>[]>(
10542
() => [
10643
{
10744
id: 'ranking',
@@ -120,7 +57,7 @@ export const useCreateColumns = ({
12057
),
12158
accessor: 'ranking',
12259
Cell: ({ row }) => {
123-
const { potentialRewards, ranking }: StakePool = row.original;
60+
const { potentialRewards, ranking } = row.original;
12461
const memberRewards = new BigNumber(potentialRewards);
12562

12663
return (
@@ -143,7 +80,7 @@ export const useCreateColumns = ({
14380
Header: intl.formatMessage(messages.tableHeaderTicker),
14481
accessor: 'ticker',
14582
Cell: ({ row }) => {
146-
const stakePool: StakePool = row.original;
83+
const stakePool = row.original;
14784
const color = getColorFromRange(
14885
stakePool.ranking,
14986
numberOfRankedStakePools
@@ -180,7 +117,7 @@ export const useCreateColumns = ({
180117
),
181118
accessor: 'saturation',
182119
Cell: ({ row }) => {
183-
const { saturation }: StakePool = row.original;
120+
const { saturation } = row.original;
184121
const progressBarContentClassnames = classNames([
185122
styles.progressBarContent,
186123
styles[getSaturationColor(saturation)],
@@ -273,7 +210,7 @@ export const useCreateColumns = ({
273210
),
274211
accessor: 'nonMyopicMemberRewards',
275212
Cell: ({ row }) => {
276-
const stakePool: StakePool = row.original;
213+
const stakePool = row.original;
277214
const memberRewards = new BigNumber(stakePool.potentialRewards);
278215
const potentialRewards = formattedWalletAmount(memberRewards);
279216
return potentialRewards;
@@ -292,7 +229,7 @@ export const useCreateColumns = ({
292229
),
293230
accessor: 'pledge',
294231
Cell: ({ row }) => {
295-
const stakePool: StakePool = row.original;
232+
const stakePool = row.original;
296233
const pledge = new BigNumber(stakePool.pledge);
297234
const pledgeValue = formattedWalletAmount(pledge, false, false);
298235
return pledgeValue;
@@ -303,7 +240,7 @@ export const useCreateColumns = ({
303240
Header: intl.formatMessage(messages.tableHeaderRetiring),
304241
accessor: 'retiring',
305242
Cell: ({ row }) => {
306-
const stakePool: StakePool = row.original;
243+
const stakePool = row.original;
307244
const retirement =
308245
stakePool.retiring &&
309246
moment(stakePool.retiring).locale(intl.locale).fromNow(true);
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
import { useMemo } from 'react';
2+
import { orderBy } from 'lodash';
3+
import StakePool from '../../../../domains/StakePool';
4+
5+
export enum StakePoolsOrder {
6+
Asc = 'asc',
7+
Desc = 'desc',
8+
}
9+
10+
interface UseSortedStakePoolListArgs {
11+
stakePoolList: StakePool[];
12+
sortBy: keyof StakePool;
13+
order: StakePoolsOrder;
14+
}
15+
16+
export const useSortedStakePoolList = ({
17+
stakePoolList,
18+
sortBy,
19+
order,
20+
}: UseSortedStakePoolListArgs) =>
21+
useMemo(
22+
() =>
23+
orderBy(
24+
stakePoolList.map((stakePool) => {
25+
let calculatedPledge;
26+
let calculatedCost;
27+
let formattedTicker;
28+
29+
if (sortBy === 'ticker') {
30+
formattedTicker = stakePool.ticker
31+
.replace(/[^\w\s]/gi, '')
32+
.toLowerCase();
33+
}
34+
35+
if (sortBy === 'pledge') {
36+
calculatedPledge = parseFloat(stakePool.pledge.toFixed(2));
37+
}
38+
39+
if (sortBy === 'cost') {
40+
calculatedCost = parseFloat(stakePool.cost.toFixed(2));
41+
}
42+
43+
return {
44+
...stakePool,
45+
calculatedPledge,
46+
calculatedCost,
47+
formattedTicker,
48+
};
49+
}),
50+
['formattedTicker', 'calculatedPledge', 'calculatedCost', sortBy],
51+
[order, order, order, order]
52+
),
53+
[stakePoolList, order, sortBy]
54+
);

storybook/webpack.config.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,10 +42,10 @@ module.exports = async ({ config }) => {
4242
'moment',
4343
'pbkdf2',
4444
'qrcode.react',
45-
// 'react',
45+
'react',
4646
'react-copy-to-clipboard',
4747
'react-datetime',
48-
// 'react-dom',
48+
'react-dom',
4949
'react-router',
5050
'react-svg-inline',
5151
'recharts',

0 commit comments

Comments
 (0)