deer-flow/frontend/src/components/query-client-provider.tsx
Lucien 1ae50826b1
fix(frontend): isolate workspace query caches by authenticated owner (#7146)
* fix(frontend): isolate query caches by authenticated owner

* fix(frontend): share auth owner across isolation boundaries

* docs(frontend): keep agent guidance within size budget

---------

Co-authored-by: Willem Jiang <willem.jiang@gmail.com>
2026-10-20 10:26:48 +08:00

44 lines
1.2 KiB
TypeScript

"use client";
import {
QueryClient,
QueryClientProvider as TanStackQueryClientProvider,
} from "@tanstack/react-query";
import { useContext, useEffect, useState } from "react";
import { AuthQueryScopeContext } from "@/core/auth/query-scope";
export function QueryClientProvider({
children,
}: Readonly<{
children: React.ReactNode;
}>) {
const owner = useContext(AuthQueryScopeContext);
// A confirmed logout must not start fresh reads with the old cookie while
// the logout POST is still pending. Public/unknown-auth routes still render.
if (owner === null) return null;
// Remount consumers as well as the client, so no observer/local state can
// retain an old account's data for the new account's first render.
return (
<ScopedQueryClientProvider key={owner}>
{children}
</ScopedQueryClientProvider>
);
}
function ScopedQueryClientProvider({
children,
}: {
children: React.ReactNode;
}) {
const [queryClient] = useState(() => new QueryClient());
useEffect(() => () => queryClient.clear(), [queryClient]);
return (
<TanStackQueryClientProvider client={queryClient}>
{children}
</TanStackQueryClientProvider>
);
}