1- import React , {
2- FunctionComponent ,
3- useRef ,
4- useState ,
5- useEffect ,
6- memo ,
7- RefObject ,
8- } from "react" ;
9- // @ts -ignore
10- import SmoothScroll from "smooth-scroll" ;
1+ import React , { FunctionComponent , memo } from "react" ;
112import Loader from "./loader" ;
123import Summary from "./summary" ;
134import TransactionList from "./transactionlist" ;
145import TotalSpending from "./totalspending" ;
156import LoadError from "./loaderror" ;
167import { Account , Transaction , Info } from "../types" ;
178import useScrollIndicator from "../hooks/scrollindicator" ;
18- import composeRefs from "@seznam/compose-react-refs" ;
199
2010interface Props {
2111 tabInfo ?: Info ;
@@ -32,82 +22,9 @@ interface Props {
3222 onDetailsClick : ( tabId : string , transactionId : string ) => void ;
3323}
3424
35- const useTransactionHeadingScroller = (
36- scrollContainerRef : RefObject < HTMLElement > ,
37- transactionsHeadingRef : RefObject < HTMLElement > ,
38- recheckDependencies : unknown [ ]
39- ) : {
40- transactionsHeadingIsOutOfViewport : boolean ;
41- scrollToTransactionHeading : ( ) => void ;
42- } => {
43- const [
44- transactionsHeadingIsOutOfViewport ,
45- setTransactionsHeadingIsOutOfViewport ,
46- ] = useState < boolean > ( false ) ;
47-
48- // this ref is needed as the state updates unreliably
49- const transactionsHeadingIsOutOfViewportRef = useRef ( false ) ;
50-
51- const checkTransactionsHeadingVisibilityRef = useRef ( ( ) => {
52- if ( ! scrollContainerRef . current || ! transactionsHeadingRef . current ) {
53- return ;
54- }
55-
56- const scrollContainer = scrollContainerRef . current ;
57- const scrollBottomY =
58- scrollContainer . clientHeight + scrollContainer . scrollTop ;
59- const headingY = transactionsHeadingRef . current . offsetTop ;
60- const newTransactionsHeadingIsOutOfViewport = scrollBottomY < headingY + 60 ;
61- if (
62- newTransactionsHeadingIsOutOfViewport !==
63- transactionsHeadingIsOutOfViewportRef . current
64- ) {
65- transactionsHeadingIsOutOfViewportRef . current =
66- newTransactionsHeadingIsOutOfViewport ;
67- setTransactionsHeadingIsOutOfViewport (
68- newTransactionsHeadingIsOutOfViewport
69- ) ;
70- }
71- } ) ;
72-
73- const scroller = useRef < any > ( new SmoothScroll ( ) ) ;
74-
75- useEffect ( ( ) => {
76- const handler = checkTransactionsHeadingVisibilityRef . current ;
77- const scrollContainer = scrollContainerRef . current ;
78- scrollContainer ?. addEventListener ( "scroll" , handler ) ;
79- window . addEventListener ( "resize" , handler ) ;
80- handler ( ) ;
81-
82- return ( ) => {
83- scrollContainer ?. removeEventListener ( "scroll" , handler ) ;
84- window . removeEventListener ( "resize" , handler ) ;
85- } ;
86- } , [ scrollContainerRef ] ) ;
87-
88- useEffect ( ( ) => {
89- setTimeout ( checkTransactionsHeadingVisibilityRef . current ) ;
90- } , recheckDependencies ) ; // eslint-disable-line react-hooks/exhaustive-deps
91-
92- return {
93- transactionsHeadingIsOutOfViewport,
94- scrollToTransactionHeading : ( ) => {
95- scroller . current . animateScroll ( transactionsHeadingRef . current ) ;
96- } ,
97- } ;
98- } ;
99-
10025const Main : FunctionComponent < Props > = ( props ) => {
101- const contentContainerRef = useRef < HTMLDivElement > ( null ) ;
102- const transactionsHeadingRef = useRef < HTMLHeadingElement > ( null ) ;
103-
10426 const [ isScrolled , scrollContainerRef ] = useScrollIndicator ( ) ;
10527
106- const { transactionsHeadingIsOutOfViewport, scrollToTransactionHeading } =
107- useTransactionHeadingScroller ( contentContainerRef , transactionsHeadingRef , [
108- props . accounts ,
109- ] ) ;
110-
11128 const handleNewEntryClick = ( ) => {
11229 if ( ! props . tabId ) {
11330 throw new Error ( "Tab ID missing." ) ;
@@ -137,9 +54,6 @@ const Main: FunctionComponent<Props> = (props) => {
13754 < Summary accounts = { props . accounts } />
13855 </ div >
13956 < div className = "row" >
140- < h3 ref = { transactionsHeadingRef } className = "transactions-heading" >
141- Transactions
142- </ h3 >
14357 < TransactionList
14458 transactions = { props . transactions }
14559 onDetailsClick = { props . onDetailsClick }
@@ -206,21 +120,10 @@ const Main: FunctionComponent<Props> = (props) => {
206120 return (
207121 < div className = "scene mainScene" >
208122 { renderHeader ( ! isLoading && ! props . remoteTabError ) }
209- { transactionsHeadingIsOutOfViewport && (
210- < h3
211- className = "transactions-heading transactions-heading-fixed"
212- onClick = { scrollToTransactionHeading }
213- >
214- ▾ Transactions
215- </ h3 >
216- ) }
217123 < div
218124 id = "main-content"
219125 className = "content"
220- ref = { composeRefs < HTMLDivElement > (
221- contentContainerRef ,
222- scrollContainerRef
223- ) }
126+ ref = { scrollContainerRef }
224127 style = { { position : "relative" } }
225128 >
226129 < Loader show = { isLoading } > { renderContent ( ) } </ Loader >
0 commit comments