UNPKG

react-router-native

Version:

Declarative routing for React Native applications

1 lines 15.4 kB
{"version":3,"file":"index.js","sources":["../index.tsx"],"sourcesContent":["import * as React from \"react\";\nimport type {\n GestureResponderEvent,\n TouchableHighlightProps,\n} from \"react-native\";\nimport { BackHandler, Linking, TouchableHighlight } from \"react-native\";\nimport type {\n To,\n MemoryRouterProps,\n NavigateOptions,\n RelativeRoutingType,\n} from \"react-router\";\nimport { MemoryRouter, useLocation, useNavigate } from \"react-router\";\n\nimport URLSearchParams from \"@ungap/url-search-params\";\n\n////////////////////////////////////////////////////////////////////////////////\n// RE-EXPORTS\n////////////////////////////////////////////////////////////////////////////////\n\n// Note: Keep in sync with react-router exports!\nexport type {\n ActionFunction,\n ActionFunctionArgs,\n AwaitProps,\n Blocker,\n BlockerFunction,\n DataRouteMatch,\n DataRouteObject,\n unstable_DataStrategyFunction,\n unstable_DataStrategyFunctionArgs,\n unstable_DataStrategyMatch,\n ErrorResponse,\n Fetcher,\n FutureConfig,\n Hash,\n IndexRouteObject,\n IndexRouteProps,\n JsonFunction,\n LazyRouteFunction,\n LayoutRouteProps,\n LoaderFunction,\n LoaderFunctionArgs,\n Location,\n MemoryRouterProps,\n NavigateFunction,\n NavigateOptions,\n NavigateProps,\n Navigation,\n Navigator,\n NonIndexRouteObject,\n OutletProps,\n Params,\n ParamParseKey,\n Path,\n PathMatch,\n Pathname,\n PathParam,\n PathPattern,\n PathRouteProps,\n RedirectFunction,\n RelativeRoutingType,\n RouteMatch,\n RouteObject,\n RouteProps,\n RouterProps,\n RouterProviderProps,\n RoutesProps,\n Search,\n ShouldRevalidateFunction,\n ShouldRevalidateFunctionArgs,\n To,\n UIMatch,\n unstable_HandlerResult,\n} from \"react-router\";\nexport {\n AbortedDeferredError,\n Await,\n MemoryRouter,\n Navigate,\n NavigationType,\n Outlet,\n Route,\n Router,\n RouterProvider,\n Routes,\n createMemoryRouter,\n createPath,\n createRoutesFromChildren,\n createRoutesFromElements,\n defer,\n isRouteErrorResponse,\n generatePath,\n json,\n matchPath,\n matchRoutes,\n parsePath,\n redirect,\n redirectDocument,\n renderMatches,\n resolvePath,\n useActionData,\n useAsyncError,\n useAsyncValue,\n useBlocker,\n useHref,\n useInRouterContext,\n useLoaderData,\n useLocation,\n useMatch,\n useMatches,\n useNavigate,\n useNavigation,\n useNavigationType,\n useOutlet,\n useOutletContext,\n useParams,\n useResolvedPath,\n useRevalidator,\n useRouteError,\n useRouteLoaderData,\n useRoutes,\n} from \"react-router\";\n\n///////////////////////////////////////////////////////////////////////////////\n// DANGER! PLEASE READ ME!\n// We provide these exports as an escape hatch in the event that you need any\n// routing data that we don't provide an explicit API for. With that said, we\n// want to cover your use case if we can, so if you feel the need to use these\n// we want to hear from you. Let us know what you're building and we'll do our\n// best to make sure we can support you!\n//\n// We consider these exports an implementation detail and do not guarantee\n// against any breaking changes, regardless of the semver release. Use with\n// extreme caution and only if you understand the consequences. Godspeed.\n///////////////////////////////////////////////////////////////////////////////\n\n/** @internal */\nexport {\n UNSAFE_DataRouterContext,\n UNSAFE_DataRouterStateContext,\n UNSAFE_NavigationContext,\n UNSAFE_LocationContext,\n UNSAFE_RouteContext,\n UNSAFE_useRouteId,\n} from \"react-router\";\n\n////////////////////////////////////////////////////////////////////////////////\n// COMPONENTS\n////////////////////////////////////////////////////////////////////////////////\n\nexport interface NativeRouterProps extends MemoryRouterProps {}\n\n/**\n * A `<Router>` that runs on React Native.\n */\nexport function NativeRouter(props: NativeRouterProps) {\n return <MemoryRouter {...props} />;\n}\n\nexport interface LinkProps extends TouchableHighlightProps {\n children?: React.ReactNode;\n onPress?: (event: GestureResponderEvent) => void;\n relative?: RelativeRoutingType;\n replace?: boolean;\n state?: any;\n to: To;\n}\n\n/**\n * A `<TouchableHighlight>` that navigates to a different URL when touched.\n */\nexport function Link({\n onPress,\n relative,\n replace = false,\n state,\n to,\n ...rest\n}: LinkProps) {\n let internalOnPress = useLinkPressHandler(to, { replace, state, relative });\n function handlePress(event: GestureResponderEvent) {\n if (onPress) onPress(event);\n if (!event.defaultPrevented) {\n internalOnPress(event);\n }\n }\n\n return <TouchableHighlight {...rest} onPress={handlePress} />;\n}\n\n////////////////////////////////////////////////////////////////////////////////\n// HOOKS\n////////////////////////////////////////////////////////////////////////////////\n\nconst HardwareBackPressEventType = \"hardwareBackPress\";\nconst URLEventType = \"url\";\n\n/**\n * Handles the press behavior for router `<Link>` components. This is useful if\n * you need to create custom `<Link>` components with the same press behavior we\n * use in our exported `<Link>`.\n */\nexport function useLinkPressHandler(\n to: To,\n {\n replace,\n state,\n relative,\n }: {\n replace?: boolean;\n state?: any;\n relative?: RelativeRoutingType;\n } = {}\n): (event: GestureResponderEvent) => void {\n let navigate = useNavigate();\n return function handlePress() {\n navigate(to, { replace, state, relative });\n };\n}\n\n/**\n * Enables support for the hardware back button on Android.\n */\nexport function useHardwareBackButton() {\n React.useEffect(() => {\n function handleHardwardBackPress() {\n return undefined;\n // TODO: The implementation will be something like this\n // if (history.index === 0) {\n // return false; // home screen\n // } else {\n // history.back();\n // return true;\n // }\n }\n\n BackHandler.addEventListener(\n HardwareBackPressEventType,\n handleHardwardBackPress\n );\n\n return () => {\n BackHandler.removeEventListener(\n HardwareBackPressEventType,\n handleHardwardBackPress\n );\n };\n }, []);\n}\n\nexport { useHardwareBackButton as useAndroidBackButton };\n\n/**\n * Enables deep linking, both on the initial app launch and for\n * subsequent incoming links.\n */\nexport function useDeepLinking() {\n let navigate = useNavigate();\n\n // Get the initial URL\n React.useEffect(() => {\n let current = true;\n\n Linking.getInitialURL().then((url) => {\n if (current) {\n if (url) navigate(trimScheme(url));\n }\n });\n\n return () => {\n current = false;\n };\n }, [navigate]);\n\n // Listen for URL changes\n React.useEffect(() => {\n function handleURLChange(event: { url: string }) {\n navigate(trimScheme(event.url));\n }\n\n Linking.addEventListener(URLEventType, handleURLChange);\n\n return () => {\n Linking.removeEventListener(URLEventType, handleURLChange);\n };\n }, [navigate]);\n}\n\nfunction trimScheme(url: string) {\n return url.replace(/^.*?:\\/\\//, \"\");\n}\n\n/**\n * A convenient wrapper for accessing individual query parameters via the\n * URLSearchParams interface.\n */\nexport function useSearchParams(\n defaultInit?: URLSearchParamsInit\n): [URLSearchParams, SetURLSearchParams] {\n let defaultSearchParamsRef = React.useRef(createSearchParams(defaultInit));\n let hasSetSearchParamsRef = React.useRef(false);\n\n let location = useLocation();\n let searchParams = React.useMemo(() => {\n let searchParams = createSearchParams(location.search);\n\n if (!hasSetSearchParamsRef.current) {\n for (let key of defaultSearchParamsRef.current.keys()) {\n if (!searchParams.has(key)) {\n defaultSearchParamsRef.current.getAll(key).forEach((value) => {\n searchParams.append(key, value);\n });\n }\n }\n }\n\n return searchParams;\n }, [location.search]);\n\n let navigate = useNavigate();\n let setSearchParams = React.useCallback<SetURLSearchParams>(\n (nextInit, navigateOpts) => {\n const newSearchParams = createSearchParams(\n typeof nextInit === \"function\" ? nextInit(searchParams) : nextInit\n );\n hasSetSearchParamsRef.current = true;\n navigate(\"?\" + newSearchParams, navigateOpts);\n },\n [navigate, searchParams]\n );\n\n return [searchParams, setSearchParams];\n}\n\nexport type SetURLSearchParams = (\n nextInit?:\n | URLSearchParamsInit\n | ((prev: URLSearchParams) => URLSearchParamsInit),\n navigateOpts?: NavigateOptions\n) => void;\n\nexport type ParamKeyValuePair = [string, string];\n\nexport type URLSearchParamsInit =\n | string\n | ParamKeyValuePair[]\n | Record<string, string | string[]>\n | URLSearchParams;\n\n/**\n * Creates a URLSearchParams object using the given initializer.\n *\n * This is identical to `new URLSearchParams(init)` except it also\n * supports arrays as values in the object form of the initializer\n * instead of just strings. This is convenient when you need multiple\n * values for a given key, but don't want to use an array initializer.\n *\n * For example, instead of:\n *\n * let searchParams = new URLSearchParams([\n * ['sort', 'name'],\n * ['sort', 'price']\n * ]);\n *\n * you can do:\n *\n * let searchParams = createSearchParams({\n * sort: ['name', 'price']\n * });\n */\nexport function createSearchParams(\n init: URLSearchParamsInit = \"\"\n): URLSearchParams {\n return new URLSearchParams(\n typeof init === \"string\" ||\n Array.isArray(init) ||\n init instanceof URLSearchParams\n ? init\n : Object.keys(init).reduce((memo, key) => {\n let value = init[key];\n return memo.concat(\n Array.isArray(value) ? value.map((v) => [key, v]) : [[key, value]]\n );\n }, [] as ParamKeyValuePair[])\n );\n}\n"],"names":["NativeRouter","props","React","createElement","MemoryRouter","Object","assign","Link","_ref","onPress","relative","_ref$replace","replace","state","to","rest","_objectWithoutProperties","_excluded","internalOnPress","useLinkPressHandler","handlePress","event","defaultPrevented","TouchableHighlight","HardwareBackPressEventType","URLEventType","_ref2","arguments","length","undefined","navigate","useNavigate","useHardwareBackButton","useEffect","handleHardwardBackPress","BackHandler","addEventListener","removeEventListener","useDeepLinking","current","Linking","getInitialURL","then","url","trimScheme","handleURLChange","useSearchParams","defaultInit","defaultSearchParamsRef","useRef","createSearchParams","hasSetSearchParamsRef","location","useLocation","searchParams","useMemo","search","_loop","key","has","getAll","forEach","value","append","keys","setSearchParams","useCallback","nextInit","navigateOpts","newSearchParams","init","URLSearchParams","Array","isArray","reduce","memo","concat","map","v"],"mappings":"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"}