UNPKG

one

Version:

One is a new React Framework that makes Vite serve both native and web.

139 lines (137 loc) 4.62 kB
"use client"; import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime"; import { StackActions } from "@react-navigation/routers"; import { Activity, Fragment, useCallback, useEffect, useState } from "react"; import useLatestCallback from "use-latest-callback"; import { devHeadlessNote } from "../../headless/devHeadlessNote.native.js"; import { useWebPresentations } from "../../headless/Presentations.native.js"; import { StackStateProvider, useStack } from "../../headless/useStack.native.js"; import { findLastNonOverlayIndex } from "./stackStateUtils.native.js"; function WebStackView(param) { var { state, navigation, descriptors, customChildren } = param; return /* @__PURE__ */_jsx(StackStateProvider, { state, descriptors, children: /* @__PURE__ */_jsx(HeadlessStackView, { state, navigation, descriptors, customChildren }) }); } function HeadlessStackView(param) { var { state, navigation, descriptors, customChildren } = param; var _state_routes_lastBaseIndex; var stack = useStack(); var presentations = useWebPresentations(); if (customChildren === null || customChildren === void 0 ? void 0 : customChildren.length) { return /* @__PURE__ */_jsx(Fragment, { children: customChildren }); } devHeadlessNote("Stack"); var lastBaseIndex = findLastNonOverlayIndex(state, descriptors, function (options) { return getPresentationType(options) !== void 0; }); var baseRouteKeys = new Set(state.routes.slice(0, lastBaseIndex + 1).map(function (route) { return route.key; })); var baseFocusedKey = (_state_routes_lastBaseIndex = state.routes[lastBaseIndex]) === null || _state_routes_lastBaseIndex === void 0 ? void 0 : _state_routes_lastBaseIndex.key; var overlayRoutes = state.routes.slice(lastBaseIndex + 1); return /* @__PURE__ */_jsxs(Fragment, { children: [stack.screens.map(function (screen) { if (!baseRouteKeys.has(screen.key)) return null; if (screen.key === baseFocusedKey) { return screen.keepMounted ? /* @__PURE__ */_jsx(Activity, { mode: "visible", children: screen.element }, screen.key) : /* @__PURE__ */_jsx(Fragment, { children: screen.element }, screen.key); } if (!screen.keepMounted) return null; return /* @__PURE__ */_jsx(Activity, { mode: "hidden", children: screen.element }, screen.key); }), overlayRoutes.map(function (route) { var _descriptors_route_key; var screen = stack.screens.find(function (entry) { return entry.key === route.key; }); var type = getPresentationType((_descriptors_route_key = descriptors[route.key]) === null || _descriptors_route_key === void 0 ? void 0 : _descriptors_route_key.options); if (!screen || !type) return null; return /* @__PURE__ */_jsx(PresentationScreen, { screen, type, presentations, onDismiss: function () { return navigation.dispatch({ ...StackActions.pop(), source: route.key, target: state.key }); } }, route.key); })] }); } function PresentationScreen(param) { var { screen, type, presentations, onDismiss } = param; var dismiss = useLatestCallback(onDismiss); var onOpenChange = useCallback(function (nextOpen) { if (!nextOpen) dismiss(); }, [dismiss]); var [open, setOpen] = useState(false); useEffect(function () { return setOpen(true); }, []); if (type === "sheet") { var Sheet = presentations === null || presentations === void 0 ? void 0 : presentations.sheet; if (!Sheet) return screen.element; return /* @__PURE__ */_jsx(Sheet, { open, onOpenChange, options: screen.options, screen, children: screen.element }); } var Modal = presentations === null || presentations === void 0 ? void 0 : presentations.modal; if (!Modal) return screen.element; return /* @__PURE__ */_jsx(Modal, { open, onOpenChange, options: screen.options, screen, children: screen.element }); } function getPresentationType(options) { var presentation = options === null || options === void 0 ? void 0 : options.presentation; if (!presentation || presentation === "card" || presentation === "push") { return void 0; } if (presentation === "sheet" || presentation === "formSheet" || presentation === "pageSheet") { return "sheet"; } return "modal"; } export { WebStackView }; //# sourceMappingURL=WebStackView.native.js.map