fix: mention closure, onSettled invalidation, cleanup singleton
- Fix Tiptap mention: pass QueryClient via closure from ContentEditor instead of getQueryClient() singleton (resolves @mention empty list) - Add onSettled invalidation to useUpdateIssue (prevents cache drift with staleTime: Infinity + self-event WS filter) - Add cache shape comment to issueListOptions (select transforms ListIssuesResponse → Issue[], but cache stores raw response) - Memoize sidebar inbox dedup computation - Remove dead getQueryClient/setQueryClient singleton + window property - Remove ActorSync component and _members/_agents Zustand mirror (superseded by closure approach) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
e40341ab73
commit
6032b5dfcb
9 changed files with 28 additions and 27 deletions
|
|
@ -1,3 +1,3 @@
|
|||
export { createQueryClient, getQueryClient, setQueryClient } from "./query-client";
|
||||
export { createQueryClient } from "./query-client";
|
||||
export { QueryProvider } from "./provider";
|
||||
export { useWorkspaceId } from "./hooks";
|
||||
|
|
|
|||
|
|
@ -60,6 +60,9 @@ export function useUpdateIssue() {
|
|||
if (ctx?.prevDetail)
|
||||
qc.setQueryData(issueKeys.detail(wsId, ctx.id), ctx.prevDetail);
|
||||
},
|
||||
onSettled: (_data, _err, vars) => {
|
||||
qc.invalidateQueries({ queryKey: issueKeys.detail(wsId, vars.id) });
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -12,6 +12,11 @@ export const issueKeys = {
|
|||
["issues", "subscribers", issueId] as const,
|
||||
};
|
||||
|
||||
/**
|
||||
* CACHE SHAPE NOTE: The raw cache stores ListIssuesResponse ({ issues, total }),
|
||||
* but `select` transforms it to Issue[] for consumers. Mutations and ws-updaters
|
||||
* must use setQueryData<ListIssuesResponse>(...) — NOT setQueryData<Issue[]>.
|
||||
*/
|
||||
export function issueListOptions(wsId: string) {
|
||||
return queryOptions({
|
||||
queryKey: issueKeys.list(wsId),
|
||||
|
|
|
|||
|
|
@ -3,15 +3,11 @@
|
|||
import { useState } from "react";
|
||||
import { QueryClientProvider } from "@tanstack/react-query";
|
||||
import { ReactQueryDevtools } from "@tanstack/react-query-devtools";
|
||||
import { createQueryClient, setQueryClient } from "./query-client";
|
||||
import { createQueryClient } from "./query-client";
|
||||
import type { ReactNode } from "react";
|
||||
|
||||
export function QueryProvider({ children }: { children: ReactNode }) {
|
||||
const [queryClient] = useState(() => {
|
||||
const client = createQueryClient();
|
||||
setQueryClient(client);
|
||||
return client;
|
||||
});
|
||||
const [queryClient] = useState(createQueryClient);
|
||||
return (
|
||||
<QueryClientProvider client={queryClient}>
|
||||
{children}
|
||||
|
|
|
|||
|
|
@ -1,7 +1,5 @@
|
|||
import { QueryClient } from "@tanstack/react-query";
|
||||
|
||||
let _queryClient: QueryClient | null = null;
|
||||
|
||||
export function createQueryClient(): QueryClient {
|
||||
return new QueryClient({
|
||||
defaultOptions: {
|
||||
|
|
@ -18,14 +16,3 @@ export function createQueryClient(): QueryClient {
|
|||
},
|
||||
});
|
||||
}
|
||||
|
||||
/** Called by QueryProvider on mount to register the singleton. */
|
||||
export function setQueryClient(client: QueryClient) {
|
||||
_queryClient = client;
|
||||
}
|
||||
|
||||
/** Access QueryClient outside React tree (WS handlers, Zustand actions). */
|
||||
export function getQueryClient(): QueryClient {
|
||||
if (!_queryClient) throw new Error("QueryClient not initialized");
|
||||
return _queryClient;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue