diff --git a/.flowconfig b/.flowconfig index c6f0b5b..a493b62 100644 --- a/.flowconfig +++ b/.flowconfig @@ -28,6 +28,7 @@ .*/example/node_modules/fbjs .*/example/node_modules/react .*/example/node_modules/react-native +.*/example/node_modules/exponent .*/example/\.buckd/ [include] @@ -50,6 +51,7 @@ experimental.strict_type_args=true munge_underscores=true +module.name_mapper='^exponent$' -> 'emptyObject' module.name_mapper='^image![a-zA-Z0-9$_-]+$' -> 'GlobalImageStub' module.name_mapper='^[./a-zA-Z0-9$_-]+\.\(bmp\|gif\|jpg\|jpeg\|png\|psd\|svg\|webp\|m4v\|mov\|mp4\|mpeg\|mpg\|webm\|aac\|aiff\|caf\|m4a\|mp3\|wav\|html\|pdf\)$' -> 'RelativeImageStub' diff --git a/example/main.js b/example/main.js index d8c3ad1..cd15f0e 100644 --- a/example/main.js +++ b/example/main.js @@ -1,27 +1,24 @@ -import Exponent from 'exponent'; -import React from 'react'; -import { - StyleSheet, - Text, - View, -} from 'react-native'; +/* @flow */ -class App extends React.Component { +import Exponent from 'exponent'; +import React, { Component } from 'react'; +import { + NavigationProvider, + StackNavigation, +} from '@exponent/ex-navigation'; +import { ThemeProvider } from 'react-native-paper'; +import Router from './src/Router'; + +class App extends Component { render() { return ( - - React Native Paper will rock :D - + + + + + ); } } -const styles = StyleSheet.create({ - container: { - flex: 1, - marginTop: 24, - alignItems: 'center', - }, -}); - Exponent.registerRootComponent(App); diff --git a/example/package.json b/example/package.json index bd87232..c4e8a50 100644 --- a/example/package.json +++ b/example/package.json @@ -6,6 +6,8 @@ "private": true, "main": "main.js", "dependencies": { + "@exponent/ex-navigation": "^1.7.0", + "@exponent/vector-icons": "^1.0.4", "exponent": "^10.0.4", "react": "~15.3.2", "react-native": "github:exponentjs/react-native#sdk-10.1.2", diff --git a/example/src/ExampleList.js b/example/src/ExampleList.js new file mode 100644 index 0000000..3ad6b86 --- /dev/null +++ b/example/src/ExampleList.js @@ -0,0 +1,52 @@ +/* @flow */ + +import React, { Component } from 'react'; +import { + View, + Text, + StyleSheet, +} from 'react-native'; +import { Colors, TouchableRipple } from 'react-native-paper'; +import RipplesExample from './RipplesExample'; + +export const examples = { + ripples: RipplesExample, +}; + +export default class ExampleList extends Component { + + static route = { + navigationBar: { + title: 'Examples', + }, + }; + + render() { + return ( + + {Object.keys(examples).map(id => ( + this.props.navigator.push(id)} + > + {examples[id].title} + + ))} + + ); + } +} + +const styles = StyleSheet.create({ + item: { + padding: 16, + borderBottomColor: Colors.grey300, + borderBottomWidth: StyleSheet.hairlineWidth, + }, + + text: { + fontSize: 16, + fontWeight: 'bold', + }, +}); diff --git a/example/src/RipplesExample.js b/example/src/RipplesExample.js new file mode 100644 index 0000000..d3eb0e1 --- /dev/null +++ b/example/src/RipplesExample.js @@ -0,0 +1,12 @@ +/* @flow */ + +import { Component } from 'react'; + +export default class RipplesExample extends Component { + + static title = 'Ripples'; + + render() { + return null; + } +} diff --git a/example/src/Router.js b/example/src/Router.js new file mode 100644 index 0000000..56a90e0 --- /dev/null +++ b/example/src/Router.js @@ -0,0 +1,32 @@ +/* @flow */ + +import React from 'react'; +import { + createRouter, +} from '@exponent/ex-navigation'; +import ExampleList, { examples } from './ExampleList'; + +const routes = Object.keys(examples) + .map(id => ({ id, item: examples[id] })) + .reduce((acc, { id, item }) => { + const Comp = item; + const Screen = props => ; + + Screen.route = { + navigationBar: { + title: Comp.title, + } + }; + + return { + ...acc, + [id]: () => Screen, + }; + }, {}); + +const Router = createRouter(() => ({ + home: () => ExampleList, + ...routes, +})); + +export default Router; diff --git a/index.js b/index.js index 0e6f3c6..378a1d3 100644 --- a/index.js +++ b/index.js @@ -1,3 +1,7 @@ -// @flow -export { default as ThemeProvider } from './src/styles/ThemeProvider'; -export { default as TouchableRipple } from './src/TouchableRipple'; +/* @flow */ + +export { default as ThemeProvider } from './src/core/ThemeProvider'; + +export * as Colors from './src/styles/colors.js'; + +export { default as TouchableRipple } from './src/components/TouchableRipple'; diff --git a/src/TouchableRipple/TouchableRipple.android.js b/src/TouchableRipple/TouchableRipple.android.js deleted file mode 100644 index 078ab9f..0000000 --- a/src/TouchableRipple/TouchableRipple.android.js +++ /dev/null @@ -1,46 +0,0 @@ -// @flow -import React, { - Component, - PropTypes, - Platform, -} from 'react'; -import { - TouchableNativeFeedback, - View, -} from 'react-native'; - -export default class TouchableRipple extends Component { - - static propTypes = { - children: PropTypes.element.isRequired, - borderless: PropTypes.bool, - onPress: PropTypes.func, - rippleColor: PropTypes.string, - style: View.propTypes.style, - }; - static defaultProps = { - borderless: false, - } - - render() { - const { - children, - onPress, - rippleColor, - borderless, - style, - } = this.props; - return ( - = 21 ? - TouchableNativeFeedback.Ripple(rippleColor, borderless) : - TouchableNativeFeedback.SelectableBackground()} - > - - {children} - - - ); - } -} diff --git a/src/TouchableRipple/index.js b/src/TouchableRipple/index.js deleted file mode 100644 index 94fbe43..0000000 --- a/src/TouchableRipple/index.js +++ /dev/null @@ -1 +0,0 @@ -export default from './TouchableRipple'; diff --git a/src/components/TouchableRipple/TouchableRipple.android.js b/src/components/TouchableRipple/TouchableRipple.android.js new file mode 100644 index 0000000..aacc033 --- /dev/null +++ b/src/components/TouchableRipple/TouchableRipple.android.js @@ -0,0 +1,61 @@ +/* @flow */ + +import React, { + Component, + PropTypes, +} from 'react'; +import { + TouchableNativeFeedback, + View, + Platform, +} from 'react-native'; + +type Props = { + borderless: boolean; + onPress?: ?Function; + rippleColor?: string; + children?: any; + style?: any; +} + +type DefaultProps = { + borderless: boolean; +} + +export default class TouchableRipple extends Component { + + static propTypes = { + children: PropTypes.element.isRequired, + borderless: PropTypes.bool, + onPress: PropTypes.func, + rippleColor: PropTypes.string, + style: View.propTypes.style, + }; + + static defaultProps = { + borderless: false, + } + + render() { + const { + children, + onPress, + rippleColor, + borderless, + style, + } = this.props; + + return ( + = 21 ? + TouchableNativeFeedback.Ripple(rippleColor, borderless) : + TouchableNativeFeedback.SelectableBackground()} + > + + {children} + + + ); + } +} diff --git a/src/TouchableRipple/TouchableRipple.js b/src/components/TouchableRipple/TouchableRipple.js similarity index 54% rename from src/TouchableRipple/TouchableRipple.js rename to src/components/TouchableRipple/TouchableRipple.js index 9db41cf..110e3dd 100644 --- a/src/TouchableRipple/TouchableRipple.js +++ b/src/components/TouchableRipple/TouchableRipple.js @@ -1,4 +1,5 @@ -// @flow +/* @flow */ + import React, { Component, PropTypes, @@ -8,15 +9,28 @@ import { View, } from 'react-native'; -export default class TouchableRipple extends Component { +type Props = { + borderless: boolean; + onPress?: ?Function; + rippleColor?: string; + children?: any; + style?: any; +} + +type DefaultProps = { + borderless: boolean; +} + +export default class TouchableRipple extends Component { static propTypes = { - children: PropTypes.element.isRequired, borderless: PropTypes.bool, onPress: PropTypes.func, rippleColor: PropTypes.string, + children: PropTypes.element.isRequired, style: View.propTypes.style, }; + static defaultProps = { borderless: false, } @@ -28,14 +42,15 @@ export default class TouchableRipple extends Component { rippleColor, style, } = this.props; + return ( - - {children} - + + {children} + ); } } diff --git a/src/components/TouchableRipple/index.js b/src/components/TouchableRipple/index.js new file mode 100644 index 0000000..ca477b1 --- /dev/null +++ b/src/components/TouchableRipple/index.js @@ -0,0 +1,3 @@ +/* @flow */ + +export { default as default } from './TouchableRipple'; diff --git a/src/core/ThemeProvider.js b/src/core/ThemeProvider.js new file mode 100644 index 0000000..e3c4e0e --- /dev/null +++ b/src/core/ThemeProvider.js @@ -0,0 +1,31 @@ +/* @flow */ + +import { + Component, + PropTypes, + Children, +} from 'react'; +import DefaultTheme from '../styles/DefaultTheme'; + +export default class ThemeProvider extends Component { + + static propTypes = { + children: PropTypes.node.isRequired, + theme: PropTypes.object, + }; + + static childContextTypes = { + theme: PropTypes.object, + }; + + getChildContext() { + return { + theme: this.props.theme || DefaultTheme, + }; + } + + render() { + return Children.only(this.props.children); + } +} + diff --git a/src/styles/DefaultTheme.js b/src/styles/DefaultTheme.js index a0618ec..53c4b33 100644 --- a/src/styles/DefaultTheme.js +++ b/src/styles/DefaultTheme.js @@ -6,12 +6,8 @@ import { pinkA200, } from './colors'; -const DefaultTheme = () => { - return { - primaryColor: indigo500, - primaryDarkColor: indigo700, - accentColor: pinkA200, - }; +export default { + primaryColor: indigo500, + primaryDarkColor: indigo700, + accentColor: pinkA200, }; - -export default DefaultTheme; diff --git a/src/styles/ThemeProvider.js b/src/styles/ThemeProvider.js deleted file mode 100644 index 94f04dd..0000000 --- a/src/styles/ThemeProvider.js +++ /dev/null @@ -1,32 +0,0 @@ -// @flow - -import { - Component, - PropTypes, -} from 'react'; -import DefaultTheme from './DefaultTheme'; - - -class ThemeProvider extends Component { - - static propTypes = { - children: PropTypes.element, - theme: PropTypes.object, - }; - - static childContextTypes = { - theme: PropTypes.object, - }; - - getChildContext() { - return { - theme: this.props.theme || DefaultTheme(), - }; - } - - render() { - return this.props.children; - } -} - -export default ThemeProvider; diff --git a/src/styles/colors.js b/src/styles/colors.js index 31551f2..5d234af 100644 --- a/src/styles/colors.js +++ b/src/styles/colors.js @@ -1,3 +1,5 @@ +/* @flow */ + export const red50 = '#ffebee'; export const red100 = '#ffcdd2'; export const red200 = '#ef9a9a';