diff --git a/apps/web/core/inbox/mutations.ts b/apps/web/core/inbox/mutations.ts index 594a6ac7..9d67cc05 100644 --- a/apps/web/core/inbox/mutations.ts +++ b/apps/web/core/inbox/mutations.ts @@ -20,6 +20,9 @@ export function useMarkInboxRead() { onError: (_err, _id, ctx) => { if (ctx?.prev) qc.setQueryData(inboxKeys.list(wsId), ctx.prev); }, + onSettled: () => { + qc.invalidateQueries({ queryKey: inboxKeys.list(wsId) }); + }, }); } @@ -46,6 +49,9 @@ export function useArchiveInbox() { onError: (_err, _id, ctx) => { if (ctx?.prev) qc.setQueryData(inboxKeys.list(wsId), ctx.prev); }, + onSettled: () => { + qc.invalidateQueries({ queryKey: inboxKeys.list(wsId) }); + }, }); } @@ -67,6 +73,9 @@ export function useMarkAllInboxRead() { onError: (_err, _vars, ctx) => { if (ctx?.prev) qc.setQueryData(inboxKeys.list(wsId), ctx.prev); }, + onSettled: () => { + qc.invalidateQueries({ queryKey: inboxKeys.list(wsId) }); + }, }); } diff --git a/apps/web/core/issues/mutations.ts b/apps/web/core/issues/mutations.ts index e05d17de..18414049 100644 --- a/apps/web/core/issues/mutations.ts +++ b/apps/web/core/issues/mutations.ts @@ -35,8 +35,14 @@ export function useUpdateIssue() { return useMutation({ mutationFn: ({ id, ...data }: { id: string } & UpdateIssueRequest) => api.updateIssue(id, data), - onMutate: async ({ id, ...data }) => { - await qc.cancelQueries({ queryKey: issueKeys.list(wsId) }); + onMutate: ({ id, ...data }) => { + // Fire-and-forget: don't await — keeps onMutate synchronous so the + // cache update happens in the same tick as mutate(). Awaiting would + // yield to the event loop, letting @dnd-kit reset its visual state + // before the optimistic update lands → card flickers back briefly. + // Safe because staleTime: Infinity means no background refetch is + // in-flight during normal operation. + qc.cancelQueries({ queryKey: issueKeys.list(wsId) }); const prevList = qc.getQueryData(issueKeys.list(wsId)); const prevDetail = qc.getQueryData(issueKeys.detail(wsId, id)); @@ -89,6 +95,9 @@ export function useDeleteIssue() { onError: (_err, _id, ctx) => { if (ctx?.prevList) qc.setQueryData(issueKeys.list(wsId), ctx.prevList); }, + onSettled: () => { + qc.invalidateQueries({ queryKey: issueKeys.list(wsId) }); + }, }); } @@ -149,6 +158,9 @@ export function useBatchDeleteIssues() { onError: (_err, _ids, ctx) => { if (ctx?.prevList) qc.setQueryData(issueKeys.list(wsId), ctx.prevList); }, + onSettled: () => { + qc.invalidateQueries({ queryKey: issueKeys.list(wsId) }); + }, }); } @@ -215,6 +227,9 @@ export function useUpdateComment(issueId: string) { if (ctx?.prev) qc.setQueryData(issueKeys.timeline(issueId), ctx.prev); }, + onSettled: () => { + qc.invalidateQueries({ queryKey: issueKeys.timeline(issueId) }); + }, }); } @@ -251,6 +266,9 @@ export function useDeleteComment(issueId: string) { if (ctx?.prev) qc.setQueryData(issueKeys.timeline(issueId), ctx.prev); }, + onSettled: () => { + qc.invalidateQueries({ queryKey: issueKeys.timeline(issueId) }); + }, }); } @@ -339,6 +357,9 @@ export function useToggleCommentReaction(issueId: string) { if (ctx?.prev) qc.setQueryData(issueKeys.timeline(issueId), ctx.prev); }, + onSettled: () => { + qc.invalidateQueries({ queryKey: issueKeys.timeline(issueId) }); + }, }); } @@ -404,6 +425,9 @@ export function useToggleIssueReaction(issueId: string) { if (ctx?.prev) qc.setQueryData(issueKeys.reactions(issueId), ctx.prev); }, + onSettled: () => { + qc.invalidateQueries({ queryKey: issueKeys.reactions(issueId) }); + }, }); } @@ -470,5 +494,8 @@ export function useToggleIssueSubscriber(issueId: string) { if (ctx?.prev) qc.setQueryData(issueKeys.subscribers(issueId), ctx.prev); }, + onSettled: () => { + qc.invalidateQueries({ queryKey: issueKeys.subscribers(issueId) }); + }, }); } diff --git a/apps/web/core/query-client.ts b/apps/web/core/query-client.ts index be5ebea0..831a2e91 100644 --- a/apps/web/core/query-client.ts +++ b/apps/web/core/query-client.ts @@ -7,7 +7,7 @@ export function createQueryClient(): QueryClient { staleTime: Infinity, gcTime: 10 * 60 * 1000, // 10 minutes refetchOnWindowFocus: false, - refetchOnReconnect: false, + refetchOnReconnect: true, retry: 1, }, mutations: {