UNPKG

11.4 kBSource Map (JSON)View Raw
1{"version":3,"sources":["useLinking.native.tsx"],"names":["isUsingLinking","useLinking","ref","independent","enabled","prefixes","filter","config","getInitialURL","Promise","race","Linking","resolve","setTimeout","subscribe","listener","callback","url","subscription","addEventListener","remove","removeEventListener","getStateFromPath","getStateFromPathDefault","getActionFromState","getActionFromStateDefault","React","useEffect","undefined","Error","Platform","OS","join","trim","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","console","warn","action","dispatch","e","message","resetRoot"],"mappings":"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","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 isUsingLinking = false;\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 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 }: Options\n) {\n React.useEffect(() => {\n if (independent) {\n return undefined;\n }\n\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 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\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}': ${e.message}`\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"]}
\No newline at end of file