1- import { useMemo , useCallback , useState } from 'react' ;
1+ /* eslint-disable react-hooks/refs */
2+ import { useMemo , useCallback , useRef } from 'react' ;
23
34import { DashboardResource } from '@perses-dev/core' ;
4- import { useNavigate , useSearchParams } from 'react-router' ;
55import { StringParam , useQueryParam } from 'use-query-params' ;
66import { useBoolean } from '../../../hooks/useBoolean' ;
77import { getDashboardUrl , usePerspective } from '../../../hooks/usePerspective' ;
88import { QueryParams } from '../../../query-params' ;
99import { useActiveProject } from '../project/useActiveProject' ;
1010import { usePerses } from './usePerses' ;
11+ import { useNavigate , useSearchParams } from 'react-router' ;
1112import { ALL_NAMESPACES_KEY } from '../../../utils' ;
1213
1314// This hook syncs with mutliple external API's, redux, and URL state. Its a lot, but needs to all
@@ -40,8 +41,8 @@ export const useDashboardsData = () => {
4041 return true ;
4142 } , [ persesProjectsLoading , persesDashboardsLoading , initialPageLoad , setInitialPageLoadFalse ] ) ;
4243
43- const [ prevDashboards , setPreviousDashboards ] = useState < DashboardResource [ ] > ( [ ] ) ;
44- const [ prevMetadata , setPreviousMetadata ] = useState < CombinedDashboardMetadata [ ] > ( [ ] ) ;
44+ const prevDashboardsRef = useRef < DashboardResource [ ] > ( [ ] ) ;
45+ const prevMetadataRef = useRef < CombinedDashboardMetadata [ ] > ( [ ] ) ;
4546
4647 // Homogenize data needed for dashboards dropdown between legacy and perses dashboards
4748 // to enable both to use the same component
@@ -52,18 +53,18 @@ export const useDashboardsData = () => {
5253
5354 // Check if dashboards data has actually changed to avoid recreation
5455 const dashboardsChanged =
55- persesDashboards . length !== prevDashboards . length ||
56+ persesDashboards . length !== prevDashboardsRef . current . length ||
5657 persesDashboards . some ( ( dashboard , i ) => {
57- const prevDashboard = prevDashboards [ i ] ;
58+ const prevDashboard = prevDashboardsRef . current [ i ] ;
5859 return (
5960 dashboard ?. metadata ?. name !== prevDashboard ?. metadata ?. name ||
6061 dashboard ?. spec ?. display ?. name !== prevDashboard ?. spec ?. display ?. name ||
6162 dashboard ?. metadata ?. project !== prevDashboard ?. metadata ?. project
6263 ) ;
6364 } ) ;
6465
65- if ( ! dashboardsChanged && prevMetadata . length > 0 ) {
66- return prevMetadata ;
66+ if ( ! dashboardsChanged && prevMetadataRef . current . length > 0 ) {
67+ return prevMetadataRef . current ;
6768 }
6869
6970 const newMetadata = persesDashboards . map ( ( persesDashboard ) => {
@@ -79,17 +80,10 @@ export const useDashboardsData = () => {
7980 } ;
8081 } ) ;
8182
82- setPreviousDashboards ( persesDashboards ) ;
83- setPreviousMetadata ( newMetadata ) ;
83+ prevDashboardsRef . current = persesDashboards ;
84+ prevMetadataRef . current = newMetadata ;
8485 return newMetadata ;
85- } , [
86- persesDashboards ,
87- combinedInitialLoad ,
88- prevDashboards ,
89- prevMetadata ,
90- setPreviousDashboards ,
91- setPreviousMetadata ,
92- ] ) ;
86+ } , [ persesDashboards , combinedInitialLoad ] ) ;
9387
9488 // Retrieve dashboard metadata for the currently selected project
9589 const activeProjectDashboardsMetadata = useMemo < CombinedDashboardMetadata [ ] > ( ( ) => {
@@ -107,10 +101,9 @@ export const useDashboardsData = () => {
107101 // If the board is being cleared then don't do anything
108102 return ;
109103 }
110-
111104 const params = new URLSearchParams ( queryParams ) ;
112105
113- params . delete ( 'edit' ) ;
106+ params . delete ( QueryParams . Edit ) ;
114107
115108 const dashboard = combinedDashboardsMetadata . find ( ( item ) => item . name === newBoard ) ;
116109
0 commit comments