From 9de2efb722cf7938aff89b79fcfcb2a1ca75c310 Mon Sep 17 00:00:00 2001 From: Linus Rath <139418639+rathlinus@users.noreply.github.com> Date: Mon, 26 Oct 2026 19:43:38 +0100 Subject: [PATCH] fix: open a shared or group account's message from its link instead of the own message with the same id #1351 --- components/email/email-context-menu.tsx | 6 +- components/email/email-viewer.tsx | 4 +- components/mail/mail-app.tsx | 67 ++++++++++------- hooks/use-email-drag.ts | 4 +- lib/__tests__/deep-links.test.ts | 18 +++++ lib/deep-links.ts | 30 ++++++-- lib/global-search/open-hit.ts | 8 ++- .../__tests__/email-store-link-owner.test.ts | 71 +++++++++++++++++++ stores/email-store.ts | 30 ++++++-- 9 files changed, 195 insertions(+), 43 deletions(-) create mode 100644 stores/__tests__/email-store-link-owner.test.ts diff --git a/components/email/email-context-menu.tsx b/components/email/email-context-menu.tsx index d2293ffae..0050253c4 100644 --- a/components/email/email-context-menu.tsx +++ b/components/email/email-context-menu.tsx @@ -3,7 +3,7 @@ import { useMemo } from "react"; import { useTranslations } from "next-intl"; import { useSettingsStore } from "@/stores/settings-store"; -import { useEmailStore, removalFolder, canRemoveFromFolder } from "@/stores/email-store"; +import { useEmailStore, removalFolder, canRemoveFromFolder, emailLinkSource } from "@/stores/email-store"; import { Email, Mailbox } from "@/lib/jmap/types"; import { ContextMenu, @@ -353,7 +353,7 @@ export function EmailContextMenu({ icon={LinkIcon} label={tDeepLink("copy_message")} onClick={() => handleAction(() => { - void copyLink(buildMailPath({ mailboxId: null, emailId: email.id, threadId: null })); + void copyLink(buildMailPath({ mailboxId: null, emailId: email.id, threadId: null, ...emailLinkSource(email) })); })} /> {email.threadId && ( @@ -361,7 +361,7 @@ export function EmailContextMenu({ icon={MessagesSquare} label={tDeepLink("copy_conversation")} onClick={() => handleAction(() => { - void copyLink(buildMailPath({ mailboxId: null, emailId: null, threadId: email.threadId! })); + void copyLink(buildMailPath({ mailboxId: null, emailId: null, threadId: email.threadId!, ...emailLinkSource(email) })); })} /> )} diff --git a/components/email/email-viewer.tsx b/components/email/email-viewer.tsx index c5bb5c58b..54a8409d6 100644 --- a/components/email/email-viewer.tsx +++ b/components/email/email-viewer.tsx @@ -111,7 +111,7 @@ import { useDeviceDetection } from "@/hooks/use-media-query"; import { useIsPaneScoped } from "@/hooks/use-pane-context"; import { useAuthStore } from "@/stores/auth-store"; import { useAccountStore } from "@/stores/account-store"; -import { useEmailStore, resolveEmailBlobContext, emailWriteSource, type EmailBlobContext } from "@/stores/email-store"; +import { useEmailStore, resolveEmailBlobContext, emailWriteSource, emailLinkSource, type EmailBlobContext } from "@/stores/email-store"; import { useThemeStore } from "@/stores/theme-store"; import { EmailIdentityBadge } from "./email-identity-badge"; import { UnsubscribeBanner } from "./unsubscribe-banner"; @@ -4461,7 +4461,7 @@ export function EmailViewer({