Skip to content

Commit f694e45

Browse files
committed
Link: Honor openInNewTab consistently
1 parent 7e20b84 commit f694e45

3 files changed

Lines changed: 19 additions & 53 deletions

File tree

packages/ui/src/link/link.tsx

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -20,20 +20,10 @@ export const Link = forwardRef< HTMLAnchorElement, LinkProps >( function Link(
2020
openInNewTab = false,
2121
render,
2222
className,
23-
onClick,
2423
...props
2524
},
2625
ref
2726
) {
28-
const isInternalAnchor = !! props.href?.startsWith( '#' );
29-
30-
const handleClick = ( event: React.MouseEvent< HTMLAnchorElement > ) => {
31-
if ( openInNewTab && isInternalAnchor ) {
32-
event.preventDefault();
33-
}
34-
onClick?.( event );
35-
};
36-
3727
const element = useRender( {
3828
render,
3929
defaultTagName: 'a',
@@ -49,7 +39,6 @@ export const Link = forwardRef< HTMLAnchorElement, LinkProps >( function Link(
4939
openInNewTab && styles[ 'has-link-icon' ],
5040
className
5141
),
52-
onClick: handleClick,
5342
target: openInNewTab ? '_blank' : undefined,
5443
children: openInNewTab ? (
5544
<>

packages/ui/src/link/test/index.test.tsx

Lines changed: 18 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,24 @@ describe( 'Link', () => {
1616
expect( ref.current ).toBeInstanceOf( HTMLAnchorElement );
1717
} );
1818

19+
it( 'calls onClick when clicked', async () => {
20+
const user = userEvent.setup();
21+
const onClick = jest.fn(
22+
( event: React.MouseEvent< HTMLAnchorElement > ) =>
23+
event.preventDefault()
24+
);
25+
26+
render(
27+
<Link href="/page" onClick={ onClick }>
28+
Go to page
29+
</Link>
30+
);
31+
32+
await user.click( screen.getByRole( 'link', { name: 'Go to page' } ) );
33+
34+
expect( onClick ).toHaveBeenCalledTimes( 1 );
35+
} );
36+
1937
describe( 'openInNewTab', () => {
2038
it( 'sets target="_blank" when true', () => {
2139
render(
@@ -49,45 +67,5 @@ describe( 'Link', () => {
4967
screen.getByLabelText( '(opens in a new tab)' )
5068
).toBeInTheDocument();
5169
} );
52-
53-
it( 'prevents default for internal anchor links', async () => {
54-
const user = userEvent.setup();
55-
const onClick = jest.fn();
56-
57-
render(
58-
<Link href="#section" openInNewTab onClick={ onClick }>
59-
Jump
60-
</Link>
61-
);
62-
63-
await user.click( screen.getByRole( 'link' ) );
64-
65-
expect( onClick ).toHaveBeenCalledTimes( 1 );
66-
expect( onClick.mock.calls[ 0 ][ 0 ].defaultPrevented ).toBe(
67-
true
68-
);
69-
} );
70-
71-
it( 'does not prevent default for external links', async () => {
72-
const user = userEvent.setup();
73-
const onClick = jest.fn();
74-
75-
render(
76-
<Link
77-
href="https://example.com"
78-
openInNewTab
79-
onClick={ onClick }
80-
>
81-
External
82-
</Link>
83-
);
84-
85-
await user.click( screen.getByRole( 'link' ) );
86-
87-
expect( onClick ).toHaveBeenCalledTimes( 1 );
88-
expect( onClick.mock.calls[ 0 ][ 0 ].defaultPrevented ).toBe(
89-
false
90-
);
91-
} );
9270
} );
9371
} );

packages/ui/src/link/types.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,7 @@ export interface LinkProps extends Omit< ComponentProps< 'a' >, 'target' > {
2222

2323
/**
2424
* Whether to open the link in a new browser tab.
25-
* When true, sets `target="_blank"`, appends a visual arrow indicator,
26-
* and prevents navigation for internal anchors (`#`-prefixed hrefs).
25+
* When true, sets `target="_blank"` and appends a visual arrow indicator.
2726
*
2827
* @default false
2928
*/

0 commit comments

Comments
 (0)