From e653d554799b057b3ca35bb3c79c2c31410cbd27 Mon Sep 17 00:00:00 2001 From: Satyajit Sahoo Date: Sat, 6 Jun 2020 00:38:38 +0200 Subject: [PATCH] refactor: minor tweaks --- .../src/Screens/StackHeaderCustomization.tsx | 25 ++++++--- .../stack/src/views/Stack/CardContainer.tsx | 14 +---- packages/stack/src/views/Stack/CardStack.tsx | 56 +++++++++++-------- 3 files changed, 53 insertions(+), 42 deletions(-) diff --git a/example/src/Screens/StackHeaderCustomization.tsx b/example/src/Screens/StackHeaderCustomization.tsx index 75dafc65..0a6cad4a 100644 --- a/example/src/Screens/StackHeaderCustomization.tsx +++ b/example/src/Screens/StackHeaderCustomization.tsx @@ -1,11 +1,11 @@ import * as React from 'react'; import { + Animated, View, StyleSheet, ScrollView, Alert, Platform, - Text, } from 'react-native'; import { Button, Appbar } from 'react-native-paper'; import MaterialCommunityIcons from 'react-native-vector-icons/MaterialCommunityIcons'; @@ -101,15 +101,20 @@ type Props = Partial> & { }; function CustomHeader(props: StackHeaderProps) { - const { navigation } = props; + const { current, next } = props.scene.progress; + + const progress = Animated.add(current, next || 0); + const opacity = progress.interpolate({ + inputRange: [0, 1, 2], + outputRange: [0, 1, 0], + }); + return ( <>
- - - Why hello there, pardner! - - + + Why hello there, pardner! + ); } @@ -184,4 +189,10 @@ const styles = StyleSheet.create({ button: { margin: 8, }, + banner: { + textAlign: 'center', + color: 'tomato', + backgroundColor: 'papayawhip', + padding: 4, + }, }); diff --git a/packages/stack/src/views/Stack/CardContainer.tsx b/packages/stack/src/views/Stack/CardContainer.tsx index 8c7955c9..d9049d49 100644 --- a/packages/stack/src/views/Stack/CardContainer.tsx +++ b/packages/stack/src/views/Stack/CardContainer.tsx @@ -53,9 +53,7 @@ type Props = TransitionPreset & { gestureVelocityImpact?: number; mode: StackCardMode; headerMode: StackHeaderMode; - headerShown?: boolean; - headerTransparent?: boolean; - isFloatHeaderAbsolute: boolean; + hasAbsoluteHeader: boolean; headerHeight: number; onHeaderHeightChange: (props: { route: Route; @@ -83,10 +81,8 @@ function CardContainer({ getFocusedRoute, mode, headerMode, - headerShown, headerStyleInterpolator, - headerTransparent, - isFloatHeaderAbsolute, + hasAbsoluteHeader, headerHeight, onHeaderHeightChange, index, @@ -189,11 +185,7 @@ function CardContainer({ importantForAccessibility={focused ? 'auto' : 'no-hide-descendants'} pointerEvents={active ? 'box-none' : pointerEvents} pageOverflowEnabled={headerMode === 'screen' && mode === 'card'} - containerStyle={ - isFloatHeaderAbsolute && !headerTransparent && headerShown !== false - ? { marginTop: headerHeight } - : null - } + containerStyle={hasAbsoluteHeader ? { marginTop: headerHeight } : null} contentStyle={[{ backgroundColor: colors.background }, cardStyle]} style={StyleSheet.absoluteFill} > diff --git a/packages/stack/src/views/Stack/CardStack.tsx b/packages/stack/src/views/Stack/CardStack.tsx index 8e44a276..9a8579fa 100755 --- a/packages/stack/src/views/Stack/CardStack.tsx +++ b/packages/stack/src/views/Stack/CardStack.tsx @@ -335,17 +335,20 @@ export default class CardStack extends React.Component { return state.routes[state.index]; }; - private getSomeFloatHeaderNeedsAbsolutePositioning = () => { + private doesFloatHeaderNeedAbsolutePositioning = () => { if (this.props.headerMode !== 'float') { return false; } + return this.state.scenes.slice(-2).some((scene) => { const { descriptor } = scene; const options = descriptor ? descriptor.options : {}; const { headerTransparent, headerShown } = options; + if (headerTransparent || headerShown === false) { return true; } + return false; }); }; @@ -377,7 +380,8 @@ export default class CardStack extends React.Component { const focusedRoute = state.routes[state.index]; const focusedDescriptor = descriptors[focusedRoute.key]; const focusedOptions = focusedDescriptor ? focusedDescriptor.options : {}; - const isFloatHeaderAbsolute = this.getSomeFloatHeaderNeedsAbsolutePositioning(); + + const isFloatHeaderAbsolute = this.doesFloatHeaderNeedAbsolutePositioning(); let defaultTransitionPreset = mode === 'modal' ? ModalTransition : DefaultTransition; @@ -401,27 +405,29 @@ export default class CardStack extends React.Component { const isScreensEnabled = Platform.OS !== 'ios' && mode !== 'modal'; let floatingHeader; + if (headerMode === 'float') { - const renderedHeader = renderHeader({ - mode: 'float', - layout, - insets: { top, right, bottom, left }, - scenes, - getPreviousRoute, - getFocusedRoute: this.getFocusedRoute, - onContentHeightChange: this.handleHeaderLayout, - gestureDirection: - focusedOptions.gestureDirection !== undefined - ? focusedOptions.gestureDirection - : defaultTransitionPreset.gestureDirection, - styleInterpolator: - focusedOptions.headerStyleInterpolator !== undefined - ? focusedOptions.headerStyleInterpolator - : defaultTransitionPreset.headerStyleInterpolator, - style: isFloatHeaderAbsolute ? styles.floating : undefined, - }); floatingHeader = ( - {renderedHeader} + + {renderHeader({ + mode: 'float', + layout, + insets: { top, right, bottom, left }, + scenes, + getPreviousRoute, + getFocusedRoute: this.getFocusedRoute, + onContentHeightChange: this.handleHeaderLayout, + gestureDirection: + focusedOptions.gestureDirection !== undefined + ? focusedOptions.gestureDirection + : defaultTransitionPreset.gestureDirection, + styleInterpolator: + focusedOptions.headerStyleInterpolator !== undefined + ? focusedOptions.headerStyleInterpolator + : defaultTransitionPreset.headerStyleInterpolator, + style: isFloatHeaderAbsolute ? styles.floating : undefined, + })} + ); } @@ -564,9 +570,11 @@ export default class CardStack extends React.Component { getFocusedRoute={this.getFocusedRoute} mode={mode} headerMode={headerMode} - headerShown={headerShown} - headerTransparent={headerTransparent} - isFloatHeaderAbsolute={isFloatHeaderAbsolute} + hasAbsoluteHeader={ + isFloatHeaderAbsolute && + headerShown !== false && + !headerTransparent + } renderHeader={renderHeader} renderScene={renderScene} onOpenRoute={onOpenRoute}