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