From 5f41e6c78bcd0cda579fc40a6e04b6e3764f6782 Mon Sep 17 00:00:00 2001 From: Tim Hostetler <6970899+thostetler@users.noreply.github.com> Date: Mon, 30 Mar 2026 16:46:26 -0400 Subject: [PATCH 1/2] fix(facets): prevent endless loading state when query is disabled Gate isLoading on whether the facet query is actually enabled. React Query v4 returns isLoading=true for disabled queries with no cached data, causing facets to show a spinner indefinitely when latestQuery.q is transiently empty during navigation or state hydration. Also gate SIMBAD identifier resolution (useObjects) on isQueryEnabled so stale identifiers from keepPreviousData do not keep the secondary query running after the parent facet query is disabled. --- src/components/SearchFacet/useGetFacetData.ts | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/src/components/SearchFacet/useGetFacetData.ts b/src/components/SearchFacet/useGetFacetData.ts index 81bda3c71..4fd57b3b1 100644 --- a/src/components/SearchFacet/useGetFacetData.ts +++ b/src/components/SearchFacet/useGetFacetData.ts @@ -85,6 +85,8 @@ export const useGetFacetData = (props: IUseGetFacetDataProps) => { }, ); + const isQueryEnabled = enabled && isNonEmptyString(searchQuery?.q?.trim()); + const res = data?.[field]; const treeData = useMemo(() => formatTreeData(res?.buckets ?? []), [res?.buckets]); @@ -96,12 +98,9 @@ export const useGetFacetData = (props: IUseGetFacetDataProps) => { [field, treeData], ); - const { - data: objects, - isLoading, - isFetching, - isError, - } = useObjects({ identifiers }, { enabled: identifiers?.length > 0 }); + const hasIdentifiers = isQueryEnabled && identifiers?.length > 0; + + const { data: objects, isLoading, isFetching, isError } = useObjects({ identifiers }, { enabled: hasIdentifiers }); const enhancedTreeData = useMemo(() => { if (objects && treeData) { @@ -168,9 +167,9 @@ export const useGetFacetData = (props: IUseGetFacetDataProps) => { handlePageChange, canLoadMore: res?.numBuckets !== treeData?.length, ...result, - isLoading: result.isLoading || isLoading, - isFetching: result.isFetching || isFetching, - isError: result.isError || isError, + isLoading: (isQueryEnabled && result.isLoading) || (hasIdentifiers && isLoading), + isFetching: result.isFetching || (hasIdentifiers && isFetching), + isError: result.isError || (hasIdentifiers && isError), }; }; From 641a30a64e572e3b6a25696b1f2d8386c1ec9d34 Mon Sep 17 00:00:00 2001 From: Tim Hostetler <6970899+thostetler@users.noreply.github.com> Date: Tue, 31 Mar 2026 09:33:01 -0400 Subject: [PATCH 2/2] refactor(facets): hoist isQueryEnabled above hook call --- src/components/SearchFacet/useGetFacetData.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/SearchFacet/useGetFacetData.ts b/src/components/SearchFacet/useGetFacetData.ts index 4fd57b3b1..78168539f 100644 --- a/src/components/SearchFacet/useGetFacetData.ts +++ b/src/components/SearchFacet/useGetFacetData.ts @@ -59,6 +59,8 @@ export const useGetFacetData = (props: IUseGetFacetDataProps) => { setPagination(calculatePagination({ page: 0, numPerPage: FACET_DEFAULT_LIMIT })); }, [prefix, searchTerm, sortDir]); + const isQueryEnabled = enabled && isNonEmptyString(searchQuery?.q?.trim()); + // fetch the data const { data, ...result } = useGetSearchFacetJSON( { @@ -80,13 +82,11 @@ export const useGetFacetData = (props: IUseGetFacetDataProps) => { }), }, { - enabled: enabled && isNonEmptyString(searchQuery?.q?.trim()), + enabled: isQueryEnabled, keepPreviousData: true, }, ); - const isQueryEnabled = enabled && isNonEmptyString(searchQuery?.q?.trim()); - const res = data?.[field]; const treeData = useMemo(() => formatTreeData(res?.buckets ?? []), [res?.buckets]);