diff --git a/x-pack/solutions/observability/plugins/synthetics/public/apps/synthetics/components/monitors_page/hooks/use_overview_status.ts b/x-pack/solutions/observability/plugins/synthetics/public/apps/synthetics/components/monitors_page/hooks/use_overview_status.ts index da86b130af692..b6999fcc3a0b3 100644 --- a/x-pack/solutions/observability/plugins/synthetics/public/apps/synthetics/components/monitors_page/hooks/use_overview_status.ts +++ b/x-pack/solutions/observability/plugins/synthetics/public/apps/synthetics/components/monitors_page/hooks/use_overview_status.ts @@ -5,8 +5,9 @@ * 2.0. */ -import { useEffect } from 'react'; +import { useEffect, useRef } from 'react'; import { useDispatch, useSelector } from 'react-redux'; +import useDebounce from 'react-use/lib/useDebounce'; import { useSyntheticsRefreshContext } from '../../../contexts/synthetics_refresh_context'; import { selectOverviewPageState } from '../../../state'; import { @@ -17,22 +18,51 @@ import { export function useOverviewStatus({ scopeStatusByLocation }: { scopeStatusByLocation: boolean }) { const pageState = useSelector(selectOverviewPageState); - const { status, error, loaded, loading, allConfigs } = useSelector(selectOverviewStatus); + const isInitialMount = useRef(true); const { lastRefresh } = useSyntheticsRefreshContext(); const dispatch = useDispatch(); + // Periodically refresh useEffect(() => { - if (loaded) { + if (!isInitialMount.current) { dispatch(quietFetchOverviewStatusAction.get({ pageState, scopeStatusByLocation })); - } else { - dispatch(fetchOverviewStatusAction.get({ pageState, scopeStatusByLocation })); } - // loaded is omitted from the dependency array because it is not used in the callback + // specifically only want to run this on refreshInterval change // eslint-disable-next-line react-hooks/exhaustive-deps - }, [dispatch, lastRefresh, pageState, scopeStatusByLocation]); + }, [lastRefresh]); + + // On initial mount, load the page + useDebounce( + () => { + if (isInitialMount.current) { + if (loaded) { + dispatch(quietFetchOverviewStatusAction.get({ pageState, scopeStatusByLocation })); + } else { + dispatch(fetchOverviewStatusAction.get({ pageState, scopeStatusByLocation })); + } + } + }, + 100, + // we don't use pageState or scopeStatus here, for pageState, useDebounce will handle it + [dispatch] + ); + + useDebounce( + () => { + // Don't load on initial mount, only meant to handle pageState changes + if (isInitialMount.current || !loaded) { + // setting false here to account for debounce timing + isInitialMount.current = false; + return; + } + dispatch(fetchOverviewStatusAction.get({ pageState, scopeStatusByLocation })); + }, + 100, + [pageState, scopeStatusByLocation] + ); return { status,