GT2/Ejectable/node_modules/@react-navigation/native/lib/module/useLinkTo.js

42 lines
1.5 KiB
JavaScript
Raw Normal View History

2021-08-16 00:14:59 +00:00
import * as React from 'react';
import { getStateFromPath, getActionFromState, NavigationContext } from '@react-navigation/core';
import LinkingContext from './LinkingContext';
export default function useLinkTo() {
const navigation = React.useContext(NavigationContext);
const linking = React.useContext(LinkingContext);
const linkTo = React.useCallback(path => {
if (!path.startsWith('/')) {
throw new Error("The path must start with '/' (".concat(path, ")."));
}
if (navigation === undefined) {
throw new Error("Couldn't find a navigation object. Is your component inside a screen in a navigator?");
}
const {
options
} = linking;
const state = (options === null || options === void 0 ? void 0 : options.getStateFromPath) ? options.getStateFromPath(path, options.config) : getStateFromPath(path, options === null || options === void 0 ? void 0 : options.config);
if (state) {
let root = navigation;
let current; // Traverse up to get the root navigation
while (current = root.dangerouslyGetParent()) {
root = current;
}
const action = getActionFromState(state, options === null || options === void 0 ? void 0 : options.config);
if (action !== undefined) {
root.dispatch(action);
} else {
root.reset(state);
}
} else {
throw new Error('Failed to parse the path to a navigation state.');
}
}, [linking, navigation]);
return linkTo;
}
//# sourceMappingURL=useLinkTo.js.map