one
Version:
One is a React framework for web, iOS, and Android apps.
118 lines (114 loc) • 4.18 kB
JavaScript
"use client";
import { jsx, 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 { 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 });
}
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, state.index + 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 onDismiss() {
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