1import * as React from 'react';
2import { GestureResponderEvent, Platform } from 'react-native';
3
4import { useExpoRouter } from '../global-state/router-store';
5import { stripGroupSegmentsFromPath } from '../matchers';
6
7function eventShouldPreventDefault(
8  e: React.MouseEvent<HTMLAnchorElement, MouseEvent> | GestureResponderEvent
9): boolean {
10  if (e?.defaultPrevented) {
11    return false;
12  }
13
14  if (
15    // Only check MouseEvents
16    'button' in e &&
17    // ignore clicks with modifier keys
18    !e.metaKey &&
19    !e.altKey &&
20    !e.ctrlKey &&
21    !e.shiftKey &&
22    (e.button == null || e.button === 0) && // Only accept left clicks
23    [undefined, null, '', 'self'].includes(e.currentTarget.target) // let browser handle "target=_blank" etc.
24  ) {
25    return true;
26  }
27
28  return false;
29}
30
31export default function useLinkToPathProps(props: { href: string; replace?: boolean }) {
32  const { linkTo } = useExpoRouter();
33
34  const onPress = (e?: React.MouseEvent<HTMLAnchorElement, MouseEvent> | GestureResponderEvent) => {
35    let shouldHandle = false;
36
37    if (Platform.OS !== 'web' || !e) {
38      shouldHandle = e ? !e.defaultPrevented : true;
39    } else if (eventShouldPreventDefault(e)) {
40      e.preventDefault();
41      shouldHandle = true;
42    }
43
44    if (shouldHandle) {
45      linkTo(props.href, props.replace ? 'REPLACE' : undefined);
46    }
47  };
48
49  return {
50    // Ensure there's always a value for href
51    href: stripGroupSegmentsFromPath(props.href) || '/',
52    role: 'link' as const,
53    onPress,
54  };
55}
56