11'use client' ;
22
3- import React , { useEffect , useState , useCallback } from 'react' ;
3+ import React , { useEffect , useState , useCallback , useMemo , useRef } from 'react' ;
44import { format } from 'date-fns' ;
55import { ThemeProvider } from 'styled-components' ;
66
@@ -23,7 +23,6 @@ import {
2323 processData ,
2424 handleResponseExport ,
2525 copyDataToClipboard ,
26- clearIntervals ,
2726 register ,
2827} from '@/lib' ;
2928import { notifyTelegram , notifySlack , notifyDiscord } from '@/lib/notify' ;
@@ -50,11 +49,15 @@ const HomePage = () => {
5049 const [ storedData , setStoredData ] = useState < StoredData > ( defaultStoredData ) ;
5150 const [ isCustomHostDialogVisible , setIsCustomHostDialogVisible ] = useState ( false ) ;
5251 const [ isClient , setIsClient ] = useState ( false ) ;
52+ const hasLoadedInitialData = useRef ( false ) ;
53+ const filteredDataRef = useRef < Array < Data > > ( [ ] ) ;
5354
5455 // Initialize stored data on client side
5556 useEffect ( ( ) => {
5657 setIsClient ( true ) ;
57- setStoredData ( getStoredData ( ) ) ;
58+ const loadedData = getStoredData ( ) ;
59+ setStoredData ( loadedData ) ;
60+ hasLoadedInitialData . current = true ;
5861 } , [ ] ) ;
5962
6063 const handleResetPopupDialogVisibility = useCallback ( ( ) => {
@@ -123,11 +126,13 @@ const HomePage = () => {
123126 } ) ;
124127 } ;
125128
126- const handleRowClick = ( id : string ) => {
129+ const handleRowClick = useCallback ( ( id : string ) => {
127130 setSelectedInteraction ( id ) ;
128- const reqDetails = filteredData && filteredData [ filteredData . findIndex ( ( item ) => item . id === id ) ] ;
129- setSelectedInteractionData ( reqDetails ) ;
130- } ;
131+ const reqDetails = filteredDataRef . current . find ( ( item ) => item . id === id ) ;
132+ if ( reqDetails ) {
133+ setSelectedInteractionData ( reqDetails ) ;
134+ }
135+ } , [ ] ) ;
131136
132137 const handleDeleteTab = ( tab : Tab ) => {
133138 const { tabs } = storedData ;
@@ -179,6 +184,7 @@ const HomePage = () => {
179184 ...storedData ,
180185 data : tempData ,
181186 } ) ;
187+ filteredDataRef . current = [ ] ;
182188 setFilteredData ( [ ] ) ;
183189 } ;
184190
@@ -199,7 +205,8 @@ const HomePage = () => {
199205 ) ;
200206
201207 setIsRegistered ( true ) ;
202- if ( pollData ?. data ?. length !== 0 && ! pollData . error ) {
208+
209+ if ( pollData ?. data ?. length > 0 && ! pollData . error ) {
203210 if ( pollData . aes_key ) {
204211 decryptedAESKey = decryptAESKey ( privateKey , pollData . aes_key ) ;
205212 }
@@ -236,9 +243,9 @@ const HomePage = () => {
236243 } ) ;
237244
238245 const newData = combinedData
239- . filter ( ( item ) => item [ 'unique-id' ] === dataFromLocalStorage . selectedTab [ 'unique-id' ] )
240- . map ( ( item ) => item ) ;
241- setFilteredData ( [ ... newData ] ) ;
246+ . filter ( ( item ) => item [ 'unique-id' ] === dataFromLocalStorage . selectedTab [ 'unique-id' ] ) ;
247+ filteredDataRef . current = newData ;
248+ setFilteredData ( newData ) ;
242249 }
243250 } catch ( error ) {
244251 console . error ( error ) ;
@@ -248,7 +255,9 @@ const HomePage = () => {
248255 } , [ handleResetPopupDialogVisibility , handleCustomHostDialogVisibility ] ) ;
249256
250257 useEffect ( ( ) => {
251- writeStoredData ( storedData ) ;
258+ if ( hasLoadedInitialData . current ) {
259+ writeStoredData ( storedData ) ;
260+ }
252261 } , [ storedData ] ) ;
253262
254263 useEffect ( ( ) => {
@@ -261,18 +270,16 @@ const HomePage = () => {
261270 window . addEventListener ( 'storage' , handleStorageChange ) ;
262271 setIsRegistered ( true ) ;
263272
273+ let registrationIntervalId : number | undefined ;
274+
264275 if ( storedData . correlationId === '' ) {
265276 setLoaderAnimationMode ( 'loading' ) ;
266277 setIsRegistered ( false ) ;
267- setTimeout ( ( ) => {
278+ const timeoutId = setTimeout ( ( ) => {
268279 register ( storedData . host , storedData . token , false , false )
269280 . then ( ( data ) => {
270281 setStoredData ( data ) ;
271- const intervalId = window . setInterval ( ( ) => {
272- processPolledData ( ) ;
273- } , 4000 ) ;
274282 setIsRegistered ( true ) ;
275- return intervalId ;
276283 } )
277284 . catch ( ( ) => {
278285 localStorage . clear ( ) ;
@@ -281,28 +288,44 @@ const HomePage = () => {
281288 setIsRegistered ( false ) ;
282289 } ) ;
283290 } , 1500 ) ;
291+
292+ return ( ) => {
293+ clearTimeout ( timeoutId ) ;
294+ window . removeEventListener ( 'storage' , handleStorageChange ) ;
295+ if ( registrationIntervalId ) {
296+ window . clearInterval ( registrationIntervalId ) ;
297+ }
298+ } ;
284299 }
285300
286301 return ( ) => {
287302 window . removeEventListener ( 'storage' , handleStorageChange ) ;
288303 } ;
289304 } , [ isClient ] ) ;
290305
306+ const pollingIntervalRef = useRef < number | undefined > ( undefined ) ;
307+
291308 useEffect ( ( ) => {
292309 if ( ! isClient || storedData . tabs . length === 0 ) return ;
293310
294- clearIntervals ( ) ;
295- const intervalId = window . setInterval ( ( ) => {
311+ if ( pollingIntervalRef . current ) {
312+ window . clearInterval ( pollingIntervalRef . current ) ;
313+ }
314+
315+ pollingIntervalRef . current = window . setInterval ( ( ) => {
296316 processPolledData ( ) ;
297317 } , 4000 ) ;
298318
299319 const tempFilteredData = storedData . data
300- . filter ( ( item ) => item [ 'unique-id' ] === storedData . selectedTab [ 'unique-id' ] )
301- . map ( ( item ) => item ) ;
320+ . filter ( ( item ) => item [ 'unique-id' ] === storedData . selectedTab [ 'unique-id' ] ) ;
321+ filteredDataRef . current = tempFilteredData ;
302322 setFilteredData ( tempFilteredData ) ;
303323
304324 return ( ) => {
305- window . clearInterval ( intervalId ) ;
325+ if ( pollingIntervalRef . current ) {
326+ window . clearInterval ( pollingIntervalRef . current ) ;
327+ pollingIntervalRef . current = undefined ;
328+ }
306329 } ;
307330 } , [ storedData . selectedTab , isClient , processPolledData ] ) ;
308331
@@ -365,7 +388,7 @@ const HomePage = () => {
365388 < TabSwitcher
366389 handleTabButtonClick = { handleTabButtonClick }
367390 selectedTab = { storedData . selectedTab }
368- data = { [ ... storedData . tabs ] }
391+ data = { storedData . tabs }
369392 handleAddNewTab = { handleAddNewTab }
370393 handleDeleteTab = { handleDeleteTab }
371394 handleTabRename = { handleTabRename }
@@ -391,7 +414,7 @@ const HomePage = () => {
391414 />
392415 </ div >
393416 < RequestsTableWrapper
394- data = { [ ... filteredData ] }
417+ data = { filteredData }
395418 selectedInteraction = { selectedInteraction || '' }
396419 handleRowClick = { handleRowClick }
397420 filter = { storedData . filter }
0 commit comments