1"use strict"; 2var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { 3 if (k2 === undefined) k2 = k; 4 var desc = Object.getOwnPropertyDescriptor(m, k); 5 if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { 6 desc = { enumerable: true, get: function() { return m[k]; } }; 7 } 8 Object.defineProperty(o, k2, desc); 9}) : (function(o, m, k, k2) { 10 if (k2 === undefined) k2 = k; 11 o[k2] = m[k]; 12})); 13var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { 14 Object.defineProperty(o, "default", { enumerable: true, value: v }); 15}) : function(o, v) { 16 o["default"] = v; 17}); 18var __importStar = (this && this.__importStar) || function (mod) { 19 if (mod && mod.__esModule) return mod; 20 var result = {}; 21 if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); 22 __setModuleDefault(result, mod); 23 return result; 24}; 25Object.defineProperty(exports, "__esModule", { value: true }); 26exports.DefaultNavigator = exports.QualifiedSlot = exports.Slot = exports.useSlot = exports.useNavigatorContext = exports.Navigator = exports.NavigatorContext = void 0; 27const native_1 = require("@react-navigation/native"); 28const React = __importStar(require("react")); 29const react_native_safe_area_context_1 = require("react-native-safe-area-context"); 30const Screen_1 = require("./Screen"); 31const Route_1 = require("../Route"); 32const withLayoutContext_1 = require("../layouts/withLayoutContext"); 33const useScreens_1 = require("../useScreens"); 34// TODO: This might already exist upstream, maybe something like `useCurrentRender` ? 35exports.NavigatorContext = React.createContext(null); 36if (process.env.NODE_ENV !== 'production') { 37 exports.NavigatorContext.displayName = 'NavigatorContext'; 38} 39/** An unstyled custom navigator. Good for basic web layouts */ 40function Navigator({ initialRouteName, screenOptions, children, router }) { 41 const contextKey = (0, Route_1.useContextKey)(); 42 // Allows adding Screen components as children to configure routes. 43 const { screens, children: otherSlot } = (0, withLayoutContext_1.useFilterScreenChildren)(children, { 44 isCustomNavigator: true, 45 contextKey, 46 }); 47 const sorted = (0, useScreens_1.useSortedScreens)(screens ?? []); 48 if (!sorted.length) { 49 console.warn(`Navigator at "${contextKey}" has no children.`); 50 return null; 51 } 52 return (React.createElement(QualifiedNavigator, { initialRouteName: initialRouteName, screenOptions: screenOptions, screens: sorted, contextKey: contextKey, router: router }, otherSlot)); 53} 54exports.Navigator = Navigator; 55function QualifiedNavigator({ initialRouteName, screenOptions, children, screens, contextKey, router = native_1.StackRouter, }) { 56 const { state, navigation, descriptors, NavigationContent } = (0, native_1.useNavigationBuilder)(router, { 57 // Used for getting the parent with navigation.getParent('/normalized/path') 58 id: contextKey, 59 children: screens, 60 screenOptions, 61 initialRouteName, 62 }); 63 return (React.createElement(exports.NavigatorContext.Provider, { value: { 64 contextKey, 65 state, 66 navigation, 67 descriptors, 68 router, 69 } }, 70 React.createElement(NavigationContent, null, children))); 71} 72function useNavigatorContext() { 73 const context = React.useContext(exports.NavigatorContext); 74 if (!context) { 75 throw new Error('useNavigatorContext must be used within a <Navigator />'); 76 } 77 return context; 78} 79exports.useNavigatorContext = useNavigatorContext; 80function useSlot() { 81 const context = useNavigatorContext(); 82 const { state, descriptors } = context; 83 const current = state.routes.find((route, i) => { 84 return state.index === i; 85 }); 86 if (!current) { 87 return null; 88 } 89 return descriptors[current.key]?.render() ?? null; 90} 91exports.useSlot = useSlot; 92/** Renders the currently selected content. */ 93function Slot(props) { 94 const contextKey = (0, Route_1.useContextKey)(); 95 const context = React.useContext(exports.NavigatorContext); 96 // Ensure the context is for the current contextKey 97 if (context?.contextKey !== contextKey) { 98 // Qualify the content and re-export. 99 return (React.createElement(Navigator, { ...props }, 100 React.createElement(QualifiedSlot, null))); 101 } 102 return React.createElement(QualifiedSlot, null); 103} 104exports.Slot = Slot; 105function QualifiedSlot() { 106 return useSlot(); 107} 108exports.QualifiedSlot = QualifiedSlot; 109function DefaultNavigator() { 110 return (React.createElement(react_native_safe_area_context_1.SafeAreaView, { style: { flex: 1 } }, 111 React.createElement(Navigator, null, 112 React.createElement(QualifiedSlot, null)))); 113} 114exports.DefaultNavigator = DefaultNavigator; 115Navigator.Slot = Slot; 116Navigator.useContext = useNavigatorContext; 117/** Used to configure route settings. */ 118Navigator.Screen = Screen_1.Screen; 119//# sourceMappingURL=Navigator.js.map