From 2ab476ef2ecf55e62de280f8780298c929223a00 Mon Sep 17 00:00:00 2001 From: Steven Date: Sun, 22 Feb 2026 13:16:59 +0800 Subject: [PATCH] fix(web): memoize useNavigateTo to prevent infinite view transition loop Wrapping the returned function in useCallback prevents a new reference on every render, which was causing an infinite startViewTransition loop on the initial signup page (fresh install with no admin). Fixes #5626 --- web/src/hooks/useNavigateTo.ts | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/web/src/hooks/useNavigateTo.ts b/web/src/hooks/useNavigateTo.ts index 916f47105..ae40c7b0a 100644 --- a/web/src/hooks/useNavigateTo.ts +++ b/web/src/hooks/useNavigateTo.ts @@ -1,18 +1,22 @@ +import { useCallback } from "react"; import { NavigateOptions, useNavigate } from "react-router-dom"; const useNavigateTo = () => { const navigateTo = useNavigate(); - const navigateToWithViewTransition = (to: string, options?: NavigateOptions) => { - const doc = window.document as unknown as Document & { startViewTransition?: (callback: () => void) => void }; - if (!doc.startViewTransition) { - navigateTo(to, options); - } else { - document.startViewTransition(() => { + const navigateToWithViewTransition = useCallback( + (to: string, options?: NavigateOptions) => { + const doc = window.document as unknown as Document & { startViewTransition?: (callback: () => void) => void }; + if (!doc.startViewTransition) { navigateTo(to, options); - }); - } - }; + } else { + document.startViewTransition(() => { + navigateTo(to, options); + }); + } + }, + [navigateTo], + ); return navigateToWithViewTransition; };