From 254f6411824512097c6e3afde51bc1500d0a4e8e Mon Sep 17 00:00:00 2001 From: Ibrahim Serdar Acikgoz Date: Thu, 10 Jul 2025 11:30:54 +0200 Subject: [PATCH] [MM-64371] Prevent WS being closed by browser due to navigation (#31367) * prevent ws being closed by browser due to navigation * add href back --------- Co-authored-by: Mattermost Build --- .../profile_popover_email.test.tsx | 73 +++++++++++++++++++ .../profile_popover/profile_popover_email.tsx | 8 +- .../profile_popover_phone.test.tsx | 56 +++++++++++--- .../profile_popover/profile_popover_phone.tsx | 8 +- 4 files changed, 132 insertions(+), 13 deletions(-) create mode 100644 webapp/channels/src/components/profile_popover/profile_popover_email.test.tsx diff --git a/webapp/channels/src/components/profile_popover/profile_popover_email.test.tsx b/webapp/channels/src/components/profile_popover/profile_popover_email.test.tsx new file mode 100644 index 0000000000..05674f3eeb --- /dev/null +++ b/webapp/channels/src/components/profile_popover/profile_popover_email.test.tsx @@ -0,0 +1,73 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +import {screen, fireEvent} from '@testing-library/react'; +import React from 'react'; + +import {renderWithContext} from 'tests/react_testing_utils'; + +import ProfilePopoverEmail from './profile_popover_email'; + +// Mock window.open +const mockWindowOpen = jest.fn(); +Object.defineProperty(window, 'open', { + writable: true, + value: mockWindowOpen, +}); + +describe('components/ProfilePopoverEmail', () => { + const baseProps = { + email: 'test@example.com', + haveOverrideProp: false, + isBot: false, + }; + + beforeEach(() => { + mockWindowOpen.mockClear(); + }); + + test('should not render when email is empty', () => { + const props = { + ...baseProps, + email: '', + }; + const {container} = renderWithContext(); + expect(container.firstChild).toBeNull(); + }); + + test('should handle different email formats', () => { + const props = { + ...baseProps, + email: 'user.name+tag@domain.co.uk', + }; + renderWithContext(); + + const email = 'user.name+tag@domain.co.uk'; + const emailLink = screen.getByText(email); + expect(emailLink).toBeInTheDocument(); + expect(emailLink.tagName).toBe('A'); + }); + + test('should open email client when clicked', () => { + renderWithContext(); + + const email = 'test@example.com'; + const emailLink = screen.getByText(email); + + fireEvent.click(emailLink); + + expect(mockWindowOpen).toHaveBeenCalledWith('mailto:test@example.com'); + }); + + test('should prevent default click behavior', () => { + renderWithContext(); + + const email = 'test@example.com'; + const emailLink = screen.getByText(email); + + const clickEvent = fireEvent.click(emailLink); + + expect(clickEvent).toBe(false); // fireEvent.click returns false when preventDefault was called + expect(mockWindowOpen).toHaveBeenCalledWith('mailto:test@example.com'); + }); +}); diff --git a/webapp/channels/src/components/profile_popover/profile_popover_email.tsx b/webapp/channels/src/components/profile_popover/profile_popover_email.tsx index 3cbc1cfc01..1406bfec24 100644 --- a/webapp/channels/src/components/profile_popover/profile_popover_email.tsx +++ b/webapp/channels/src/components/profile_popover/profile_popover_email.tsx @@ -17,6 +17,11 @@ const ProfilePopoverEmail = ({ return null; } + function handleEmailClick(e: React.MouseEvent) { + e.preventDefault(); + window.open(`mailto:${email}`); + } + return (