one
Version:
One is a new React Framework that makes Vite serve both native and web.
111 lines (110 loc) • 3.8 kB
JavaScript
import {
StackRouter,
useNavigationBuilder
} from "@react-navigation/native";
import * as React from "react";
import { SafeAreaView } from "react-native-safe-area-context";
import { useFilterScreenChildren } from "../layouts/withLayoutContext";
import { FlagsContext } from "../router/FlagsContext";
import { useContextKey } from "../router/Route";
import { registerProtectedRoutes, unregisterProtectedRoutes } from "../router/router";
import { useSortedScreens } from "../router/useScreens";
import { Screen } from "./Screen";
import { jsx } from "react/jsx-runtime";
const NavigatorContext = React.createContext(null);
process.env.NODE_ENV !== "production" && (NavigatorContext.displayName = "NavigatorContext");
function Navigator({
initialRouteName,
screenOptions,
children,
router
}) {
const contextKey = useContextKey(), {
screens,
children: otherSlot,
protectedScreens
} = useFilterScreenChildren(children, {
isCustomNavigator: !0,
contextKey
});
registerProtectedRoutes(contextKey, protectedScreens), React.useEffect(() => (registerProtectedRoutes(contextKey, protectedScreens), () => {
unregisterProtectedRoutes(contextKey);
}), [contextKey, protectedScreens]);
const sorted = useSortedScreens(screens ?? [], { protectedScreens });
return sorted.length ? /* @__PURE__ */ jsx(
QualifiedNavigator,
{
initialRouteName,
screenOptions,
screens: sorted,
contextKey,
router,
children: otherSlot
}
) : (console.warn(`Navigator at "${contextKey}" has no children.`), null);
}
function QualifiedNavigator({
initialRouteName,
screenOptions,
children,
screens,
contextKey,
router = StackRouter
}) {
const { state, navigation, descriptors, NavigationContent } = useNavigationBuilder(
router,
{
// Used for getting the parent with navigation.getParent('/normalized/path')
id: contextKey,
children: screens,
screenOptions,
initialRouteName
}
), value = React.useMemo(() => ({
contextKey,
state,
navigation,
descriptors,
router
}), [contextKey, state, navigation, descriptors, router]);
return /* @__PURE__ */ jsx(NavigatorContext.Provider, { value, children: /* @__PURE__ */ jsx(NavigationContent, { children }) });
}
function useNavigatorContext() {
const context = React.useContext(NavigatorContext);
if (!context)
throw new Error("useNavigatorContext must be used within a <Navigator />");
return context;
}
function useSlot() {
const context = useNavigatorContext(), flags = React.useContext(FlagsContext), { state, descriptors } = context, current = state.routes.find((route, i) => state.index === i);
if (!current)
return null;
let renderedElement = descriptors[current.key]?.render() ?? null;
return flags.experimentalPreventLayoutRemounting && renderedElement !== null && (renderedElement = {
...renderedElement,
key: "one-uses-a-static-key-here-for-slot-navigator"
}), renderedElement;
}
const Slot = React.memo(function(props) {
const contextKey = useContextKey();
return React.useContext(NavigatorContext)?.contextKey !== contextKey ? /* @__PURE__ */ jsx(Navigator, { ...props, children: /* @__PURE__ */ jsx(QualifiedSlot, {}) }) : /* @__PURE__ */ jsx(QualifiedSlot, {});
});
function QualifiedSlot() {
return useSlot();
}
function DefaultNavigator() {
return /* @__PURE__ */ jsx(SafeAreaView, { style: { flex: 1 }, children: /* @__PURE__ */ jsx(Navigator, { children: /* @__PURE__ */ jsx(QualifiedSlot, {}) }) });
}
Navigator.Slot = Slot;
Navigator.useContext = useNavigatorContext;
Navigator.Screen = Screen;
export {
DefaultNavigator,
Navigator,
NavigatorContext,
QualifiedSlot,
Slot,
useNavigatorContext,
useSlot
};
//# sourceMappingURL=Navigator.js.map