diff --git a/surfsense_web/app/(home)/login/page.tsx b/surfsense_web/app/(home)/login/page.tsx index 09bf770d8..161951d97 100644 --- a/surfsense_web/app/(home)/login/page.tsx +++ b/surfsense_web/app/(home)/login/page.tsx @@ -1,6 +1,7 @@ "use client"; import { AnimatePresence, motion } from "motion/react"; +import { useRouter } from "next/navigation"; import { useSearchParams } from "next/navigation"; import { useTranslations } from "next-intl"; import { Suspense, useEffect, useState } from "react"; @@ -16,6 +17,7 @@ import { LocalLoginForm } from "./LocalLoginForm"; function LoginContent() { const t = useTranslations("auth"); const tCommon = useTranslations("common"); + const router = useRouter(); const [authType, setAuthType] = useState(null); const [isLoading, setIsLoading] = useState(true); const [urlError, setUrlError] = useState<{ title: string; message: string } | null>(null); @@ -79,7 +81,7 @@ function LoginContent() { if (shouldRetry(error)) { toastOptions.action = { label: "Retry", - onClick: () => window.location.reload(), + onClick: () => router.refresh(), }; } diff --git a/surfsense_web/components/UserDropdown.tsx b/surfsense_web/components/UserDropdown.tsx index 197db6287..17a1e0d6d 100644 --- a/surfsense_web/components/UserDropdown.tsx +++ b/surfsense_web/components/UserDropdown.tsx @@ -2,6 +2,7 @@ import { BadgeCheck, LogOut } from "lucide-react"; import Link from "next/link"; +import { useRouter } from "next/navigation"; import { useState } from "react"; import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"; import { Button } from "@/components/ui/button"; @@ -27,6 +28,7 @@ export function UserDropdown({ avatar: string; }; }) { + const router = useRouter(); const [isLoggingOut, setIsLoggingOut] = useState(false); const handleLogout = async () => { @@ -40,16 +42,14 @@ export function UserDropdown({ // Revoke refresh token on server and clear all tokens from localStorage await logout(); - if (typeof window !== "undefined") { - window.location.href = "/"; - } + router.push("/"); + router.refresh(); } catch (error) { console.error("Error during logout:", error); // Even if there's an error, try to clear tokens and redirect await logout(); - if (typeof window !== "undefined") { - window.location.href = "/"; - } + router.push("/"); + router.refresh(); } }; diff --git a/surfsense_web/components/layout/ui/dialogs/CreateSearchSpaceDialog.tsx b/surfsense_web/components/layout/ui/dialogs/CreateSearchSpaceDialog.tsx index e39bee679..7d0ef73d2 100644 --- a/surfsense_web/components/layout/ui/dialogs/CreateSearchSpaceDialog.tsx +++ b/surfsense_web/components/layout/ui/dialogs/CreateSearchSpaceDialog.tsx @@ -2,6 +2,7 @@ import { zodResolver } from "@hookform/resolvers/zod"; import { useAtomValue } from "jotai"; +import { useRouter } from "next/navigation"; import { useTranslations } from "next-intl"; import { useState } from "react"; import { useForm } from "react-hook-form"; @@ -43,6 +44,7 @@ interface CreateSearchSpaceDialogProps { export function CreateSearchSpaceDialog({ open, onOpenChange }: CreateSearchSpaceDialogProps) { const t = useTranslations("searchSpace"); const tCommon = useTranslations("common"); + const router = useRouter(); const [isSubmitting, setIsSubmitting] = useState(false); const { mutateAsync: createSearchSpace } = useAtomValue(createSearchSpaceMutationAtom); @@ -65,8 +67,7 @@ export function CreateSearchSpaceDialog({ open, onOpenChange }: CreateSearchSpac trackSearchSpaceCreated(result.id, values.name); - // Hard redirect to ensure fresh state - window.location.href = `/dashboard/${result.id}/onboard`; + router.push(`/dashboard/${result.id}/onboard`); } catch (error) { console.error("Failed to create search space:", error); setIsSubmitting(false);