@react-navigation/stack
Version:
Stack navigator component for iOS and Android with animated transitions and gestures
143 lines (142 loc) • 4.43 kB
JavaScript
"use strict";
import { getDefaultHeaderHeight, Header, HeaderBackButton, HeaderTitle } from '@react-navigation/elements';
import { useLocale } from '@react-navigation/native';
import * as React from 'react';
import { Platform, StyleSheet } from 'react-native';
import { memoize } from "../../utils/memoize.js";
import { jsx as _jsx } from "react/jsx-runtime";
export function HeaderSegment(props) {
const {
direction
} = useLocale();
const [leftLabelLayout, setLeftLabelLayout] = React.useState(undefined);
const [titleLayout, setTitleLayout] = React.useState(undefined);
const handleTitleLayout = e => {
const {
height,
width
} = e.nativeEvent.layout;
setTitleLayout(titleLayout => {
if (titleLayout && height === titleLayout.height && width === titleLayout.width) {
return titleLayout;
}
return {
height,
width
};
});
};
const handleLeftLabelLayout = e => {
const {
height,
width
} = e.nativeEvent.layout;
if (leftLabelLayout && height === leftLabelLayout.height && width === leftLabelLayout.width) {
return;
}
setLeftLabelLayout({
height,
width
});
};
const getInterpolatedStyle = memoize((styleInterpolator, layout, current, next, titleLayout, leftLabelLayout, headerHeight) => styleInterpolator({
current: {
progress: current
},
next: next && {
progress: next
},
direction,
layouts: {
header: {
height: headerHeight,
width: layout.width
},
screen: layout,
title: titleLayout,
leftLabel: leftLabelLayout
}
}));
const {
progress,
layout,
modal,
onGoBack,
backHref,
headerTitle: title,
headerLeft: left = onGoBack ? props => /*#__PURE__*/_jsx(HeaderBackButton, {
...props
}) : undefined,
headerRight: right,
headerBackImage,
headerBackTitle,
headerBackButtonDisplayMode = Platform.OS === 'ios' ? 'default' : 'minimal',
headerBackTruncatedTitle,
headerBackAccessibilityLabel,
headerBackTestID,
headerBackAllowFontScaling,
headerBackTitleStyle,
headerTitleContainerStyle,
headerLeftContainerStyle,
headerRightContainerStyle,
headerBackgroundContainerStyle,
headerStyle: customHeaderStyle,
headerStatusBarHeight,
styleInterpolator,
...rest
} = props;
const defaultHeight = getDefaultHeaderHeight(layout, modal, headerStatusBarHeight);
const {
height = defaultHeight
} = StyleSheet.flatten(customHeaderStyle || {});
const {
titleStyle,
leftButtonStyle,
leftLabelStyle,
rightButtonStyle,
backgroundStyle
} = getInterpolatedStyle(styleInterpolator, layout, progress.current, progress.next, titleLayout, headerBackTitle ? leftLabelLayout : undefined, typeof height === 'number' ? height : defaultHeight);
const headerLeft = left ? props => left({
...props,
href: backHref,
backImage: headerBackImage,
accessibilityLabel: headerBackAccessibilityLabel,
testID: headerBackTestID,
allowFontScaling: headerBackAllowFontScaling,
onPress: onGoBack,
label: headerBackTitle,
truncatedLabel: headerBackTruncatedTitle,
labelStyle: [leftLabelStyle, headerBackTitleStyle],
onLabelLayout: handleLeftLabelLayout,
screenLayout: layout,
titleLayout,
canGoBack: Boolean(onGoBack)
}) : undefined;
const headerRight = right ? props => right({
...props,
canGoBack: Boolean(onGoBack)
}) : undefined;
const headerTitle = typeof title !== 'function' ? props => /*#__PURE__*/_jsx(HeaderTitle, {
...props,
onLayout: handleTitleLayout
}) : props => title({
...props,
onLayout: handleTitleLayout
});
return /*#__PURE__*/_jsx(Header, {
modal: modal,
layout: layout,
headerTitle: headerTitle,
headerLeft: headerLeft,
headerRight: headerRight,
headerTitleContainerStyle: [titleStyle, headerTitleContainerStyle],
headerLeftContainerStyle: [leftButtonStyle, headerLeftContainerStyle],
headerRightContainerStyle: [rightButtonStyle, headerRightContainerStyle],
headerBackButtonDisplayMode: headerBackButtonDisplayMode,
headerBackgroundContainerStyle: [backgroundStyle, headerBackgroundContainerStyle],
headerStyle: customHeaderStyle,
headerStatusBarHeight: headerStatusBarHeight,
...rest
});
}
//# sourceMappingURL=HeaderSegment.js.map