From 4fdcfe55151e863636b1382e59cc03f8fd14e8dc Mon Sep 17 00:00:00 2001 From: dotta Date: Tue, 17 Mar 2026 16:14:43 -0500 Subject: [PATCH] Refresh inbox recent after issue creation Co-Authored-By: Paperclip --- ui/src/components/NewIssueDialog.tsx | 3 ++ ui/src/context/LiveUpdatesProvider.test.ts | 34 ++++++++++++++++++++++ ui/src/context/LiveUpdatesProvider.tsx | 6 ++++ 3 files changed, 43 insertions(+) create mode 100644 ui/src/context/LiveUpdatesProvider.test.ts diff --git a/ui/src/components/NewIssueDialog.tsx b/ui/src/components/NewIssueDialog.tsx index ad8efb67..727a54e6 100644 --- a/ui/src/components/NewIssueDialog.tsx +++ b/ui/src/components/NewIssueDialog.tsx @@ -430,6 +430,9 @@ export function NewIssueDialog() { }, onSuccess: ({ issue, companyId, failures }) => { queryClient.invalidateQueries({ queryKey: queryKeys.issues.list(companyId) }); + queryClient.invalidateQueries({ queryKey: queryKeys.issues.listTouchedByMe(companyId) }); + queryClient.invalidateQueries({ queryKey: queryKeys.issues.listUnreadTouchedByMe(companyId) }); + queryClient.invalidateQueries({ queryKey: queryKeys.sidebarBadges(companyId) }); if (draftTimer.current) clearTimeout(draftTimer.current); if (failures.length > 0) { const prefix = (companies.find((company) => company.id === companyId)?.issuePrefix ?? "").trim(); diff --git a/ui/src/context/LiveUpdatesProvider.test.ts b/ui/src/context/LiveUpdatesProvider.test.ts new file mode 100644 index 00000000..4192f81f --- /dev/null +++ b/ui/src/context/LiveUpdatesProvider.test.ts @@ -0,0 +1,34 @@ +// @vitest-environment node + +import { describe, expect, it } from "vitest"; +import { __liveUpdatesTestUtils } from "./LiveUpdatesProvider"; +import { queryKeys } from "../lib/queryKeys"; + +describe("LiveUpdatesProvider issue invalidation", () => { + it("refreshes touched inbox queries for issue activity", () => { + const invalidations: unknown[] = []; + const queryClient = { + invalidateQueries: (input: unknown) => { + invalidations.push(input); + }, + getQueryData: () => undefined, + }; + + __liveUpdatesTestUtils.invalidateActivityQueries( + queryClient as never, + "company-1", + { + entityType: "issue", + entityId: "issue-1", + details: null, + }, + ); + + expect(invalidations).toContainEqual({ + queryKey: queryKeys.issues.listTouchedByMe("company-1"), + }); + expect(invalidations).toContainEqual({ + queryKey: queryKeys.issues.listUnreadTouchedByMe("company-1"), + }); + }); +}); diff --git a/ui/src/context/LiveUpdatesProvider.tsx b/ui/src/context/LiveUpdatesProvider.tsx index 5ad06a72..529436e4 100644 --- a/ui/src/context/LiveUpdatesProvider.tsx +++ b/ui/src/context/LiveUpdatesProvider.tsx @@ -361,6 +361,8 @@ function invalidateActivityQueries( if (entityType === "issue") { queryClient.invalidateQueries({ queryKey: queryKeys.issues.list(companyId) }); + queryClient.invalidateQueries({ queryKey: queryKeys.issues.listTouchedByMe(companyId) }); + queryClient.invalidateQueries({ queryKey: queryKeys.issues.listUnreadTouchedByMe(companyId) }); if (entityId) { const details = readRecord(payload.details); const issueRefs = resolveIssueQueryRefs(queryClient, companyId, entityId, details); @@ -510,6 +512,10 @@ function handleLiveEvent( } } +export const __liveUpdatesTestUtils = { + invalidateActivityQueries, +}; + export function LiveUpdatesProvider({ children }: { children: ReactNode }) { const { selectedCompanyId } = useCompany(); const queryClient = useQueryClient();