UNPKG

11.2 kBSource Map (JSON)View Raw
1{"version":3,"sources":["useLinking.native.tsx"],"names":["React","Linking","Platform","getActionFromState","getActionFromStateDefault","getStateFromPath","getStateFromPathDefault","extractPathFromURL","isUsingLinking","useLinking","ref","enabled","prefixes","config","getInitialURL","Promise","race","resolve","setTimeout","subscribe","listener","callback","url","subscription","addEventListener","remove","removeEventListener","useEffect","Error","OS","join","trim","enabledRef","useRef","prefixesRef","configRef","getInitialURLRef","getStateFromPathRef","getActionFromStateRef","current","getInitialState","useCallback","state","then","path","undefined","thenable","onfulfilled","catch","navigation","rootState","getRootState","routes","some","r","routeNames","includes","name","console","warn","action","dispatch","e","message","resetRoot"],"mappings":"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","sourcesContent":["import * as React from 'react';\nimport { Linking, Platform } from 'react-native';\nimport {\n getActionFromState as getActionFromStateDefault,\n getStateFromPath as getStateFromPathDefault,\n NavigationContainerRef,\n} from '@react-navigation/core';\nimport extractPathFromURL from './extractPathFromURL';\nimport type { LinkingOptions } from './types';\n\ntype ResultState = ReturnType<typeof getStateFromPathDefault>;\n\nlet isUsingLinking = false;\n\nexport default function useLinking(\n ref: React.RefObject<NavigationContainerRef>,\n {\n enabled = true,\n prefixes,\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 return () => {\n // https://github.com/facebook/react-native/commit/6d1aca806cee86ad76de771ed3a1cc62982ebcd7\n if (subscription?.remove) {\n subscription.remove();\n } else {\n Linking.removeEventListener('url', callback);\n }\n };\n },\n getStateFromPath = getStateFromPathDefault,\n getActionFromState = getActionFromStateDefault,\n }: LinkingOptions\n) {\n React.useEffect(() => {\n if (enabled !== false && isUsingLinking) {\n throw new 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 are not using both 'linking' prop and 'useLinking'\",\n \"- You don't have 'useLinking' in multiple components\",\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 } else {\n isUsingLinking = enabled !== false;\n }\n\n return () => {\n isUsingLinking = false;\n };\n });\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 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 configRef.current = config;\n getInitialURLRef.current = getInitialURL;\n getStateFromPathRef.current = getStateFromPath;\n getActionFromStateRef.current = getActionFromState;\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 path = url\n ? extractPathFromURL(prefixesRef.current, url)\n : null;\n\n return path\n ? getStateFromPathRef.current(path, configRef.current)\n : undefined;\n });\n }\n\n const path = url ? extractPathFromURL(prefixesRef.current, url) : null;\n\n state = path\n ? getStateFromPathRef.current(path, configRef.current)\n : undefined;\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 }, []);\n\n React.useEffect(() => {\n const listener = (url: string) => {\n if (!enabled) {\n return;\n }\n\n const path = extractPathFromURL(prefixesRef.current, url);\n const navigation = ref.current;\n\n if (navigation && path) {\n const state = getStateFromPathRef.current(path, configRef.current);\n\n if (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 (\n state.routes.some((r) => !rootState?.routeNames.includes(r.name))\n ) {\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(\n state,\n configRef.current\n );\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 '${path}': ${e.message}`\n );\n }\n } else {\n navigation.resetRoot(state);\n }\n }\n }\n };\n\n return subscribe(listener);\n }, [enabled, ref, subscribe]);\n\n return {\n getInitialState,\n };\n}\n"]}
\No newline at end of file