1
1
import React from 'react' ;
2
- import { Animated , Dimensions , Platform , StatusBar , StyleSheet , View } from 'react-native' ;
2
+ import {
3
+ Animated ,
4
+ Dimensions ,
5
+ Platform ,
6
+ StatusBar ,
7
+ StyleSheet ,
8
+ View ,
9
+ } from 'react-native' ;
3
10
import { withNavigation , HeaderBackButton } from 'react-navigation' ;
4
- import { getStatusBarHeight } from 'react-native-safe-area-view' ;
5
- import { isIphoneX } from 'react-native-iphone-x-helper'
11
+ import { getInset , getStatusBarHeight } from 'react-native-safe-area-view' ;
12
+ import { isIphoneX } from 'react-native-iphone-x-helper' ;
6
13
7
14
// @todo : make this work properly when in landscape
8
15
const hasNotch = isIphoneX ( ) ;
9
16
10
17
const APPBAR_HEIGHT = Platform . OS === 'ios' ? 50 : 56 ;
11
18
const TITLE_OFFSET = Platform . OS === 'ios' ? 70 : 56 ;
12
19
13
- // @todo : this is static and we don't know if it's visible or not on iOS.
14
- // need to use a more reliable and cross-platform API when one exists, like
15
- // LayoutContext. We also don't know if it's translucent or not on Android
16
- // and depend on react-native-safe-area-view to tell us.
17
- const ANDROID_STATUS_BAR_HEIGHT = getStatusBarHeight ? getStatusBarHeight ( ) : StatusBar . currentHeight ;
18
- const STATUSBAR_HEIGHT = Platform . OS === 'ios' ? ( hasNotch ? 40 : 25 ) : ANDROID_STATUS_BAR_HEIGHT ;
19
-
20
20
@withNavigation
21
21
export default class Header extends React . PureComponent {
22
- static HEIGHT = APPBAR_HEIGHT + STATUSBAR_HEIGHT ;
22
+ constructor ( props ) {
23
+ super ( props ) ;
24
+
25
+ // @todo : this is static and we don't know if it's visible or not on iOS.
26
+ // need to use a more reliable and cross-platform API when one exists, like
27
+ // LayoutContext. We also don't know if it's translucent or not on Android
28
+ // and depend on react-native-safe-area-view to tell us.
29
+ const ANDROID_STATUS_BAR_HEIGHT = getStatusBarHeight
30
+ ? getStatusBarHeight ( )
31
+ : StatusBar . currentHeight ;
32
+ const STATUSBAR_HEIGHT =
33
+ Platform . OS === 'ios' ? ( hasNotch ? 40 : 25 ) : ANDROID_STATUS_BAR_HEIGHT ;
34
+
35
+ let platformContainerStyles ;
36
+ if ( Platform . OS === 'ios' ) {
37
+ platformContainerStyles = {
38
+ borderBottomWidth : StyleSheet . hairlineWidth ,
39
+ borderBottomColor : '#A7A7AA' ,
40
+ } ;
41
+ } else {
42
+ platformContainerStyles = {
43
+ shadowColor : 'black' ,
44
+ shadowOpacity : 0.1 ,
45
+ shadowRadius : StyleSheet . hairlineWidth ,
46
+ shadowOffset : {
47
+ height : StyleSheet . hairlineWidth ,
48
+ } ,
49
+ elevation : 4 ,
50
+ } ;
51
+ }
52
+
53
+ this . styles = {
54
+ container : {
55
+ backgroundColor : '#fff' ,
56
+ paddingTop : STATUSBAR_HEIGHT ,
57
+ height : STATUSBAR_HEIGHT + APPBAR_HEIGHT ,
58
+ ...platformContainerStyles ,
59
+ } ,
60
+ appBar : {
61
+ flex : 1 ,
62
+ } ,
63
+ header : {
64
+ flexDirection : 'row' ,
65
+ } ,
66
+ item : {
67
+ justifyContent : 'center' ,
68
+ alignItems : 'center' ,
69
+ backgroundColor : 'transparent' ,
70
+ } ,
71
+ title : {
72
+ bottom : 0 ,
73
+ left : TITLE_OFFSET ,
74
+ right : TITLE_OFFSET ,
75
+ top : 0 ,
76
+ position : 'absolute' ,
77
+ alignItems : Platform . OS === 'ios' ? 'center' : 'flex-start' ,
78
+ } ,
79
+ left : {
80
+ left : 0 ,
81
+ bottom : 0 ,
82
+ top : 0 ,
83
+ position : 'absolute' ,
84
+ } ,
85
+ right : {
86
+ right : 0 ,
87
+ bottom : 0 ,
88
+ top : 0 ,
89
+ position : 'absolute' ,
90
+ } ,
91
+ } ;
92
+ }
23
93
24
94
_navigateBack = ( ) => {
25
95
this . props . navigation . goBack ( null ) ;
@@ -43,6 +113,7 @@ export default class Header extends React.PureComponent {
43
113
} ;
44
114
45
115
render ( ) {
116
+ let { styles } = this ;
46
117
let headerStyle = { } ;
47
118
if ( this . props . backgroundColor ) {
48
119
headerStyle . backgroundColor = this . props . backgroundColor ;
@@ -60,61 +131,3 @@ export default class Header extends React.PureComponent {
60
131
) ;
61
132
}
62
133
}
63
-
64
- let platformContainerStyles ;
65
- if ( Platform . OS === 'ios' ) {
66
- platformContainerStyles = {
67
- borderBottomWidth : StyleSheet . hairlineWidth ,
68
- borderBottomColor : '#A7A7AA' ,
69
- } ;
70
- } else {
71
- platformContainerStyles = {
72
- shadowColor : 'black' ,
73
- shadowOpacity : 0.1 ,
74
- shadowRadius : StyleSheet . hairlineWidth ,
75
- shadowOffset : {
76
- height : StyleSheet . hairlineWidth ,
77
- } ,
78
- elevation : 4 ,
79
- } ;
80
- }
81
-
82
- const styles = StyleSheet . create ( {
83
- container : {
84
- backgroundColor : '#fff' ,
85
- paddingTop : STATUSBAR_HEIGHT ,
86
- height : STATUSBAR_HEIGHT + APPBAR_HEIGHT ,
87
- ...platformContainerStyles ,
88
- } ,
89
- appBar : {
90
- flex : 1 ,
91
- } ,
92
- header : {
93
- flexDirection : 'row' ,
94
- } ,
95
- item : {
96
- justifyContent : 'center' ,
97
- alignItems : 'center' ,
98
- backgroundColor : 'transparent' ,
99
- } ,
100
- title : {
101
- bottom : 0 ,
102
- left : TITLE_OFFSET ,
103
- right : TITLE_OFFSET ,
104
- top : 0 ,
105
- position : 'absolute' ,
106
- alignItems : Platform . OS === 'ios' ? 'center' : 'flex-start' ,
107
- } ,
108
- left : {
109
- left : 0 ,
110
- bottom : 0 ,
111
- top : 0 ,
112
- position : 'absolute' ,
113
- } ,
114
- right : {
115
- right : 0 ,
116
- bottom : 0 ,
117
- top : 0 ,
118
- position : 'absolute' ,
119
- } ,
120
- } ) ;
0 commit comments