Skip to content

Commit 521c0c2

Browse files
authored
Remove wrong shouldIntercept() call in keydown event handler in <Link> component (#2638)
* Remove wrong `shouldIntercept()` call in `keydown` event handler in `<Link>` component * Update navigationEvents.ts * Update navigationEvents.ts
1 parent bb270bb commit 521c0c2

File tree

4 files changed

+37
-32
lines changed

4 files changed

+37
-32
lines changed
Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,24 @@
1+
type MouseNavigationEvent = Pick<
2+
MouseEvent,
3+
'altKey' | 'ctrlKey' | 'shiftKey' | 'metaKey' | 'button' | 'currentTarget' | 'defaultPrevented' | 'target'
4+
>
5+
6+
type KeyboardNavigationEvent = Pick<KeyboardEvent, 'currentTarget' | 'defaultPrevented' | 'key' | 'target'>
7+
8+
function isContentEditableOrPrevented(event: KeyboardNavigationEvent | MouseNavigationEvent): boolean {
9+
return (event.target instanceof HTMLElement && event.target.isContentEditable) || event.defaultPrevented
10+
}
11+
112
/**
213
* Determine if this mouse event should be intercepted for navigation purposes.
314
* Links with modifier keys or non-left clicks should not be intercepted.
415
* Content editable elements and prevented events are ignored.
516
*/
6-
export function shouldIntercept(
7-
event: Pick<
8-
MouseEvent,
9-
'altKey' | 'ctrlKey' | 'defaultPrevented' | 'target' | 'currentTarget' | 'metaKey' | 'shiftKey' | 'button'
10-
>,
11-
): boolean {
17+
export function shouldIntercept(event: MouseNavigationEvent): boolean {
1218
const isLink = (event.currentTarget as HTMLElement).tagName.toLowerCase() === 'a'
1319

1420
return !(
15-
(event.target && (event?.target as HTMLElement).isContentEditable) ||
16-
event.defaultPrevented ||
21+
isContentEditableOrPrevented(event) ||
1722
(isLink && event.altKey) ||
1823
(isLink && event.ctrlKey) ||
1924
(isLink && event.metaKey) ||
@@ -27,8 +32,8 @@ export function shouldIntercept(
2732
* Enter triggers navigation for both links and buttons currently.
2833
* Space only triggers navigation for buttons specifically.
2934
*/
30-
export function shouldNavigate(event: Pick<KeyboardEvent, 'key' | 'currentTarget'>): boolean {
35+
export function shouldNavigate(event: KeyboardNavigationEvent): boolean {
3136
const isButton = (event.currentTarget as HTMLElement).tagName.toLowerCase() === 'button'
3237

33-
return event.key === 'Enter' || (isButton && event.key === ' ')
38+
return !isContentEditableOrPrevented(event) && (event.key === 'Enter' || (isButton && event.key === ' '))
3439
}

packages/react/src/Link.ts

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ const noop = () => undefined
1616

1717
interface BaseInertiaLinkProps extends LinkComponentBaseProps {
1818
as?: ElementType
19-
onClick?: (event: React.MouseEvent<Element>) => void
19+
onClick?: (event: React.MouseEvent) => void
2020
}
2121

2222
export type InertiaLinkProps = BaseInertiaLinkProps &
@@ -181,7 +181,7 @@ const Link = forwardRef<unknown, InertiaLinkProps>(
181181
}, prefetchModes)
182182

183183
const regularEvents = {
184-
onClick: (event) => {
184+
onClick: (event: React.MouseEvent) => {
185185
onClick(event)
186186

187187
if (shouldIntercept(event)) {
@@ -205,29 +205,29 @@ const Link = forwardRef<unknown, InertiaLinkProps>(
205205
}
206206

207207
const prefetchClickEvents = {
208-
onMouseDown: (event) => {
208+
onMouseDown: (event: React.MouseEvent) => {
209209
if (shouldIntercept(event)) {
210210
event.preventDefault()
211211
doPrefetch()
212212
}
213213
},
214-
onKeyDown: (event) => {
215-
if (shouldIntercept(event) && shouldNavigate(event)) {
214+
onKeyDown: (event: React.KeyboardEvent) => {
215+
if (shouldNavigate(event)) {
216216
event.preventDefault()
217217
doPrefetch()
218218
}
219219
},
220-
onMouseUp: (event) => {
220+
onMouseUp: (event: React.MouseEvent) => {
221221
event.preventDefault()
222222
router.visit(url, visitParams)
223223
},
224-
onKeyUp: (event) => {
224+
onKeyUp: (event: React.KeyboardEvent) => {
225225
if (shouldNavigate(event)) {
226226
event.preventDefault()
227227
router.visit(url, visitParams)
228228
}
229229
},
230-
onClick: (event) => {
230+
onClick: (event: React.MouseEvent) => {
231231
onClick(event)
232232

233233
if (shouldIntercept(event)) {

packages/svelte/src/link.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ function link(
6262
let visitParams: VisitOptions
6363

6464
const regularEvents: ActionEventHandlers = {
65-
click: (event) => {
65+
click: (event: MouseEvent) => {
6666
if (shouldIntercept(event)) {
6767
event.preventDefault()
6868
router.visit(href, visitParams)
@@ -77,29 +77,29 @@ function link(
7777
}
7878

7979
const prefetchClickEvents: ActionEventHandlers = {
80-
mousedown: (event) => {
80+
mousedown: (event: MouseEvent) => {
8181
if (shouldIntercept(event)) {
8282
event.preventDefault()
8383
prefetch()
8484
}
8585
},
86-
keydown: (event) => {
87-
if (shouldIntercept(event) && shouldNavigate(event)) {
86+
keydown: (event: KeyboardEvent) => {
87+
if (shouldNavigate(event)) {
8888
event.preventDefault()
8989
prefetch()
9090
}
9191
},
92-
mouseup: (event) => {
92+
mouseup: (event: MouseEvent) => {
9393
event.preventDefault()
9494
router.visit(href, visitParams)
9595
},
96-
keyup: (event) => {
96+
keyup: (event: KeyboardEvent) => {
9797
if (shouldNavigate(event)) {
9898
event.preventDefault()
9999
router.visit(href, visitParams)
100100
}
101101
},
102-
click: (event) => {
102+
click: (event: MouseEvent) => {
103103
if (shouldIntercept(event)) {
104104
// Let the mouseup/keyup event handle the visit
105105
event.preventDefault()

packages/vue3/src/link.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -258,7 +258,7 @@ const Link: InertiaLink = defineComponent({
258258
}
259259

260260
const regularEvents = {
261-
onClick: (event) => {
261+
onClick: (event: MouseEvent) => {
262262
if (shouldIntercept(event)) {
263263
event.preventDefault()
264264
router.visit(href.value, visitParams.value)
@@ -279,29 +279,29 @@ const Link: InertiaLink = defineComponent({
279279
}
280280

281281
const prefetchClickEvents = {
282-
onMousedown: (event) => {
282+
onMousedown: (event: MouseEvent) => {
283283
if (shouldIntercept(event)) {
284284
event.preventDefault()
285285
prefetch()
286286
}
287287
},
288-
onKeydown: (event) => {
289-
if (shouldIntercept(event) && shouldNavigate(event)) {
288+
onKeydown: (event: KeyboardEvent) => {
289+
if (shouldNavigate(event)) {
290290
event.preventDefault()
291291
prefetch()
292292
}
293293
},
294-
onMouseup: (event) => {
294+
onMouseup: (event: MouseEvent) => {
295295
event.preventDefault()
296296
router.visit(href.value, visitParams.value)
297297
},
298-
onKeyup: (event) => {
298+
onKeyup: (event: KeyboardEvent) => {
299299
if (shouldNavigate(event)) {
300300
event.preventDefault()
301301
router.visit(href.value, visitParams.value)
302302
}
303303
},
304-
onClick: (event) => {
304+
onClick: (event: MouseEvent) => {
305305
if (shouldIntercept(event)) {
306306
// Let the mouseup/keyup event handle the visit
307307
event.preventDefault()

0 commit comments

Comments
 (0)