UNPKG

5.3 kBJavaScriptView Raw
1"use strict";
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6exports.default = useDescriptors;
7
8var React = _interopRequireWildcard(require("react"));
9
10var _NavigationBuilderContext = _interopRequireDefault(require("./NavigationBuilderContext"));
11
12var _NavigationContext = _interopRequireDefault(require("./NavigationContext"));
13
14var _NavigationRouteContext = _interopRequireDefault(require("./NavigationRouteContext"));
15
16var _SceneView = _interopRequireDefault(require("./SceneView"));
17
18var _useNavigationCache = _interopRequireDefault(require("./useNavigationCache"));
19
20var _useRouteCache = _interopRequireDefault(require("./useRouteCache"));
21
22function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
23
24function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
25
26function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
27
28/**
29 * Hook to create descriptor objects for the child routes.
30 *
31 * A descriptor object provides 3 things:
32 * - Helper method to render a screen
33 * - Options specified by the screen for the navigator
34 * - Navigation object intended for the route
35 */
36function useDescriptors(_ref) {
37 let {
38 state,
39 screens,
40 navigation,
41 screenOptions,
42 defaultScreenOptions,
43 onAction,
44 getState,
45 setState,
46 addListener,
47 addKeyedListener,
48 onRouteFocus,
49 router,
50 emitter
51 } = _ref;
52 const [options, setOptions] = React.useState({});
53 const {
54 onDispatchAction,
55 onOptionsChange,
56 stackRef
57 } = React.useContext(_NavigationBuilderContext.default);
58 const context = React.useMemo(() => ({
59 navigation,
60 onAction,
61 addListener,
62 addKeyedListener,
63 onRouteFocus,
64 onDispatchAction,
65 onOptionsChange,
66 stackRef
67 }), [navigation, onAction, addListener, addKeyedListener, onRouteFocus, onDispatchAction, onOptionsChange, stackRef]);
68 const navigations = (0, _useNavigationCache.default)({
69 state,
70 getState,
71 navigation,
72 setOptions,
73 router,
74 emitter
75 });
76 const routes = (0, _useRouteCache.default)(state.routes);
77 return routes.reduce((acc, route, i) => {
78 const config = screens[route.name];
79 const screen = config.props;
80 const navigation = navigations[route.key];
81 const optionsList = [// The default `screenOptions` passed to the navigator
82 screenOptions, // The `screenOptions` props passed to `Group` elements
83 ...(config.options ? config.options.filter(Boolean) : []), // The `options` prop passed to `Screen` elements,
84 screen.options, // The options set via `navigation.setOptions`
85 options[route.key]];
86 const customOptions = optionsList.reduce((acc, curr) => Object.assign(acc, typeof curr !== 'function' ? curr : curr({
87 route,
88 navigation
89 })), {});
90 const mergedOptions = { ...(typeof defaultScreenOptions === 'function' ? // @ts-expect-error: ts gives incorrect error here
91 defaultScreenOptions({
92 route,
93 navigation,
94 options: customOptions
95 }) : defaultScreenOptions),
96 ...customOptions
97 };
98
99 const clearOptions = () => setOptions(o => {
100 if (route.key in o) {
101 // eslint-disable-next-line @typescript-eslint/no-unused-vars
102 const {
103 [route.key]: _,
104 ...rest
105 } = o;
106 return rest;
107 }
108
109 return o;
110 });
111
112 acc[route.key] = {
113 route,
114 // @ts-expect-error: it's missing action helpers, fix later
115 navigation,
116
117 render() {
118 return /*#__PURE__*/React.createElement(_NavigationBuilderContext.default.Provider, {
119 key: route.key,
120 value: context
121 }, /*#__PURE__*/React.createElement(_NavigationContext.default.Provider, {
122 value: navigation
123 }, /*#__PURE__*/React.createElement(_NavigationRouteContext.default.Provider, {
124 value: route
125 }, /*#__PURE__*/React.createElement(_SceneView.default, {
126 navigation: navigation,
127 route: route,
128 screen: screen,
129 routeState: state.routes[i].state,
130 getState: getState,
131 setState: setState,
132 options: mergedOptions,
133 clearOptions: clearOptions
134 }))));
135 },
136
137 options: mergedOptions
138 };
139 return acc;
140 }, {});
141}
142//# sourceMappingURL=useDescriptors.js.map
\No newline at end of file