Skip to content

Commit 6ed7106

Browse files
author
Lucas Araujo
committed
[DDW-923] Hook refactor
1 parent 325c6c4 commit 6ed7106

File tree

5 files changed

+101
-107
lines changed

5 files changed

+101
-107
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@
107107
transition: box-shadow 0.1s ease-in-out;
108108
z-index: 999;
109109

110-
&.headerStuck {
110+
&.stickyHeader {
111111
box-shadow: 0 10px 10px -10px rgba(0, 0, 0, 0.2);
112112
}
113113

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

Lines changed: 8 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import LoadingSpinner from '../../widgets/LoadingSpinner';
1010
import BorderedBox from '../../widgets/BorderedBox';
1111
import { StakePoolsTableHeader } from './StakePoolsTableHeader';
1212
import { StakePoolsTableBody } from './StakePoolsTableBody';
13-
import { InView } from '../../widgets/InView';
1413

1514
const messages = defineMessages({
1615
tableHeaderRank: {
@@ -377,28 +376,14 @@ class StakePoolsTable extends Component<Props, State> {
377376
{sortedStakePoolList.length > 0 && (
378377
<BorderedBox>
379378
<table>
380-
<InView>
381-
{({ isInViewport, setTargetRef }) => (
382-
<>
383-
<caption ref={setTargetRef} />
384-
<thead
385-
className={!isInViewport ? styles.headerStuck : ''}
386-
onMouseEnter={onTableHeaderMouseEnter}
387-
onMouseLeave={onTableHeaderMouseLeave}
388-
>
389-
<tr>
390-
<StakePoolsTableHeader
391-
availableTableHeaders={availableTableHeaders}
392-
stakePoolsSortBy={stakePoolsSortBy}
393-
stakePoolsOrder={stakePoolsOrder}
394-
onHandleSort={this.handleSort}
395-
/>
396-
</tr>
397-
</thead>
398-
</>
399-
)}
400-
</InView>
401-
379+
<StakePoolsTableHeader
380+
availableTableHeaders={availableTableHeaders}
381+
stakePoolsSortBy={stakePoolsSortBy}
382+
stakePoolsOrder={stakePoolsOrder}
383+
onHandleSort={this.handleSort}
384+
onTableHeaderMouseEnter={onTableHeaderMouseEnter}
385+
onTableHeaderMouseLeave={onTableHeaderMouseLeave}
386+
/>
402387
<tbody>
403388
<StakePoolsTableBody
404389
// @ts-ignore ts-migrate(2769) FIXME: No overload matches this call.
Lines changed: 52 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,54 +1,70 @@
1-
import React, { Component } from 'react';
1+
import React from 'react';
22
import { observer } from 'mobx-react';
33
import { map } from 'lodash';
44
import classNames from 'classnames';
55
import SVGInline from 'react-svg-inline';
66
import styles from './StakePoolsTable.scss';
7-
// @ts-ignore ts-migrate(2307) FIXME: Cannot find module '../../../assets/images/ascendi... Remove this comment to see the full error message
87
import sortIcon from '../../../assets/images/ascending.inline.svg';
98
import { defaultTableOrdering } from './StakePoolsTable';
9+
import { useInViewPort } from '../../widgets/InView';
1010

11-
type TableHeaderProps = {
11+
type Props = {
1212
availableTableHeaders: Array<{
1313
name: string;
1414
title: any;
1515
}>;
1616
stakePoolsSortBy: string;
1717
stakePoolsOrder: string;
18-
onHandleSort: (...args: Array<any>) => any;
18+
onHandleSort: (newSortBy: string) => void;
19+
onTableHeaderMouseEnter: () => void;
20+
onTableHeaderMouseLeave: () => void;
1921
};
2022

21-
@observer
22-
class StakePoolsTableHeader extends Component<TableHeaderProps> {
23-
render() {
24-
const {
25-
availableTableHeaders,
26-
stakePoolsSortBy,
27-
stakePoolsOrder,
28-
onHandleSort,
29-
} = this.props;
30-
return map(availableTableHeaders, (tableHeader) => {
31-
const isSorted =
32-
tableHeader.name === stakePoolsSortBy ||
33-
(tableHeader.name === 'ticker' && stakePoolsSortBy === 'ticker');
34-
const defaultOrdering = defaultTableOrdering[tableHeader.name];
35-
const sortIconClasses = classNames([
36-
styles.sortIcon,
37-
isSorted ? styles.sorted : null,
38-
isSorted && styles[`${stakePoolsOrder}CurrentOrdering`],
39-
styles[`${defaultOrdering}DefaultOrdering`],
40-
]);
41-
return (
42-
<th
43-
key={tableHeader.name}
44-
onClick={() => onHandleSort(tableHeader.name)}
23+
export const StakePoolsTableHeader = observer(
24+
({
25+
availableTableHeaders,
26+
stakePoolsSortBy,
27+
stakePoolsOrder,
28+
onHandleSort,
29+
onTableHeaderMouseEnter,
30+
onTableHeaderMouseLeave,
31+
}: Props) => {
32+
const { setTargetRef, isInViewport } = useInViewPort();
33+
34+
return (
35+
<>
36+
<caption ref={setTargetRef} />
37+
<thead
38+
className={!isInViewport ? styles.stickyHeader : ''}
39+
onMouseEnter={onTableHeaderMouseEnter}
40+
onMouseLeave={onTableHeaderMouseLeave}
4541
>
46-
{tableHeader.title}
47-
<SVGInline svg={sortIcon} className={sortIconClasses} />
48-
</th>
49-
);
50-
});
42+
<tr>
43+
{map(availableTableHeaders, (tableHeader) => {
44+
const isSorted =
45+
tableHeader.name === stakePoolsSortBy ||
46+
(tableHeader.name === 'ticker' &&
47+
stakePoolsSortBy === 'ticker');
48+
const defaultOrdering = defaultTableOrdering[tableHeader.name];
49+
const sortIconClasses = classNames([
50+
styles.sortIcon,
51+
isSorted ? styles.sorted : null,
52+
isSorted && styles[`${stakePoolsOrder}CurrentOrdering`],
53+
styles[`${defaultOrdering}DefaultOrdering`],
54+
]);
55+
return (
56+
<th
57+
key={tableHeader.name}
58+
onClick={() => onHandleSort(tableHeader.name)}
59+
>
60+
{tableHeader.title}
61+
<SVGInline svg={sortIcon} className={sortIconClasses} />
62+
</th>
63+
);
64+
})}
65+
</tr>
66+
</thead>
67+
</>
68+
);
5169
}
52-
}
53-
54-
export { StakePoolsTableHeader };
70+
);

source/renderer/app/components/widgets/InView.tsx

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,6 @@
11
import { useRef, useState, useCallback } from 'react';
22

3-
type Props = {
4-
children: (props: {
5-
isInViewport: boolean;
6-
setTargetRef: (target: HTMLElement) => void;
7-
}) => JSX.Element;
8-
};
9-
10-
export const InView = ({ children }: Props) => {
3+
export const useInViewPort = () => {
114
const [isInViewport, setIsInViewport] = useState(true);
125
const targetRef = useRef(null);
136
const observerRef = useRef(
@@ -30,5 +23,5 @@ export const InView = ({ children }: Props) => {
3023
targetRef.current = target;
3124
}, []);
3225

33-
return children({ isInViewport, setTargetRef });
26+
return { isInViewport, setTargetRef };
3427
};

0 commit comments

Comments
 (0)