one
Version:
One is a new React Framework that makes Vite serve both native and web.
87 lines (86 loc) • 3.75 kB
JavaScript
import { Children, isValidElement } from "react";
import { StyleSheet } from "react-native-web";
import { appendStackHeaderBackButtonPropsToOptions, StackHeaderBackButton } from "./StackHeaderBackButton.mjs";
import { StackHeaderLeft, appendStackHeaderLeftPropsToOptions } from "./StackHeaderLeft.mjs";
import { StackHeaderRight, appendStackHeaderRightPropsToOptions } from "./StackHeaderRight.mjs";
import { appendStackHeaderSearchBarPropsToOptions, StackHeaderSearchBar } from "./StackHeaderSearchBar.mjs";
import { appendStackHeaderTitlePropsToOptions, StackHeaderTitle } from "./StackHeaderTitle.mjs";
import { isChildOfType } from "../../utils/children.mjs";
function StackHeaderComponent(_props) {
return null;
}
function appendStackHeaderPropsToOptions(options, props) {
const flattenedStyle = StyleSheet.flatten(props.style);
const flattenedLargeStyle = StyleSheet.flatten(props.largeStyle);
if (props.hidden) {
return {
...options,
headerShown: false
};
}
if (props.asChild) {
return {
...options,
header: () => props.children
};
}
const isTransparent = flattenedStyle?.backgroundColor === "transparent";
const hasCustomShadow = flattenedStyle?.shadowColor !== void 0;
const hasBackgroundColor = flattenedStyle?.backgroundColor !== void 0;
const hasLargeBackgroundColor = flattenedLargeStyle?.backgroundColor !== void 0;
let updatedOptions = {
...options,
headerShown: !props.hidden,
headerBlurEffect: props.blurEffect,
// Set headerTransparent when backgroundColor is 'transparent'
// This works on both iOS and Android for normal headers
// Note: When using SearchBar on iOS, if you don't have a ScrollView with
// contentInsetAdjustmentBehavior="automatic", set headerTransparent: false in options
...(isTransparent && {
headerTransparent: true
}),
// Only set header styles when explicitly configured to avoid interfering with native defaults
...(hasBackgroundColor && {
headerStyle: {
backgroundColor: flattenedStyle.backgroundColor
}
}),
...(hasLargeBackgroundColor && {
headerLargeStyle: {
backgroundColor: flattenedLargeStyle.backgroundColor
}
}),
// Only set shadow visibility when explicitly configured
...(hasCustomShadow && {
headerShadowVisible: flattenedStyle?.shadowColor !== "transparent"
}),
...(flattenedLargeStyle?.shadowColor !== void 0 && {
headerLargeTitleShadowVisible: flattenedLargeStyle?.shadowColor !== "transparent"
})
};
function appendChildOptions(child, options2) {
let result = options2;
if (isChildOfType(child, StackHeaderTitle)) {
result = appendStackHeaderTitlePropsToOptions(result, child.props);
} else if (isChildOfType(child, StackHeaderLeft)) {
result = appendStackHeaderLeftPropsToOptions(result, child.props);
} else if (isChildOfType(child, StackHeaderRight)) {
result = appendStackHeaderRightPropsToOptions(result, child.props);
} else if (isChildOfType(child, StackHeaderBackButton)) {
result = appendStackHeaderBackButtonPropsToOptions(result, child.props);
} else if (isChildOfType(child, StackHeaderSearchBar)) {
result = appendStackHeaderSearchBarPropsToOptions(result, child.props);
} else {
console.warn(`Warning: Unknown child element passed to Stack.Header: ${child.type.name ?? child.type}`);
}
return result;
}
Children.forEach(props.children, child => {
if (isValidElement(child)) {
updatedOptions = appendChildOptions(child, updatedOptions);
}
});
return updatedOptions;
}
export { StackHeaderComponent, appendStackHeaderPropsToOptions };
//# sourceMappingURL=StackHeaderComponent.mjs.map