react-navigation-stack
Version:
Stack navigator component for React Navigation
2 lines • 20.8 kB
JavaScript
var _interopRequireDefault=require("@babel/runtime/helpers/interopRequireDefault");var _interopRequireWildcard=require("@babel/runtime/helpers/interopRequireWildcard");Object.defineProperty(exports,"__esModule",{value:true});exports.default=void 0;var _objectWithoutProperties2=_interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));var _extends2=_interopRequireDefault(require("@babel/runtime/helpers/extends"));var _defineProperty2=_interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));var _classCallCheck2=_interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));var _createClass2=_interopRequireDefault(require("@babel/runtime/helpers/createClass"));var _possibleConstructorReturn2=_interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));var _getPrototypeOf3=_interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));var _inherits2=_interopRequireDefault(require("@babel/runtime/helpers/inherits"));var React=_interopRequireWildcard(require("react"));var _reactNative=require("react-native");var _reactNavigation=require("react-navigation");var _HeaderTitle=_interopRequireDefault(require("./HeaderTitle"));var _HeaderBackButton=_interopRequireDefault(require("./HeaderBackButton"));var _ModularHeaderBackButton=_interopRequireDefault(require("./ModularHeaderBackButton"));var _HeaderStyleInterpolator=_interopRequireDefault(require("./HeaderStyleInterpolator"));var _jsxFileName="/Users/satya/Workspace/Callstack/react-navigation-stack/src/views/Header/Header.tsx";function ownKeys(object,enumerableOnly){var keys=Object.keys(object);if(Object.getOwnPropertySymbols){var symbols=Object.getOwnPropertySymbols(object);if(enumerableOnly)symbols=symbols.filter(function(sym){return Object.getOwnPropertyDescriptor(object,sym).enumerable;});keys.push.apply(keys,symbols);}return keys;}function _objectSpread(target){for(var i=1;i<arguments.length;i++){var source=arguments[i]!=null?arguments[i]:{};if(i%2){ownKeys(source,true).forEach(function(key){(0,_defineProperty2.default)(target,key,source[key]);});}else if(Object.getOwnPropertyDescriptors){Object.defineProperties(target,Object.getOwnPropertyDescriptors(source));}else{ownKeys(source).forEach(function(key){Object.defineProperty(target,key,Object.getOwnPropertyDescriptor(source,key));});}}return target;}var APPBAR_HEIGHT=_reactNative.Platform.select({ios:44,android:56,default:64});var STATUSBAR_HEIGHT=_reactNative.Platform.select({ios:20,default:0});var TITLE_OFFSET_CENTER_ALIGN=_reactNative.Platform.select({ios:70,default:56});var TITLE_OFFSET_LEFT_ALIGN=_reactNative.Platform.select({ios:20,android:56,default:64});var getTitleOffsets=function getTitleOffsets(layoutPreset,hasLeftComponent,hasRightComponent){if(layoutPreset==='left'){var style={left:TITLE_OFFSET_LEFT_ALIGN,right:TITLE_OFFSET_LEFT_ALIGN};if(!hasLeftComponent){style.left=_reactNative.Platform.OS==='web'?16:0;}if(!hasRightComponent){style.right=0;}return style;}else if(layoutPreset==='center'){var _style={left:TITLE_OFFSET_CENTER_ALIGN,right:TITLE_OFFSET_CENTER_ALIGN};if(!hasLeftComponent&&!hasRightComponent){_style.left=0;_style.right=0;}return _style;}return undefined;};var getAppBarHeight=function getAppBarHeight(isLandscape){if(_reactNative.Platform.OS==='ios'){if(isLandscape&&!_reactNative.Platform.isPad){return 32;}else{return 44;}}else if(_reactNative.Platform.OS==='android'){return 56;}else{return 64;}};var Header=function(_React$PureComponent){(0,_inherits2.default)(Header,_React$PureComponent);function Header(){var _getPrototypeOf2;var _this;(0,_classCallCheck2.default)(this,Header);for(var _len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++){args[_key]=arguments[_key];}_this=(0,_possibleConstructorReturn2.default)(this,(_getPrototypeOf2=(0,_getPrototypeOf3.default)(Header)).call.apply(_getPrototypeOf2,[this].concat(args)));_this.state={widths:{}};_this.renderTitleComponent=function(props){var layoutPreset=_this.props.layoutPreset;var options=props.scene.descriptor.options;var headerTitle=options.headerTitle;if(React.isValidElement(headerTitle)){return headerTitle;}var titleString=_this.getHeaderTitleString(props.scene);var titleStyle=options.headerTitleStyle;var color=options.headerTintColor;var allowFontScaling=options.headerTitleAllowFontScaling;var onLayout=layoutPreset==='center'?function(e){var width=e.nativeEvent.layout.width;_this.setState(function(state){return{widths:_objectSpread({},state.widths,(0,_defineProperty2.default)({},props.scene.key,width))};});}:undefined;var render=headerTitle&&typeof headerTitle!=='string'?headerTitle:function(props){return React.createElement(_HeaderTitle.default,(0,_extends2.default)({},props,{__source:{fileName:_jsxFileName,lineNumber:227}}));};return render({onLayout:onLayout,allowFontScaling:Boolean(allowFontScaling),style:[color?{color:color}:null,layoutPreset==='center'?{textAlign:'center'}:{textAlign:'left'},titleStyle],children:titleString});};_this.renderLeftComponent=function(props){var options=props.scene.descriptor.options;if(React.isValidElement(options.headerLeft)||options.headerLeft===null){return options.headerLeft;}if(!options.headerLeft&&props.scene.index===0){return;}var backButtonTitle=_this.getBackButtonTitleString(props.scene);var truncatedBackButtonTitle=_this.getTruncatedBackButtonTitle(props.scene);var width=_this.state.widths[props.scene.key]?(_this.props.layout.initWidth-_this.state.widths[props.scene.key])/2:undefined;var RenderedLeftComponent=options.headerLeft||_HeaderBackButton.default;var goBack=function goBack(){requestAnimationFrame(function(){props.scene.descriptor.navigation.goBack(props.scene.descriptor.key);});};return React.createElement(RenderedLeftComponent,{onPress:goBack,pressColorAndroid:options.headerPressColorAndroid,tintColor:options.headerTintColor,backImage:options.headerBackImage,title:backButtonTitle,truncatedTitle:truncatedBackButtonTitle,backTitleVisible:_this.props.backTitleVisible,allowFontScaling:options.headerBackAllowFontScaling,titleStyle:options.headerBackTitleStyle,layoutPreset:_this.props.layoutPreset,width:width,scene:props.scene,__source:{fileName:_jsxFileName,lineNumber:275}});};_this.renderModularLeftComponent=function(props,ButtonContainerComponent,LabelContainerComponent){var _props$scene$descript=props.scene.descriptor,options=_props$scene$descript.options,navigation=_props$scene$descript.navigation;var backButtonTitle=_this.getBackButtonTitleString(props.scene);var truncatedBackButtonTitle=_this.getTruncatedBackButtonTitle(props.scene);var width=_this.state.widths[props.scene.key]?(_this.props.layout.initWidth-_this.state.widths[props.scene.key])/2:undefined;var goBack=function goBack(){requestAnimationFrame(function(){navigation.goBack(props.scene.descriptor.key);});};return React.createElement(_ModularHeaderBackButton.default,{onPress:goBack,ButtonContainerComponent:ButtonContainerComponent,LabelContainerComponent:LabelContainerComponent,backTitleVisible:_this.props.backTitleVisible,pressColorAndroid:options.headerPressColorAndroid,tintColor:options.headerTintColor,backImage:options.headerBackImage,title:backButtonTitle,truncatedTitle:truncatedBackButtonTitle,titleStyle:options.headerBackTitleStyle,layoutPreset:_this.props.layoutPreset,width:width,scene:props.scene,__source:{fileName:_jsxFileName,lineNumber:318}});};_this.renderRightComponent=function(props){var headerRight=props.scene.descriptor.options.headerRight;if(typeof headerRight==='function'){return headerRight();}return headerRight||null;};_this.renderLeft=function(props){var options=props.scene.descriptor.options;var transitionPreset=_this.props.transitionPreset;var style=props.style;if(options.headerLeftContainerStyle){style=[style,options.headerLeftContainerStyle];}if(transitionPreset!=='uikit'||options.headerBackImage||options.headerLeft||options.headerLeft===null){return _this.renderSubView(_objectSpread({},props,{style:style}),'left',_this.renderLeftComponent,_this.props.leftInterpolator);}else{return _this.renderModularSubView(_objectSpread({},props,{style:style}),'left',_this.renderModularLeftComponent,_this.props.leftLabelInterpolator,_this.props.leftButtonInterpolator);}};_this.renderTitle=function(props,options){var _this$props=_this.props,layoutPreset=_this$props.layoutPreset,transitionPreset=_this$props.transitionPreset;var style=[{justifyContent:layoutPreset==='center'?'center':'flex-start'},getTitleOffsets(layoutPreset,options.hasLeftComponent,options.hasRightComponent),options.headerTitleContainerStyle];return _this.renderSubView(_objectSpread({},props,{style:style}),'title',_this.renderTitleComponent,transitionPreset==='uikit'?_this.props.titleFromLeftInterpolator:_this.props.titleInterpolator);};_this.renderRight=function(props){var options=props.scene.descriptor.options;var style=props.style;if(options.headerRightContainerStyle){style=[style,options.headerRightContainerStyle];}return _this.renderSubView(_objectSpread({},props,{style:style}),'right',_this.renderRightComponent,_this.props.rightInterpolator);};_this.renderBackground=function(props){var _props$scene=props.scene,index=_props$scene.index,options=_props$scene.descriptor.options;var offset=_this.props.navigation.state.index-index;if(Math.abs(offset)>2){return null;}return _this.renderSubView(_objectSpread({},props,{style:_reactNative.StyleSheet.absoluteFill}),'background',function(){return options.headerBackground;},_this.props.backgroundInterpolator);};_this.renderModularSubView=function(props,name,renderer,labelStyleInterpolator,buttonStyleInterpolator){var scene=props.scene;var index=scene.index,isStale=scene.isStale,key=scene.key;if(index===0){return;}var offset=_this.props.navigation.state.index-index;if(Math.abs(offset)>2){return null;}var ButtonContainer=function ButtonContainer(_ref){var children=_ref.children;return React.createElement(_reactNative.Animated.View,{style:[buttonStyleInterpolator(_objectSpread({},_this.props,{},props))],__source:{fileName:_jsxFileName,lineNumber:480}},children);};var LabelContainer=function LabelContainer(_ref2){var children=_ref2.children;return React.createElement(_reactNative.Animated.View,{style:[labelStyleInterpolator(_objectSpread({},_this.props,{},props))],__source:{fileName:_jsxFileName,lineNumber:488}},children);};var subView=renderer(props,ButtonContainer,LabelContainer);if(subView===null){return subView;}var pointerEvents=offset!==0||isStale?'none':'box-none';return React.createElement(_reactNative.View,{key:name+"_"+key,pointerEvents:pointerEvents,style:[styles.item,styles[name],props.style],__source:{fileName:_jsxFileName,lineNumber:508}},subView);};_this.renderSubView=function(props,name,renderer,styleInterpolator){var scene=props.scene;var index=scene.index,isStale=scene.isStale,key=scene.key;var offset=_this.props.navigation.state.index-index;if(Math.abs(offset)>2){return null;}var subView=renderer(props);if(subView==null){return null;}var pointerEvents=offset!==0||isStale?'none':'box-none';return React.createElement(_reactNative.Animated.View,{pointerEvents:pointerEvents,key:name+"_"+key,style:[styles.item,styles[name],props.style,styleInterpolator&&styleInterpolator(_objectSpread({},_this.props,{},props))],__source:{fileName:_jsxFileName,lineNumber:544}},subView);};_this.renderHeader=function(props){var options=props.scene.descriptor.options;if(options.header===null||options.headerShown===false){return null;}var left=_this.renderLeft(props);var right=_this.renderRight(props);var title=_this.renderTitle(props,{hasLeftComponent:!!left,hasRightComponent:!!right,headerTitleContainerStyle:options.headerTitleContainerStyle});var transitionPreset=_this.props.transitionPreset;var wrapperProps={style:styles.header,key:"scene_"+props.scene.key};if(options.headerLeft||options.headerBackImage||_reactNative.Platform.OS!=='ios'||transitionPreset!=='uikit'){return React.createElement(_reactNative.View,(0,_extends2.default)({},wrapperProps,{__source:{fileName:_jsxFileName,lineNumber:590}}),title,left,right);}else{return React.createElement(_reactNative.MaskedViewIOS,(0,_extends2.default)({},wrapperProps,{maskElement:React.createElement(_reactNative.View,{style:styles.iconMaskContainer,__source:{fileName:_jsxFileName,lineNumber:601}},React.createElement(_reactNative.Image,{source:require('../assets/back-icon-mask.png'),style:styles.iconMask,__source:{fileName:_jsxFileName,lineNumber:602}}),React.createElement(_reactNative.View,{style:styles.iconMaskFillerRect,__source:{fileName:_jsxFileName,lineNumber:606}})),__source:{fileName:_jsxFileName,lineNumber:598}}),title,left,right);}};return _this;}(0,_createClass2.default)(Header,[{key:"getHeaderTitleString",value:function getHeaderTitleString(scene){var options=scene.descriptor.options;if(typeof options.headerTitle==='string'){return options.headerTitle;}if(options.title&&typeof options.title!=='string'&&__DEV__){throw new Error("Invalid title for route \""+scene.route.routeName+"\" - title must be string or null, instead it was of type "+typeof options.title);}return options.title;}},{key:"getLastScene",value:function getLastScene(scene){return this.props.scenes.find(function(s){return s.index===scene.index-1;});}},{key:"getBackButtonTitleString",value:function getBackButtonTitleString(scene){var lastScene=this.getLastScene(scene);if(!lastScene){return null;}var headerBackTitle=lastScene.descriptor.options.headerBackTitle;if(headerBackTitle||headerBackTitle===null){return headerBackTitle;}return this.getHeaderTitleString(lastScene);}},{key:"getTruncatedBackButtonTitle",value:function getTruncatedBackButtonTitle(scene){var lastScene=this.getLastScene(scene);if(!lastScene){return null;}return lastScene.descriptor.options.headerTruncatedBackTitle;}},{key:"render",value:function render(){var _this2=this;var appBar;var background;var _this$props2=this.props,mode=_this$props2.mode,scene=_this$props2.scene,isLandscape=_this$props2.isLandscape;if(mode==='float'){var scenesByIndex={};this.props.scenes.forEach(function(scene){scenesByIndex[scene.index]=scene;});var scenesProps=Object.values(scenesByIndex).map(function(scene){return{position:_this2.props.position,scene:scene};});appBar=scenesProps.map(function(props){return _this2.renderHeader(props);});background=scenesProps.map(function(props){return _this2.renderBackground(props);});}else{var headerProps={position:new _reactNative.Animated.Value(this.props.scene.index),scene:this.props.scene};appBar=this.renderHeader(headerProps);background=this.renderBackground(headerProps);}var options=scene.descriptor.options;var _options$headerStyle=options.headerStyle,headerStyle=_options$headerStyle===void 0?{}:_options$headerStyle;var headerStyleObj=_reactNative.StyleSheet.flatten(headerStyle);var appBarHeight=getAppBarHeight(isLandscape);var alignItems=headerStyleObj.alignItems,justifyContent=headerStyleObj.justifyContent,flex=headerStyleObj.flex,flexDirection=headerStyleObj.flexDirection,flexGrow=headerStyleObj.flexGrow,flexShrink=headerStyleObj.flexShrink,flexBasis=headerStyleObj.flexBasis,flexWrap=headerStyleObj.flexWrap,position=headerStyleObj.position,padding=headerStyleObj.padding,paddingHorizontal=headerStyleObj.paddingHorizontal,paddingRight=headerStyleObj.paddingRight,paddingLeft=headerStyleObj.paddingLeft,top=headerStyleObj.top,right=headerStyleObj.right,bottom=headerStyleObj.bottom,left=headerStyleObj.left,safeHeaderStyle=(0,_objectWithoutProperties2.default)(headerStyleObj,["alignItems","justifyContent","flex","flexDirection","flexGrow","flexShrink","flexBasis","flexWrap","position","padding","paddingHorizontal","paddingRight","paddingLeft","top","right","bottom","left"]);if(__DEV__){warnIfHeaderStyleDefined(alignItems,'alignItems');warnIfHeaderStyleDefined(justifyContent,'justifyContent');warnIfHeaderStyleDefined(flex,'flex');warnIfHeaderStyleDefined(flexDirection,'flexDirection');warnIfHeaderStyleDefined(flexGrow,'flexGrow');warnIfHeaderStyleDefined(flexShrink,'flexShrink');warnIfHeaderStyleDefined(flexBasis,'flexBasis');warnIfHeaderStyleDefined(flexWrap,'flexWrap');warnIfHeaderStyleDefined(padding,'padding');warnIfHeaderStyleDefined(position,'position');warnIfHeaderStyleDefined(paddingHorizontal,'paddingHorizontal');warnIfHeaderStyleDefined(paddingRight,'paddingRight');warnIfHeaderStyleDefined(paddingLeft,'paddingLeft');warnIfHeaderStyleDefined(top,'top');warnIfHeaderStyleDefined(right,'right');warnIfHeaderStyleDefined(bottom,'bottom');warnIfHeaderStyleDefined(left,'left');}var isDark=this.context==='dark';var containerStyles=[options.headerTransparent?isDark?styles.transparentContainerDark:styles.transparentContainerLight:isDark?styles.containerDark:styles.containerLight,{height:appBarHeight},safeHeaderStyle];var headerForceInset=options.headerForceInset;var forceInset=headerForceInset||{top:'always',bottom:'never',horizontal:'always'};var backgroundColor=safeHeaderStyle.backgroundColor;if(!backgroundColor){backgroundColor=isDark?_reactNavigation.ThemeColors.dark.header:_reactNavigation.ThemeColors.light.header;}return React.createElement(_reactNative.Animated.View,{style:[this.props.layoutInterpolator(this.props),_reactNative.Platform.OS==='ios'&&!options.headerTransparent?{backgroundColor:backgroundColor}:null],__source:{fileName:_jsxFileName,lineNumber:727}},React.createElement(_reactNavigation.SafeAreaView,{forceInset:forceInset,style:containerStyles,__source:{fileName:_jsxFileName,lineNumber:735}},background,React.createElement(_reactNative.View,{style:styles.flexOne,__source:{fileName:_jsxFileName,lineNumber:737}},appBar)));}}]);return Header;}(React.PureComponent);Header.contextType=_reactNavigation.ThemeContext;Header.defaultProps={layoutInterpolator:_HeaderStyleInterpolator.default.forLayout,leftInterpolator:_HeaderStyleInterpolator.default.forLeft,leftButtonInterpolator:_HeaderStyleInterpolator.default.forLeftButton,leftLabelInterpolator:_HeaderStyleInterpolator.default.forLeftLabel,titleFromLeftInterpolator:_HeaderStyleInterpolator.default.forCenterFromLeft,titleInterpolator:_HeaderStyleInterpolator.default.forCenter,rightInterpolator:_HeaderStyleInterpolator.default.forRight,backgroundInterpolator:_HeaderStyleInterpolator.default.forBackground};function warnIfHeaderStyleDefined(value,styleProp){if(styleProp==='position'&&value==='absolute'){console.warn("position: 'absolute' is not supported on headerStyle. If you would like to render content under the header, use the headerTransparent navigationOption.");}else if(value!==undefined){console.warn(styleProp+" was given a value of "+value+", this has no effect on headerStyle.");}}var platformContainerStylesLight=_reactNative.Platform.select({android:{elevation:4},web:{boxShadow:"0 2px 4px -1px rgba(0,0,0,0.2), 0 4px 5px 0 rgba(0,0,0,0.14), 0 1px 10px 0 rgba(0,0,0,0.12)"},default:{borderBottomWidth:_reactNative.StyleSheet.hairlineWidth,borderBottomColor:_reactNavigation.ThemeColors.light.headerBorder}});var platformContainerStylesDark=_reactNative.Platform.select({android:{elevation:4},web:{boxShadow:"0 2px 4px -1px rgba(0,0,0,0.2), 0 4px 5px 0 rgba(0,0,0,0.14), 0 1px 10px 0 rgba(0,0,0,0.12)"},default:{borderBottomWidth:_reactNative.StyleSheet.hairlineWidth,borderBottomColor:_reactNavigation.ThemeColors.dark.headerBorder}});var styles=_reactNative.StyleSheet.create({containerLight:_objectSpread({},platformContainerStylesLight,{backgroundColor:_reactNavigation.ThemeColors.light.header}),containerDark:_objectSpread({},platformContainerStylesDark,{backgroundColor:_reactNavigation.ThemeColors.dark.header}),transparentContainerLight:_objectSpread({},platformContainerStylesLight,{position:'absolute',top:0,left:0,right:0,borderBottomWidth:0,borderBottomColor:'transparent',elevation:0}),transparentContainerDark:_objectSpread({},platformContainerStylesDark,{position:'absolute',top:0,left:0,right:0,borderBottomWidth:0,borderBottomColor:'transparent',elevation:0}),header:_objectSpread({},_reactNative.StyleSheet.absoluteFillObject,{flexDirection:'row'}),item:{backgroundColor:'transparent'},iconMaskContainer:{flex:1,flexDirection:'row',justifyContent:'center'},iconMaskFillerRect:{flex:1,backgroundColor:'#d8d8d8',marginLeft:-5},iconMask:{height:23,width:14.5,marginLeft:8.5,marginTop:-2.5,alignSelf:'center',resizeMode:'contain',transform:[{scaleX:_reactNative.I18nManager.isRTL?-1:1}]},background:{},title:{bottom:0,top:0,position:'absolute',alignItems:'center',flexDirection:'row'},left:{left:0,bottom:0,top:0,position:'absolute',alignItems:'center',flexDirection:'row'},right:{right:0,bottom:0,top:0,position:'absolute',flexDirection:'row',alignItems:'center'},flexOne:{flex:1}});var _default=(0,_extends2.default)((0,_reactNavigation.withOrientation)(Header),{get HEIGHT(){return APPBAR_HEIGHT+STATUSBAR_HEIGHT;}});exports.default=_default;
//# sourceMappingURL=Header.js.map