diff options
Diffstat (limited to 'app_expo/components/header')
-rw-r--r-- | app_expo/components/header/header.props.ts | 45 | ||||
-rw-r--r-- | app_expo/components/header/header.story.tsx | 43 | ||||
-rw-r--r-- | app_expo/components/header/header.tsx | 61 |
3 files changed, 149 insertions, 0 deletions
diff --git a/app_expo/components/header/header.props.ts b/app_expo/components/header/header.props.ts new file mode 100644 index 0000000..f142656 --- /dev/null +++ b/app_expo/components/header/header.props.ts @@ -0,0 +1,45 @@ +import { StyleProp, TextStyle, ViewStyle } from 'react-native' +import { IconTypes } from '../icon/icons' +import { TxKeyPath } from '../../i18n' + +export interface HeaderProps { + /** + * Main header, e.g. POWERED BY IGNITE + */ + headerTx?: TxKeyPath + + /** + * header non-i18n + */ + headerText?: string + + /** + * Icon that should appear on the left + */ + leftIcon?: IconTypes + + /** + * What happens when you press the left icon + */ + onLeftPress?(): void + + /** + * Icon that should appear on the right + */ + rightIcon?: IconTypes + + /** + * What happens when you press the right icon + */ + onRightPress?(): void + + /** + * Container style overrides. + */ + style?: StyleProp<ViewStyle> + + /** + * Title style overrides. + */ + titleStyle?: StyleProp<TextStyle> +} diff --git a/app_expo/components/header/header.story.tsx b/app_expo/components/header/header.story.tsx new file mode 100644 index 0000000..db87b89 --- /dev/null +++ b/app_expo/components/header/header.story.tsx @@ -0,0 +1,43 @@ +import * as React from 'react' +import { View, Alert } from 'react-native' +import { storiesOf } from '@storybook/react-native' +import { StoryScreen, Story, UseCase } from '../../../storybook/views' +import { Header } from './header' +import { color } from '../../theme' + +declare let module + +const VIEWSTYLE = { + flex: 1, + backgroundColor: color.storybookDarkBg, +} + +storiesOf('Header', module) + .addDecorator((fn) => <StoryScreen>{fn()}</StoryScreen>) + .add('Behavior', () => ( + <Story> + <UseCase noPad text="default" usage="The default usage"> + <View style={VIEWSTYLE}> + <Header headerTx="demoScreen.howTo" /> + </View> + </UseCase> + <UseCase noPad text="leftIcon" usage="A left nav icon"> + <View style={VIEWSTYLE}> + <Header + headerTx="demoScreen.howTo" + leftIcon="back" + onLeftPress={() => Alert.alert('left nav')} + /> + </View> + </UseCase> + <UseCase noPad text="rightIcon" usage="A right nav icon"> + <View style={VIEWSTYLE}> + <Header + headerTx="demoScreen.howTo" + rightIcon="bullet" + onRightPress={() => Alert.alert('right nav')} + /> + </View> + </UseCase> + </Story> + )) diff --git a/app_expo/components/header/header.tsx b/app_expo/components/header/header.tsx new file mode 100644 index 0000000..25e0914 --- /dev/null +++ b/app_expo/components/header/header.tsx @@ -0,0 +1,61 @@ +import React from 'react' +import { View, ViewStyle, TextStyle } from 'react-native' +import { HeaderProps } from './header.props' +import { Button } from '../button/button' +import { Text } from '../text/text' +import { Icon } from '../icon/icon' +import { spacing } from '../../theme' +import { translate } from '../../i18n/' + +// static styles +const ROOT: ViewStyle = { + flexDirection: 'row', + paddingHorizontal: spacing[4], + alignItems: 'center', + paddingTop: spacing[5], + paddingBottom: spacing[5], + justifyContent: 'flex-start', +} +const TITLE: TextStyle = { textAlign: 'center' } +const TITLE_MIDDLE: ViewStyle = { flex: 1, justifyContent: 'center' } +const LEFT: ViewStyle = { width: 32 } +const RIGHT: ViewStyle = { width: 32 } + +/** + * Header that appears on many screens. Will hold navigation buttons and screen title. + */ +export function Header(props: HeaderProps) { + const { + onLeftPress, + onRightPress, + rightIcon, + leftIcon, + headerText, + headerTx, + style, + titleStyle, + } = props + const header = headerText || (headerTx && translate(headerTx)) || '' + + return ( + <View style={[ROOT, style]}> + {leftIcon ? ( + <Button preset="link" onPress={onLeftPress}> + <Icon icon={leftIcon} /> + </Button> + ) : ( + <View style={LEFT} /> + )} + <View style={TITLE_MIDDLE}> + <Text style={[TITLE, titleStyle]} text={header} /> + </View> + {rightIcon ? ( + <Button preset="link" onPress={onRightPress}> + <Icon icon={rightIcon} /> + </Button> + ) : ( + <View style={RIGHT} /> + )} + </View> + ) +} |