one
Version:
One is a new React Framework that makes Vite serve both native and web.
139 lines (137 loc) • 4.62 kB
JavaScript
"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