summaryrefslogtreecommitdiff
path: root/app/components/header
diff options
context:
space:
mode:
Diffstat (limited to 'app/components/header')
-rw-r--r--app/components/header/header.props.ts45
-rw-r--r--app/components/header/header.story.tsx43
-rw-r--r--app/components/header/header.tsx61
3 files changed, 149 insertions, 0 deletions
diff --git a/app/components/header/header.props.ts b/app/components/header/header.props.ts
new file mode 100644
index 0000000..07f2c4d
--- /dev/null
+++ b/app/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/components/header/header.story.tsx b/app/components/header/header.story.tsx
new file mode 100644
index 0000000..05093b3
--- /dev/null
+++ b/app/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/components/header/header.tsx b/app/components/header/header.tsx
new file mode 100644
index 0000000..b4a6634
--- /dev/null
+++ b/app/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>
+ )
+}