From ea2cf33fd3572d8ba9d4064127025093fddcb547 Mon Sep 17 00:00:00 2001 From: MaheshtheDev <38828053+MaheshtheDev@users.noreply.github.com> Date: Fri, 24 Jul 2026 03:18:39 +0000 Subject: [PATCH] fix(web): invite dialog focus trap inside settings modal (#1347) Portal the invite-teammate dialog into the settings modal and autofocus the email input, matching the delete-org dialog fix. Stacked body-portaled dialogs broke focus so the email field stopped accepting input after the first invite. Fixes ENG-1110 --- apps/web/components/settings/account.tsx | 13 ++++++++++++- apps/web/components/settings/settings-content.tsx | 4 +++- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/apps/web/components/settings/account.tsx b/apps/web/components/settings/account.tsx index d054e608..99e9bf47 100644 --- a/apps/web/components/settings/account.tsx +++ b/apps/web/components/settings/account.tsx @@ -132,7 +132,11 @@ function isPendingInvitation(invitation: { return new Date(invitation.expiresAt).getTime() > Date.now() } -export default function Account() { +export default function Account({ + dialogPortalContainer, +}: { + dialogPortalContainer?: HTMLElement | null +}) { const { user, org, refetchActiveOrg, refetchOrganizations } = useAuth() const autumn = useCustomer() const { currentPlan, searchesUsed } = useTokenUsage(autumn) @@ -152,6 +156,7 @@ export default function Account() { const [isEditingOrgName, setIsEditingOrgName] = useState(false) const [orgNameDraft, setOrgNameDraft] = useState("") const tagInputRef = useRef(null) + const inviteEmailInputRef = useRef(null) const tagAnchorRef = useRef(null) const { allProjects: allContainerTags } = useContainerTags() @@ -877,6 +882,11 @@ export default function Account() { > { + event.preventDefault() + inviteEmailInputRef.current?.focus() + }} className="sm:max-w-[480px] border-none bg-[#1B1F24] p-0 gap-0 rounded-[22px] overflow-hidden" >
@@ -925,6 +935,7 @@ export default function Account() {
} > - {activeTab === "account" && } + {activeTab === "account" && ( + + )} {activeTab === "billing" && } {activeTab === "integrations" && } {activeTab === "connections" && }