UNPKG

one

Version:

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

1 lines • 10.8 kB
{"version":3,"file":"common.js","names":[],"sources":["esm/ui/common.js"],"sourcesContent":["import { resolveHref } from \"../link/href\";\nimport { getReactNavigationRouteName } from \"../getReactNavigationConfig\";\nimport { sortRoutesWithInitial } from \"../router/sortRoutes\";\nimport {\n createGetIdForRoute,\n getQualifiedRouteComponent,\n Screen\n} from \"../router/useScreens\";\nimport { Slot } from \"./Slot\";\nimport { jsx } from \"react/jsx-runtime\";\nconst ViewSlot = Slot;\nfunction resolveHrefWithSegments(href, routeInfo, segmentsWithoutGroups) {\n if (href.startsWith(\"./\") || href.startsWith(\"../\")) {\n const basePath = \"/\" + segmentsWithoutGroups.join(\"/\");\n const baseDir = basePath.replace(/\\/[^/]*$/, \"\") || \"/\";\n const parts = (baseDir + \"/\" + href).split(\"/\");\n const resolved = [];\n for (const part of parts) {\n if (part === \".\" || part === \"\") continue;\n if (part === \"..\") {\n resolved.pop();\n } else {\n resolved.push(part);\n }\n }\n return \"/\" + resolved.join(\"/\");\n }\n return href;\n}\nfunction triggersToScreens(triggers, layoutRouteNode, linking, initialRouteName, parentTriggerMap, routeInfo, contextKey) {\n const configs = [];\n for (const trigger of triggers) {\n if (trigger.name in parentTriggerMap) {\n const parentTrigger = parentTriggerMap[trigger.name];\n throw new Error(\n `Trigger ${JSON.stringify({\n name: trigger.name,\n href: trigger.href\n })} has the same name as parent trigger ${JSON.stringify({\n name: parentTrigger.name,\n href: parentTrigger.href\n })}. Triggers must have unique names.`\n );\n }\n if (trigger.type === \"external\") {\n configs.push(trigger);\n continue;\n }\n let resolvedHref = resolveHref(trigger.href);\n if (resolvedHref.startsWith(\"../\")) {\n throw new Error(\"Trigger href cannot link to a parent directory\");\n }\n const segmentsWithoutGroups = contextKey.split(\"/\").filter((segment) => {\n return !(segment.startsWith(\"(\") && segment.endsWith(\")\"));\n });\n resolvedHref = resolveHrefWithSegments(resolvedHref, routeInfo, segmentsWithoutGroups);\n let state = linking.getStateFromPath?.(resolvedHref, linking.config)?.routes[0];\n if (!state) {\n console.warn(\n `Unable to find screen for trigger ${JSON.stringify(trigger)}. Does this point to a valid screen?`\n );\n continue;\n }\n let routeState = state;\n if (routeState.name === \"+not-found\") {\n if (process.env.NODE_ENV !== \"production\") {\n console.warn(\n `Tab trigger '${trigger.name}' has the href '${trigger.href}' which points to a +not-found route.`\n );\n }\n continue;\n }\n const targetStateName = getReactNavigationRouteName(layoutRouteNode) || \"__root\";\n while (state?.state) {\n if (state.name === targetStateName) break;\n state = state.state.routes[state.state.index ?? state.state.routes.length - 1];\n }\n routeState = state.state?.routes[state.state.index ?? state.state.routes.length - 1] || state;\n const routeNode = layoutRouteNode.children.find(\n (child) => child.route === routeState?.name\n );\n if (!routeNode) {\n console.warn(\n `Unable to find routeNode for trigger ${JSON.stringify(trigger)}. This might be a bug in One router`\n );\n continue;\n }\n const duplicateTrigger = trigger.type === \"internal\" && configs.find((config) => {\n if (config.type === \"external\") {\n return false;\n }\n return config.routeNode.route === routeNode.route;\n });\n if (duplicateTrigger) {\n const duplicateTriggerText = `${JSON.stringify({ name: duplicateTrigger.name, href: duplicateTrigger.href })} and ${JSON.stringify({ name: trigger.name, href: trigger.href })}`;\n throw new Error(\n `A navigator cannot contain multiple trigger components that map to the same sub-segment. Consider adding a shared group and assigning a group to each trigger. Conflicting triggers:\n\t${duplicateTriggerText}.\nBoth triggers map to route ${routeNode.route}.`\n );\n }\n configs.push({\n ...trigger,\n href: resolvedHref,\n routeNode,\n action: stateToAction(state, layoutRouteNode.route)\n });\n }\n const sortFn = sortRoutesWithInitial(initialRouteName);\n const sortedConfigs = configs.sort((a, b) => {\n if (a.type === \"external\" && b.type === \"external\") {\n return 0;\n } else if (a.type === \"external\") {\n return 1;\n } else if (b.type === \"external\") {\n return -1;\n }\n return sortFn(a.routeNode, b.routeNode);\n });\n const children = [];\n const triggerMap = { ...parentTriggerMap };\n for (const [index, config] of sortedConfigs.entries()) {\n triggerMap[config.name] = { ...config, index };\n if (config.type === \"internal\") {\n const route = config.routeNode;\n children.push(\n /* @__PURE__ */ jsx(\n Screen,\n {\n getId: createGetIdForRoute(route),\n name: getReactNavigationRouteName(route),\n options: (args) => {\n const staticOptions = route.generated ? route.loadRoute()?.getNavOptions : null;\n const staticResult = typeof staticOptions === \"function\" ? staticOptions(args) : staticOptions;\n const output = {\n ...staticResult\n };\n if (route.generated) {\n output.tabBarButton = () => null;\n output.drawerItemStyle = { height: 0, display: \"none\" };\n }\n return output;\n },\n getComponent: () => getQualifiedRouteComponent(route)\n },\n getReactNavigationRouteName(route)\n )\n );\n }\n }\n return {\n children,\n triggerMap\n };\n}\nfunction stateToAction(state, startAtRoute) {\n const rootPayload = {};\n let payload = rootPayload;\n startAtRoute = startAtRoute === \"\" ? \"__root\" : startAtRoute;\n let foundStartingPoint = startAtRoute === void 0 || !state?.state;\n while (state) {\n if (foundStartingPoint) {\n if (payload === rootPayload) {\n payload.name = state.name;\n } else {\n payload.screen = state.name;\n }\n payload.params = state.params ? { ...state.params } : {};\n state = state.state?.routes[state.state.index ?? state.state.routes.length - 1];\n if (state) {\n payload.params ??= {};\n payload = payload.params;\n }\n } else {\n if (state.name === startAtRoute) {\n foundStartingPoint = true;\n }\n const nextState = state.state?.routes[state.state.index ?? state.state.routes.length - 1];\n if (nextState) {\n state = nextState;\n }\n }\n }\n return {\n type: \"JUMP_TO\",\n payload: rootPayload\n };\n}\nexport {\n ViewSlot,\n stateToAction,\n triggersToScreens\n};\n//# sourceMappingURL=common.js.map\n"],"mappings":"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"}