UNPKG

one

Version:

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

141 lines (140 loc) • 5.5 kB
var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var Tabs_shared_exports = {}; __export(Tabs_shared_exports, { useTabsWithChildren: () => useTabsWithChildren, useTabsWithTriggers: () => useTabsWithTriggers }); module.exports = __toCommonJS(Tabs_shared_exports); var import_native = require("@react-navigation/native"); var import_react = require("react"); var import_hooks = require("../hooks.cjs"); var import_href = require("../link/href.cjs"); var import_Route = require("../router/Route.cjs"); var import_url = require("../utils/url.cjs"); var import_Navigator = require("../views/Navigator.cjs"); var import_common = require("./common.cjs"); var import_TabContext = require("./TabContext.cjs"); var import_TabList = require("./TabList.cjs"); var import_TabRouter = require("./TabRouter.cjs"); var import_TabSlot = require("./TabSlot.cjs"); var import_TabTrigger = require("./TabTrigger.cjs"); var import_useComponent = require("./useComponent.cjs"); var import_jsx_runtime = require("react/jsx-runtime"); function useTabsWithChildren(options) { const { children, ...rest } = options; return useTabsWithTriggers({ triggers: parseTriggersFromChildren(children), ...rest }); } function useTabsWithTriggers(options) { const { triggers, ...rest } = options; const parentTriggerMap = (0, import_react.use)(import_TabContext.TabTriggerMapContext); const routeNode = (0, import_Route.useRouteNode)(); const contextKey = (0, import_Route.useContextKey)(); const linking = (0, import_react.use)(import_native.LinkingContext).options; const routeInfo = (0, import_hooks.useRouteInfo)(); if (!routeNode || !linking) { throw new Error("No RouteNode. This is likely a bug in one router."); } const { children, triggerMap } = (0, import_common.triggersToScreens)(triggers, routeNode, linking, routeNode.initialRouteName, parentTriggerMap, routeInfo, contextKey); const navigatorContext = (0, import_native.useNavigationBuilder)(import_TabRouter.ExpoTabRouter, { children, ...rest, triggerMap, initialRouteName: routeNode.initialRouteName }); const { state, descriptors, navigation, render } = navigatorContext; const descriptorsRef = (0, import_react.useRef)(descriptors); descriptorsRef.current = descriptors; const navigatorContextValue = (0, import_react.useMemo)(() => ({ state, navigation, contextKey, router: import_TabRouter.ExpoTabRouter, descriptorsRef }), [ state, navigation, contextKey ]); const NavigationContent = (0, import_useComponent.useComponent)((children2) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_TabContext.TabTriggerMapContext.Provider, { value: triggerMap, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_Navigator.NavigatorContext.Provider, { value: navigatorContextValue, children: render(children2) }) })); return { state, descriptors, navigation, NavigationContent }; } function parseTriggersFromChildren(children, screenTriggers = [], isInTabList = false) { import_react.Children.forEach(children, (child) => { if (!child || !(0, import_react.isValidElement)(child) || (0, import_TabSlot.isTabSlot)(child)) return; if (isFragment(child) && typeof child.props.children !== "function") { return parseTriggersFromChildren(child.props.children, screenTriggers, isInTabList || (0, import_TabList.isTabList)(child)); } if ((0, import_TabList.isTabList)(child) && typeof child.props.children !== "function") { let children2 = child.props.children; if (child.props.asChild && (0, import_react.isValidElement)(children2) && children2.props && typeof children2.props === "object" && "children" in children2.props) { children2 = children2.props.children; } return parseTriggersFromChildren(children2, screenTriggers, isInTabList || (0, import_TabList.isTabList)(child)); } if (!isInTabList || !(0, import_TabTrigger.isTabTrigger)(child)) return; const { href, name } = child.props; if (!href) { if (process.env.NODE_ENV === "development") { console.warn(`<TabTrigger name={${name}}> does not have a 'href' prop. TabTriggers within a <TabList /> are required to have an href.`); } return; } const resolvedHref = (0, import_href.resolveHref)(href); if ((0, import_url.shouldLinkExternally)(resolvedHref)) { screenTriggers.push({ type: "external", name, href: resolvedHref }); return; } if (!name) { if (process.env.NODE_ENV === "development") { console.warn(`<TabTrigger> does not have a 'name' prop. TabTriggers within a <TabList /> are required to have a name.`); } return; } screenTriggers.push({ type: "internal", href: resolvedHref, name }); }); return screenTriggers; } function isFragment(child) { return child.type === import_react.Fragment; }