one
Version:
One is a React framework for web, iOS, and Android apps.
125 lines (122 loc) • 4.68 kB
JavaScript
import { jsx } from "react/jsx-runtime";
import React, { Children, useMemo } from "react";
import { isChildOfType } from "../utils/children.native.js";
import { Protected } from "../views/Protected.native.js";
import { Screen } from "../views/Screen.native.js";
import { createStackNavigator, getStackNavigatorProps } from "./stack-navigator.native.js";
import { StackHeader, StackHeaderComponent, StackHeaderSearchBar, StackScreen, StackToolbarBadge, StackToolbarButton, StackToolbarComponent, StackToolbarIcon, StackToolbarLabel, StackToolbarMenu, StackToolbarMenuAction, StackToolbarSearchBarSlot, StackToolbarSpacer, appendScreenStackPropsToOptions, appendStackToolbarPropsToOptions } from "./stack-utils/index.native.js";
import { withLayoutContext } from "./withLayoutContext.native.js";
var NativeStackNavigator = createStackNavigator().Navigator;
var RNStack = withLayoutContext(NativeStackNavigator, void 0, { undeclaredRoutes: true });
function mapChildren(children) {
return Children.toArray(children).map(function(child, index) {
if (isChildOfType(child, StackScreen)) {
var _child_props_name;
var options = appendScreenStackPropsToOptions({}, child.props);
var { children: _, ...rest } = child.props;
return /* @__PURE__ */ jsx(Screen, {
...rest,
options
}, (_child_props_name = child.props.name) !== null && _child_props_name !== void 0 ? _child_props_name : index);
}
if (isChildOfType(child, Protected)) {
return /* @__PURE__ */ React.cloneElement(child, { key: `protected-${index}` }, mapChildren(child.props.children));
}
if (isChildOfType(child, StackHeaderComponent)) {
return null;
}
if (isChildOfType(child, StackToolbarComponent)) {
return null;
}
if (isChildOfType(child, Screen)) {
return child;
}
return null;
}).filter(Boolean);
}
var StackWithComposition = /* @__PURE__ */ React.forwardRef(function(props, ref) {
var { children, screenOptions, ...rest } = props;
var screenOptionsWithHeader = useMemo(function() {
var stackHeader = Children.toArray(children).find(function(child) {
return isChildOfType(child, StackHeaderComponent);
});
var stackToolbars = Children.toArray(children).filter(function(child) {
return isChildOfType(child, StackToolbarComponent);
});
if (!stackHeader && !stackToolbars.length) return screenOptions;
var applyComposition = function applyComposition2(opts) {
var result = opts;
var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = void 0;
try {
for (var _iterator = stackToolbars[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
var stackToolbar = _step.value;
result = appendStackToolbarPropsToOptions(result, stackToolbar.props);
}
} catch (err) {
_didIteratorError = true;
_iteratorError = err;
} finally {
try {
if (!_iteratorNormalCompletion && _iterator.return != null) {
_iterator.return();
}
} finally {
if (_didIteratorError) {
throw _iteratorError;
}
}
}
if (stackHeader && isChildOfType(stackHeader, StackHeaderComponent)) {
var headerProps = { children: stackHeader };
result = appendScreenStackPropsToOptions(result, headerProps);
}
return result;
};
if (screenOptions) {
if (typeof screenOptions === "function") {
return function() {
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
var opts = screenOptions(...args);
return applyComposition(opts);
};
}
return applyComposition(screenOptions);
}
return applyComposition({});
}, [children, screenOptions]);
var processedChildren = useMemo(function() {
return mapChildren(children);
}, [children]);
var navigatorProps = useMemo(function() {
return getStackNavigatorProps(children);
}, [children]);
return /* @__PURE__ */ jsx(RNStack, {
...rest,
...navigatorProps,
ref,
screenOptions: screenOptionsWithHeader,
children: processedChildren
});
});
var StackToolbar = Object.assign(StackToolbarComponent, {
Button: StackToolbarButton,
Menu: StackToolbarMenu,
MenuAction: StackToolbarMenuAction,
Spacer: StackToolbarSpacer,
SearchBarSlot: StackToolbarSearchBarSlot,
Label: StackToolbarLabel,
Icon: StackToolbarIcon,
Badge: StackToolbarBadge
});
var Stack = Object.assign(StackWithComposition, {
Screen: StackScreen,
Header: StackHeader,
Toolbar: StackToolbar,
Protected,
SearchBar: StackHeaderSearchBar
});
var Stack_default = Stack;
export { Stack, Stack_default as default };
//# sourceMappingURL=Stack.native.js.map