From 5b0f8b46f06cbc4de4fe2587abd6e51e263e3f65 Mon Sep 17 00:00:00 2001 From: Maximillian Arruda Date: Sun, 30 Aug 2026 03:36:30 +0000 Subject: [PATCH] Use shallow history updates for listing filter and selection URL state Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> --- .../use-opportunities-screen-controller.ts | 14 +++++++------- .../controller/use-url-sync.ts | 6 +----- 2 files changed, 8 insertions(+), 12 deletions(-) diff --git a/app/opportunities/_components/opportunities-screen/controller/use-opportunities-screen-controller.ts b/app/opportunities/_components/opportunities-screen/controller/use-opportunities-screen-controller.ts index 4453a0a..00a0877 100644 --- a/app/opportunities/_components/opportunities-screen/controller/use-opportunities-screen-controller.ts +++ b/app/opportunities/_components/opportunities-screen/controller/use-opportunities-screen-controller.ts @@ -1,5 +1,5 @@ import * as React from "react"; -import { usePathname, useRouter, useSearchParams } from "next/navigation"; +import { usePathname, useSearchParams } from "next/navigation"; import { useI18n } from "@/components/providers/i18n-provider/use-i18n"; import { ALL_FILTER_VALUE, DEFAULT_FILTERS } from "./defaults"; import { buildServerFilters } from "./server-filters"; @@ -28,7 +28,6 @@ export function useOpportunitiesScreenController({ forcedRepository, forcedAuthor, }: OpportunitiesScreenProps) { - const router = useRouter(); const pathname = usePathname(); const searchParams = useSearchParams(); const { locale, messages } = useI18n(); @@ -94,10 +93,12 @@ export function useOpportunitiesScreenController({ nextSearchParams.delete("job"); const nextSearch = nextSearchParams.toString(); - router.replace(nextSearch ? `${pathname}?${nextSearch}` : pathname, { - scroll: false, - }); - }, [pathname, router, searchParams, setSelectedOpportunityId]); + window.history.replaceState( + null, + "", + nextSearch ? `${pathname}?${nextSearch}` : pathname, + ); + }, [pathname, searchParams, setSelectedOpportunityId]); const handleBeforeReload = React.useCallback(() => { setSelectedOpportunityId(null); setFilters((previous) => (previous.page === 1 ? previous : { ...previous, page: 1 })); @@ -168,7 +169,6 @@ export function useOpportunitiesScreenController({ !remote.isLoading && !remote.hasLoadError, pathname, - router, currentSearch: searchParams.toString(), filtersForUrl, preservedParams: preservedParamsForUrl, diff --git a/app/opportunities/_components/opportunities-screen/controller/use-url-sync.ts b/app/opportunities/_components/opportunities-screen/controller/use-url-sync.ts index 9b21a17..95a9568 100644 --- a/app/opportunities/_components/opportunities-screen/controller/use-url-sync.ts +++ b/app/opportunities/_components/opportunities-screen/controller/use-url-sync.ts @@ -1,5 +1,4 @@ import * as React from "react"; -import type { AppRouterInstance } from "next/dist/shared/lib/app-router-context.shared-runtime"; import { buildSearchParamsFromFilters } from "./url-filters"; import type { OpportunityFiltersState } from "@/app/opportunities/_components/opportunities-screen/types"; @@ -7,7 +6,6 @@ interface UseUrlSyncParams { enabled?: boolean; pathname: string; currentSearch: string; - router: AppRouterInstance; filtersForUrl: OpportunityFiltersState; preservedParams?: Record; defaultCountry?: string; @@ -52,7 +50,6 @@ export function useUrlSync({ enabled = true, pathname, currentSearch, - router, filtersForUrl, preservedParams, defaultCountry, @@ -93,14 +90,13 @@ export function useUrlSync({ } pendingReplaceRef.current = { href, currentSearch }; - router.replace(href, { scroll: false }); + window.history.replaceState(null, "", href); }, [ currentSearch, enabled, normalizedCurrentSearch, normalizedSerializedFilters, pathname, - router, serializedSearch, ]); }