UNPKG

12.8 kBSource Map (JSON)View Raw
1{"version":3,"names":["getActionFromState","getActionFromStateDefault","getStateFromPath","getStateFromPathDefault","React","Linking","Platform","extractPathFromURL","linkingHandlers","useLinking","ref","independent","enabled","prefixes","filter","config","getInitialURL","Promise","race","resolve","setTimeout","subscribe","listener","callback","url","subscription","addEventListener","removeEventListener","bind","remove","useEffect","process","env","NODE_ENV","undefined","length","console","error","OS","join","trim","handler","Symbol","push","index","indexOf","splice","enabledRef","useRef","prefixesRef","filterRef","configRef","getInitialURLRef","getStateFromPathRef","getActionFromStateRef","current","getStateFromURL","useCallback","path","getInitialState","state","then","thenable","onfulfilled","catch","navigation","rootState","getRootState","routes","some","r","routeNames","includes","name","warn","action","dispatch","e","message","resetRoot"],"sources":["useLinking.native.tsx"],"sourcesContent":["import {\n getActionFromState as getActionFromStateDefault,\n getStateFromPath as getStateFromPathDefault,\n NavigationContainerRef,\n ParamListBase,\n} from '@react-navigation/core';\nimport * as React from 'react';\nimport { Linking, Platform } from 'react-native';\n\nimport extractPathFromURL from './extractPathFromURL';\nimport type { LinkingOptions } from './types';\n\ntype ResultState = ReturnType<typeof getStateFromPathDefault>;\n\ntype Options = LinkingOptions<ParamListBase> & {\n independent?: boolean;\n};\n\nlet linkingHandlers: Symbol[] = [];\n\nexport default function useLinking(\n ref: React.RefObject<NavigationContainerRef<ParamListBase>>,\n {\n independent,\n enabled = true,\n prefixes,\n filter,\n config,\n getInitialURL = () =>\n Promise.race([\n Linking.getInitialURL(),\n new Promise<undefined>((resolve) =>\n // Timeout in 150ms if `getInitialState` doesn't resolve\n // Workaround for https://github.com/facebook/react-native/issues/25675\n setTimeout(resolve, 150)\n ),\n ]),\n subscribe = (listener) => {\n const callback = ({ url }: { url: string }) => listener(url);\n\n const subscription = Linking.addEventListener('url', callback) as\n | { remove(): void }\n | undefined;\n\n // Storing this in a local variable stops Jest from complaining about import after teardown\n const removeEventListener = Linking.removeEventListener?.bind(Linking);\n\n return () => {\n // https://github.com/facebook/react-native/commit/6d1aca806cee86ad76de771ed3a1cc62982ebcd7\n if (subscription?.remove) {\n subscription.remove();\n } else {\n removeEventListener?.('url', callback);\n }\n };\n },\n getStateFromPath = getStateFromPathDefault,\n getActionFromState = getActionFromStateDefault,\n }: Options\n) {\n React.useEffect(() => {\n if (process.env.NODE_ENV === 'production') {\n return undefined;\n }\n\n if (independent) {\n return undefined;\n }\n\n if (enabled !== false && linkingHandlers.length) {\n console.error(\n [\n 'Looks like you have configured linking in multiple places. This is likely an error since deep links should only be handled in one place to avoid conflicts. Make sure that:',\n \"- You don't have multiple NavigationContainers in the app each with 'linking' enabled\",\n '- Only a single instance of the root component is rendered',\n Platform.OS === 'android'\n ? \"- You have set 'android:launchMode=singleTask' in the '<activity />' section of the 'AndroidManifest.xml' file to avoid launching multiple instances\"\n : '',\n ]\n .join('\\n')\n .trim()\n );\n }\n\n const handler = Symbol();\n\n if (enabled !== false) {\n linkingHandlers.push(handler);\n }\n\n return () => {\n const index = linkingHandlers.indexOf(handler);\n\n if (index > -1) {\n linkingHandlers.splice(index, 1);\n }\n };\n }, [enabled, independent]);\n\n // We store these options in ref to avoid re-creating getInitialState and re-subscribing listeners\n // This lets user avoid wrapping the items in `React.useCallback` or `React.useMemo`\n // Not re-creating `getInitialState` is important coz it makes it easier for the user to use in an effect\n const enabledRef = React.useRef(enabled);\n const prefixesRef = React.useRef(prefixes);\n const filterRef = React.useRef(filter);\n const configRef = React.useRef(config);\n const getInitialURLRef = React.useRef(getInitialURL);\n const getStateFromPathRef = React.useRef(getStateFromPath);\n const getActionFromStateRef = React.useRef(getActionFromState);\n\n React.useEffect(() => {\n enabledRef.current = enabled;\n prefixesRef.current = prefixes;\n filterRef.current = filter;\n configRef.current = config;\n getInitialURLRef.current = getInitialURL;\n getStateFromPathRef.current = getStateFromPath;\n getActionFromStateRef.current = getActionFromState;\n });\n\n const getStateFromURL = React.useCallback(\n (url: string | null | undefined) => {\n if (!url || (filterRef.current && !filterRef.current(url))) {\n return undefined;\n }\n\n const path = extractPathFromURL(prefixesRef.current, url);\n\n return path !== undefined\n ? getStateFromPathRef.current(path, configRef.current)\n : undefined;\n },\n []\n );\n\n const getInitialState = React.useCallback(() => {\n let state: ResultState | undefined;\n\n if (enabledRef.current) {\n const url = getInitialURLRef.current();\n\n if (url != null && typeof url !== 'string') {\n return url.then((url) => {\n const state = getStateFromURL(url);\n\n return state;\n });\n }\n\n state = getStateFromURL(url);\n }\n\n const thenable = {\n then(onfulfilled?: (state: ResultState | undefined) => void) {\n return Promise.resolve(onfulfilled ? onfulfilled(state) : state);\n },\n catch() {\n return thenable;\n },\n };\n\n return thenable as PromiseLike<ResultState | undefined>;\n }, [getStateFromURL]);\n\n React.useEffect(() => {\n const listener = (url: string) => {\n if (!enabled) {\n return;\n }\n\n const navigation = ref.current;\n const state = navigation ? getStateFromURL(url) : undefined;\n\n if (navigation && state) {\n // Make sure that the routes in the state exist in the root navigator\n // Otherwise there's an error in the linking configuration\n const rootState = navigation.getRootState();\n\n if (state.routes.some((r) => !rootState?.routeNames.includes(r.name))) {\n console.warn(\n \"The navigation state parsed from the URL contains routes not present in the root navigator. This usually means that the linking configuration doesn't match the navigation structure. See https://reactnavigation.org/docs/configuring-links for more details on how to specify a linking configuration.\"\n );\n return;\n }\n\n const action = getActionFromStateRef.current(state, configRef.current);\n\n if (action !== undefined) {\n try {\n navigation.dispatch(action);\n } catch (e) {\n // Ignore any errors from deep linking.\n // This could happen in case of malformed links, navigation object not being initialized etc.\n console.warn(\n `An error occurred when trying to handle the link '${url}': ${\n typeof e === 'object' && e != null && 'message' in e\n ? // @ts-expect-error: we're already checking for this\n e.message\n : e\n }`\n );\n }\n } else {\n navigation.resetRoot(state);\n }\n }\n };\n\n return subscribe(listener);\n }, [enabled, getStateFromURL, ref, subscribe]);\n\n return {\n getInitialState,\n };\n}\n"],"mappings":"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"}
\No newline at end of file