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