From 4ab152cbcc6828cedbf86670f4a8da4501292334 Mon Sep 17 00:00:00 2001 From: Jake Jarvis Date: Sun, 4 Oct 2026 15:52:52 -0400 Subject: [PATCH] fix(web): clear cached user data on sign-out and sign-in Co-Authored-By: Claude Sonnet 5.5 --- apps/web/src/components/auth-form.tsx | 3 +++ apps/web/src/components/nav-bar.tsx | 5 ++++- .../components/settings/account-section.tsx | 5 ++++- apps/web/src/hooks/use-reset-user-state.ts | 19 +++++++++++++++++++ 4 files changed, 30 insertions(+), 2 deletions(-) create mode 100644 apps/web/src/hooks/use-reset-user-state.ts diff --git a/apps/web/src/components/auth-form.tsx b/apps/web/src/components/auth-form.tsx index 4992fb2..fe042d1 100644 --- a/apps/web/src/components/auth-form.tsx +++ b/apps/web/src/components/auth-form.tsx @@ -9,6 +9,7 @@ import { Alert, AlertDescription } from "@/components/ui/alert"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; +import { useResetUserState } from "@/hooks/use-reset-user-state"; import { authClient, signIn, signUp } from "@/lib/auth/client"; import { useAppForm } from "@/lib/form"; @@ -40,6 +41,7 @@ export function AuthForm({ }) { const { t } = useLingui(); const navigate = useNavigate(); + const resetUserState = useResetUserState(); const [error, setError] = useState(""); const [oidcLoading, setOidcLoading] = useState(false); @@ -70,6 +72,7 @@ export function AuthForm({ return; } } + resetUserState(); void navigate({ to: isRegister ? "/onboarding" : "/dashboard" }); } catch { setError(t`Something went wrong`); diff --git a/apps/web/src/components/nav-bar.tsx b/apps/web/src/components/nav-bar.tsx index 9dbde50..a23fcf4 100644 --- a/apps/web/src/components/nav-bar.tsx +++ b/apps/web/src/components/nav-bar.tsx @@ -25,6 +25,7 @@ import { } from "@/components/ui/dropdown-menu"; import { Kbd } from "@/components/ui/kbd"; import { Separator } from "@/components/ui/separator"; +import { useResetUserState } from "@/hooks/use-reset-user-state"; import { commandPaletteOpenAtom } from "@/lib/atoms/command-palette"; import { signOut } from "@/lib/auth/client"; @@ -115,6 +116,7 @@ export function NavBar({ }) { const { t } = useLingui(); const navigate = useNavigate(); + const resetUserState = useResetUserState(); const { pathname } = useLocation(); const setCommandPaletteOpen = useSetAtom(commandPaletteOpenAtom); @@ -249,7 +251,8 @@ export function NavBar({ variant="destructive" onSelect={async () => { await signOut(); - void navigate({ to: "/" }); + await navigate({ to: "/" }); + resetUserState(); }} className="cursor-pointer text-[13px]" > diff --git a/apps/web/src/components/settings/account-section.tsx b/apps/web/src/components/settings/account-section.tsx index ac55d22..681b4c2 100644 --- a/apps/web/src/components/settings/account-section.tsx +++ b/apps/web/src/components/settings/account-section.tsx @@ -39,6 +39,7 @@ import { Label } from "@/components/ui/label"; import { Progress } from "@/components/ui/progress"; import { Spinner } from "@/components/ui/spinner"; import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip"; +import { useResetUserState } from "@/hooks/use-reset-user-state"; import { authClient, signOut } from "@/lib/auth/client"; import { getErrorMessage } from "@/lib/error-messages"; import { useAppForm } from "@/lib/form"; @@ -59,6 +60,7 @@ export function AccountSection({ }) { const { t } = useLingui(); const navigate = useNavigate(); + const resetUserState = useResetUserState(); const router = useRouter(); const [avatarUrl, setAvatarUrl] = useState(user.image); const [isHovered, setIsHovered] = useState(false); @@ -318,7 +320,8 @@ export function AccountSection({ variant="destructive" onClick={async () => { await signOut(); - void navigate({ to: "/" }); + await navigate({ to: "/" }); + resetUserState(); }} > diff --git a/apps/web/src/hooks/use-reset-user-state.ts b/apps/web/src/hooks/use-reset-user-state.ts new file mode 100644 index 0000000..573ce73 --- /dev/null +++ b/apps/web/src/hooks/use-reset-user-state.ts @@ -0,0 +1,19 @@ +import { useQueryClient } from "@tanstack/react-query"; +import { useSetAtom } from "jotai"; +import { RESET } from "jotai/utils"; +import { useCallback } from "react"; + +import { recentSearchesAtom } from "@/lib/atoms/command-palette"; + +/** + * Drop everything cached for the current user. Query keys are not scoped by + * user, so this must run on sign-out and before entering the app after sign-in. + */ +export function useResetUserState() { + const queryClient = useQueryClient(); + const setRecentSearches = useSetAtom(recentSearchesAtom); + return useCallback(() => { + queryClient.clear(); + setRecentSearches(RESET); + }, [queryClient, setRecentSearches]); +}