UNPKG

one

Version:

One is a React framework for web, iOS, and Android apps.

97 lines (93 loc) • 3.18 kB
"use client"; import { useNavigationBuilder } from "@react-navigation/core"; import { TabRouter } from "@react-navigation/routers"; import { Children, Fragment, forwardRef, useMemo, useRef } from "react"; import { getPathFromState } from "../fork/getPathFromState.mjs"; import { getCustomNavigatorChildren, isNavigatorConfigChild } from "../headless/children.mjs"; import { renderKeptMountedScreens, useVisitedScreens } from "../headless/keepMounted.mjs"; import { useTabs } from "../headless/useTabs.mjs"; import { getResolvedLinking } from "../router/linkingConfig.mjs"; import { TabTriggerMapContext } from "../ui/TabContext.mjs"; import { NavigatorContext } from "../views/Navigator.mjs"; import { Protected } from "../views/Protected.mjs"; import { Screen } from "../views/Screen.mjs"; import { withLayoutContext } from "./withLayoutContext.mjs"; import { jsx } from "react/jsx-runtime"; function WebTabsNavigator({ children, headlessChildren, initialRouteName, screenOptions, id, ...rest }) { const { state, navigation, descriptors, render } = useNavigationBuilder(TabRouter, { ...rest, children, initialRouteName, screenOptions }); const descriptorsRef = useRef(descriptors); descriptorsRef.current = descriptors; const linking = getResolvedLinking(); const navigatorContextValue = useMemo(() => ({ contextKey: id ?? "", state, navigation, descriptorsRef, router: TabRouter }), [ id, navigation, state ]); const triggerMap = useMemo(() => { return Object.fromEntries(state.routes.map((route, index) => { const options = descriptors[route.key]?.options ?? {}; const href = typeof options.href === "string" ? options.href : (linking?.getPathFromState ?? getPathFromState)({ ...state, index }, linking?.config); return [route.name, { type: "internal", name: route.name, href, action: { type: "JUMP_TO", payload: { name: route.name } }, index }]; })); }, [ descriptors, linking, state ]); return render(/* @__PURE__ */ jsx(TabTriggerMapContext.Provider, { value: triggerMap, children: /* @__PURE__ */ jsx(NavigatorContext.Provider, { value: navigatorContextValue, children: /* @__PURE__ */ jsx(HeadlessTabsView, { customChildren: headlessChildren }) }) })); } function HeadlessTabsView({ customChildren }) { const { screens, focused } = useTabs(); const visited = useVisitedScreens(focused.key); if (customChildren?.length) { return /* @__PURE__ */ jsx(Fragment, { children: customChildren }); } return renderKeptMountedScreens(screens, visited); } const RNTabs = withLayoutContext(WebTabsNavigator); const TabsWithChildren = forwardRef(function TabsWithChildren2({ children, ...props }, ref) { const configChildren = Children.toArray(children).filter(isNavigatorConfigChild); const customChildren = getCustomNavigatorChildren(children); return /* @__PURE__ */ jsx(RNTabs, { ...props, ref, headlessChildren: customChildren, children: configChildren }); }); const Tabs = Object.assign(TabsWithChildren, { Protected, Screen }); var Tabs_web_default = Tabs; export { Tabs, Tabs_web_default as default }; //# sourceMappingURL=Tabs.mjs.map