diff --git a/index.android.js b/index.android.js index 10277d8..b1c97ad 100644 --- a/index.android.js +++ b/index.android.js @@ -4,62 +4,21 @@ * @flow */ -import React, { Component } from "react"; -import { AppRegistry, Navigator, Text, View, UIManager } from "react-native"; -import { ThemeProvider, Toolbar } from "react-native-material-ui"; -import uiTheme from "./js/ui-theme"; -import SideMenu from "react-native-side-menu"; -import DrawerMenu from "./js/DrawerMenu"; +import React, { Component } from 'react'; +import { AppRegistry, Navigator, UIManager } from 'react-native'; +import routes from './js/routes'; +import App from './js/App'; -UIManager.setLayoutAnimationEnabledExperimental && - UIManager.setLayoutAnimationEnabledExperimental(true); +UIManager.setLayoutAnimationEnabledExperimental && UIManager.setLayoutAnimationEnabledExperimental(true); export default class AreThereCookies extends Component { - state = { drawerOpen: false }; + static displayName = 'AreThereCookies'; - toggleSideMenu = () => { - this.setState(({ drawerOpen }) => ({ drawerOpen: !drawerOpen })); - }; + renderScene = (route, navigator) => ; - setSideMenuOpen = (drawerOpen: boolean) => { - this.setState({ drawerOpen }); - }; - - render() { - const { drawerOpen } = this.state; - return ( - - { - const menu = ; - return ( - - - - - Scene content will go here... - - - - ); - }} - /> - - ); - } + render() { + return ; + } } -AppRegistry.registerComponent("AreThereCookies", () => AreThereCookies); +AppRegistry.registerComponent('AreThereCookies', () => AreThereCookies); diff --git a/js/App.js b/js/App.js new file mode 100644 index 0000000..f49e99a --- /dev/null +++ b/js/App.js @@ -0,0 +1,66 @@ +//@flow +import React, { Component } from 'react'; +import { View } from 'react-native'; +import { ThemeProvider, Toolbar } from 'react-native-material-ui'; +import theme from './ui-theme'; +import SideMenu from 'react-native-side-menu'; +import DrawerMenu from './pages/DrawerMenu'; +import { routingContextTypes } from './routes'; + +type Props = { + route: Object, + navigator: Object, +}; + +type State = { + drawerOpen: boolean, +}; + +export default class App extends Component { + state = { drawerOpen: false }; + + props: Props; + + state: State; + + getChildContext() { + const { navigator, route } = this.props; + return { navigator, route }; + } + + toggleSideMenu = () => { + this.setState(({ drawerOpen }) => ({ drawerOpen: !drawerOpen })); + }; + + setSideMenuOpen = (drawerOpen: boolean) => { + this.setState({ drawerOpen }); + }; + + render() { + const { navigator, route } = this.props; + const { drawerOpen } = this.state; + return ( + + } + isOpen={drawerOpen} + onChange={this.setSideMenuOpen} + > + + + + + + + ); + } +} +App.childContextTypes = routingContextTypes; diff --git a/js/DrawerMenu.js b/js/DrawerMenu.js deleted file mode 100644 index c2a24b3..0000000 --- a/js/DrawerMenu.js +++ /dev/null @@ -1,39 +0,0 @@ -// @flow -import React, { Component } from "react"; -import { Drawer, Avatar } from "react-native-material-ui"; - -type Props = { - navigator: Object, - route: { index: number, title: string, page: string } -}; - -export default class DrawerMenu extends Component { - static displayName = "DrawerMenu"; - - props: Props; - - render() { - return ( - - - } - footer={{ - dense: true, - centerElement: { primaryText: "User Name" } - }} - /> - - - - ); - } -} diff --git a/js/pages/DrawerMenu.js b/js/pages/DrawerMenu.js new file mode 100644 index 0000000..a26318b --- /dev/null +++ b/js/pages/DrawerMenu.js @@ -0,0 +1,50 @@ +// @flow +import React, { Component } from 'react'; +import { Drawer, Avatar } from 'react-native-material-ui'; +import routes from '../routes'; + +type Props = { + navigator: Object, + route: Object, +}; + +export default class DrawerMenu extends Component { + static displayName = 'DrawerMenu'; + + props: Props; + + chooseItem = routeKey => () => { + if (routeKey === 'logout') { + navigator.immediatelyResetRouteStack(); + } + + const { navigator } = this.props; + const newRoute = routes[routeKey]; + navigator.replace(newRoute); + }; + + render() { + return ( + + + } + footer={{ + dense: true, + centerElement: { primaryText: 'User Name' }, + }} + /> + + + + ); + } +} diff --git a/js/pages/Faves.js b/js/pages/Faves.js new file mode 100644 index 0000000..dfd6e6f --- /dev/null +++ b/js/pages/Faves.js @@ -0,0 +1,23 @@ +// @flow +import React, { Component } from 'react'; +import { Text, View } from 'react-native'; +import theme from '../ui-theme'; + +type Props = { + route: Object, + navigator: Object, +}; + +export default class Faves extends Component { + static displayName = 'Faves'; + + props: Props; + + render() { + return ( + + Faves! + + ); + } +} diff --git a/js/pages/Food.js b/js/pages/Food.js new file mode 100644 index 0000000..2954fca --- /dev/null +++ b/js/pages/Food.js @@ -0,0 +1,23 @@ +// @flow +import React, { Component } from 'react'; +import { Text, View } from 'react-native'; +import theme from '../ui-theme'; + +type Props = { + route: Object, + navigator: Object, +}; + +export default class Food extends Component { + static displayName = 'Food'; + + props: Props; + + render() { + return ( + + Food! + + ); + } +} diff --git a/js/pages/Places.js b/js/pages/Places.js new file mode 100644 index 0000000..a15605a --- /dev/null +++ b/js/pages/Places.js @@ -0,0 +1,23 @@ +// @flow +import React, { Component } from 'react'; +import { Text, View } from 'react-native'; +import theme from '../ui-theme'; + +type Props = { + route: Object, + navigator: Object, +}; + +export default class Places extends Component { + static displayName = 'Places'; + + props: Props; + + render() { + return ( + + Places! + + ); + } +} diff --git a/js/routes.js b/js/routes.js new file mode 100644 index 0000000..1218f62 --- /dev/null +++ b/js/routes.js @@ -0,0 +1,42 @@ +// @flow +import { PropTypes } from 'react'; +import Food from './pages/Food'; +import Places from './pages/Places'; +import Faves from './pages/Faves'; + +const { + shape, + func, + string, +} = PropTypes; + +export default { + food: { + title: 'Food', + component: Food, + icon: 'local-pizza', + }, + places: { + title: 'Places', + component: Places, + icon: 'domain', + }, + faves: { + title: 'Faves', + component: Faves, + icon: 'stars', + }, +}; + +export const routingContextTypes = { + navigator: shape({ + push: func, + replace: func, + immediatelyResetRouteStack: func, + }), + route: shape({ + title: string, + component: func, + icon: string, + }), +}; diff --git a/js/ui-theme.js b/js/ui-theme.js index 8146ea0..d5e327f 100644 --- a/js/ui-theme.js +++ b/js/ui-theme.js @@ -3,18 +3,21 @@ * Default theme for reference: * https://github.com/xotahal/react-native-material-ui/blob/master/src/styles/themes/light.js */ -import { COLOR } from "react-native-material-ui"; +import { COLOR } from 'react-native-material-ui'; export default { - palette: { - primaryColor: COLOR.orange500, - accentColor: COLOR.teal500, - disabledColor: COLOR.grey500 - }, - toolbar: { - titleText: { color: COLOR.grey800 }, - leftElement: { color: COLOR.grey800 }, - rightElement: { color: COLOR.grey800 }, - container: { backgroundColor: COLOR.grey200, height: 50 } - } + palette: { + primaryColor: COLOR.orange500, + accentColor: COLOR.teal500, + disabledColor: COLOR.grey500, + }, + toolbar: { + titleText: { color: COLOR.grey800 }, + leftElement: { color: COLOR.grey800 }, + rightElement: { color: COLOR.grey800 }, + container: { backgroundColor: COLOR.grey200, height: 50 }, + }, + page: { + container: { flex: 1, backgroundColor: COLOR.white }, + }, };