Skip to content

Commit 325c6c4

Browse files
author
Lucas Araujo
committed
[DDW-923] Refactor to only re-render header
1 parent 589e7aa commit 325c6c4

File tree

3 files changed

+42
-41
lines changed

3 files changed

+42
-41
lines changed

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -104,10 +104,10 @@
104104
padding: 0 20px;
105105
position: sticky;
106106
top: 0;
107-
transition: box-shadow 0.3s ease-in-out;
107+
transition: box-shadow 0.1s ease-in-out;
108108
z-index: 999;
109109

110-
&.isHeaderStuck {
110+
&.headerStuck {
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: 24 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -153,13 +153,11 @@ type State = {
153153
isPreloading: boolean;
154154
stakePoolsOrder: string;
155155
stakePoolsSortBy: string;
156-
isHeaderStuck: boolean;
157156
};
158157
const initialState = {
159158
isPreloading: true,
160159
stakePoolsOrder: 'asc',
161160
stakePoolsSortBy: 'ranking',
162-
isHeaderStuck: false,
163161
};
164162

165163
@observer
@@ -221,12 +219,7 @@ class StakePoolsTable extends Component<Props, State> {
221219
onTableHeaderMouseEnter,
222220
onTableHeaderMouseLeave,
223221
} = this.props;
224-
const {
225-
isPreloading,
226-
stakePoolsSortBy,
227-
stakePoolsOrder,
228-
isHeaderStuck,
229-
} = this.state;
222+
const { isPreloading, stakePoolsSortBy, stakePoolsOrder } = this.state;
230223
const { intl } = this.context;
231224
const componentClasses = classNames([styles.component, listName]);
232225
if (stakePoolsList.length > PRELOADER_THRESHOLD && isPreloading)
@@ -377,31 +370,35 @@ class StakePoolsTable extends Component<Props, State> {
377370
title: intl.formatMessage(messages.tableHeaderRetiring),
378371
},
379372
];
373+
380374
return (
381375
<div>
382376
<div className={componentClasses}>
383377
{sortedStakePoolList.length > 0 && (
384378
<BorderedBox>
385-
<InView
386-
onChange={(visible) =>
387-
this.setState({ isHeaderStuck: !visible })
388-
}
389-
/>
390379
<table>
391-
<thead
392-
className={isHeaderStuck ? styles.isHeaderStuck : ''}
393-
onMouseEnter={onTableHeaderMouseEnter}
394-
onMouseLeave={onTableHeaderMouseLeave}
395-
>
396-
<tr>
397-
<StakePoolsTableHeader
398-
availableTableHeaders={availableTableHeaders}
399-
stakePoolsSortBy={stakePoolsSortBy}
400-
stakePoolsOrder={stakePoolsOrder}
401-
onHandleSort={this.handleSort}
402-
/>
403-
</tr>
404-
</thead>
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+
405402
<tbody>
406403
<StakePoolsTableBody
407404
// @ts-ignore ts-migrate(2769) FIXME: No overload matches this call.
Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,34 @@
1-
import React, { useRef, useCallback } from 'react';
1+
import { useRef, useState, useCallback } from 'react';
22

33
type Props = {
4-
onChange: (visible: boolean) => void;
4+
children: (props: {
5+
isInViewport: boolean;
6+
setTargetRef: (target: HTMLElement) => void;
7+
}) => JSX.Element;
58
};
69

7-
export const InView = ({ onChange }: Props) => {
8-
const elementRef = useRef(null);
10+
export const InView = ({ children }: Props) => {
11+
const [isInViewport, setIsInViewport] = useState(true);
12+
const targetRef = useRef(null);
913
const observerRef = useRef(
1014
new IntersectionObserver((entries) => {
1115
entries.forEach((entry) => {
12-
onChange(entry.isIntersecting);
16+
setIsInViewport(entry.isIntersecting);
1317
});
1418
})
1519
);
1620

17-
const setElementRef = useCallback((element) => {
18-
if (elementRef.current) {
19-
observerRef.current.unobserve(elementRef.current);
21+
const setTargetRef = useCallback((target: HTMLElement) => {
22+
if (targetRef.current) {
23+
observerRef.current.unobserve(targetRef.current);
2024
}
2125

22-
if (element) {
23-
observerRef.current.observe(element);
26+
if (target) {
27+
observerRef.current.observe(target);
2428
}
2529

26-
elementRef.current = element;
30+
targetRef.current = target;
2731
}, []);
2832

29-
return <div ref={setElementRef} />;
33+
return children({ isInViewport, setTargetRef });
3034
};

0 commit comments

Comments
 (0)