From 320cb83449acabd6fca4615b45164d454783a43e Mon Sep 17 00:00:00 2001 From: y3drk Date: Fri, 2 Jan 2026 13:27:10 +0100 Subject: [PATCH 1/2] Add a global, generic hook to clear redundant query params --> Closes Issue #1435 --- apps/ensadmin/src/app/layout.tsx | 2 + .../src/hooks/use-clear-url-params.tsx | 67 +++++++++++++++++++ 2 files changed, 69 insertions(+) create mode 100644 apps/ensadmin/src/hooks/use-clear-url-params.tsx diff --git a/apps/ensadmin/src/app/layout.tsx b/apps/ensadmin/src/app/layout.tsx index 244b08d13..c6c0d7694 100644 --- a/apps/ensadmin/src/app/layout.tsx +++ b/apps/ensadmin/src/app/layout.tsx @@ -8,6 +8,7 @@ import { Suspense } from "react"; import { LayoutWrapper } from "@/components/layout-wrapper"; import { QueryClientProvider } from "@/components/query-client/components"; import { Toaster } from "@/components/ui/sonner"; +import { UseClearUrlParams } from "@/hooks/use-clear-url-params"; import { ConnectionsLibraryProvider } from "@/hooks/use-connections-library"; import { ensAdminPublicUrl } from "@/lib/env"; @@ -62,6 +63,7 @@ export default function Layout({ + {children} diff --git a/apps/ensadmin/src/hooks/use-clear-url-params.tsx b/apps/ensadmin/src/hooks/use-clear-url-params.tsx new file mode 100644 index 000000000..d8fb510f2 --- /dev/null +++ b/apps/ensadmin/src/hooks/use-clear-url-params.tsx @@ -0,0 +1,67 @@ +"use client"; + +import { usePathname, useRouter, useSearchParams } from "next/navigation"; +import { useEffect } from "react"; + +interface useClearUrlParamsProps { + /** + * A record of URL parameters and paths on which they are allowed. + * + * @example When parameter "name" is only allowed on path "/name" then + * allowedParams={name: ["/name"]} + */ + allowedParams: Record; +} + +/** + * Clear URL params + * + * Scans the current URL and clears all parameters that are present outside their allowed paths. + * + * @throws Error if the hook is set up to clear the `connection` URL param. + * + * @example + * allowedParams={name: ["/name"]} + * Initial URL: https://admin.ensnode.io/name?name=lightwalker.eth&connection=https%3A%2F%2Fapi.alpha.ensnode.io%2F + * URL after the hook: https://admin.ensnode.io/name?connection=https%3A%2F%2Fapi.alpha.ensnode.io%2F + * + * @example + * allowedParams={name: ["/name"]} + * Initial URL: https://admin.ensnode.io/name?example=lightwalker.eth&connection=https%3A%2F%2Fapi.alpha.ensnode.io%2F + * URL after the hook: https://admin.ensnode.io/name?example=lightwalker.eth&connection=https%3A%2F%2Fapi.alpha.ensnode.io%2F + * + */ +export function UseClearUrlParams({ allowedParams }: useClearUrlParamsProps) { + const router = useRouter(); + const searchParams = useSearchParams(); + const path = usePathname(); + + if (Object.keys(allowedParams).includes("connection")) + throw new Error( + `Invariant(useClearUrlParams): 'connection' parameter should not be edited by this hook`, + ); + + useEffect(() => { + const currentParams = new URLSearchParams(searchParams.toString()); + const paramsToRemove = []; + + // for each provided parameter + for (const [param, allowedPaths] of Object.entries(allowedParams)) { + // if we're not on a path where a param is allowed, and it's still present, + // mark it as 'to be removed' + if (!allowedPaths.includes(path) && searchParams.has(param)) { + paramsToRemove.push(param); + } + } + + // Clear all parameters determined as 'to be removed' + if (paramsToRemove.length > 0) { + paramsToRemove.forEach((param) => currentParams.delete(param)); + + // update the URL without changing history + router.replace(`${path}?${currentParams}`); + } + }, [searchParams, path]); + + return null; +} From fd927423bc5dc1d08d6f2f77802978da11e3b663 Mon Sep 17 00:00:00 2001 From: y3drk Date: Fri, 2 Jan 2026 14:47:49 +0100 Subject: [PATCH 2/2] docs(changeset): Fixes an issue where `?name=` param stays on page regardless of route. --- .changeset/fancy-pets-bet.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/fancy-pets-bet.md diff --git a/.changeset/fancy-pets-bet.md b/.changeset/fancy-pets-bet.md new file mode 100644 index 000000000..0223be8bf --- /dev/null +++ b/.changeset/fancy-pets-bet.md @@ -0,0 +1,5 @@ +--- +"ensadmin": patch +--- + +Fixes an issue where `?name=` param stays on page regardless of route.