Skip to content

Commit fa84308

Browse files
committed
Initial commit
1 parent ea9fe65 commit fa84308

File tree

20 files changed

+588
-94
lines changed

20 files changed

+588
-94
lines changed

android/app/build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,7 @@ android {
126126
}
127127

128128
dependencies {
129+
compile project(':react-native-firestack')
129130
compile fileTree(dir: "libs", include: ["*.jar"])
130131
compile "com.android.support:appcompat-v7:23.0.1"
131132
compile "com.facebook.react:react-native:+" // From node_modules

android/app/src/main/java/com/firestackapp/MainApplication.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import android.util.Log;
55

66
import com.facebook.react.ReactApplication;
7+
import io.fullstack.firestack.FirestackPackage;
78
import com.facebook.react.ReactInstanceManager;
89
import com.facebook.react.ReactNativeHost;
910
import com.facebook.react.ReactPackage;
@@ -23,7 +24,8 @@ protected boolean getUseDeveloperSupport() {
2324
@Override
2425
protected List<ReactPackage> getPackages() {
2526
return Arrays.<ReactPackage>asList(
26-
new MainReactPackage()
27+
new MainReactPackage(),
28+
new FirestackPackage(getApplicationContext())
2729
);
2830
}
2931
};
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
<resources>
2+
23
<string name="app_name">FirestackApp</string>
34
</resources>

android/settings.gradle

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
11
rootProject.name = 'FirestackApp'
22

33
include ':app'
4+
include ':react-native-firestack'
5+
project(':react-native-firestack').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-firestack/android')

app/app.js

Lines changed: 14 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -1,63 +1,20 @@
1-
import React, { Component } from 'react';
2-
import {
3-
Text,
4-
View,
5-
NavigationExperimental
6-
} from 'react-native';
1+
'use strict';
72

8-
const {
9-
CardStack: NavigationCardStack,
10-
Header: NavigationHeader,
11-
} = NavigationExperimental;
3+
import React from 'react'
4+
import { AppRegistry, Text, View } from 'react-native';
5+
import App from './containers/App';
126

7+
import {Provider} from 'react-redux';
8+
import {configureStore} from './redux/configureStore';
139

14-
import ExampleList from './views/ExampleList'
10+
const {firestack, store, actions} = configureStore();
1511

16-
import styles from './styles/app';
17-
18-
export class FirestackApp extends Component {
19-
render() {
20-
return (
21-
<NavigationCardStack
22-
navigationState={this.state.stack}
23-
style={styles.container}
24-
renderHeader={this._renderHeader}
25-
renderScene={this._renderScene}
26-
onNavigateBack={this._handleBack}
27-
/>
28-
);
29-
}
30-
31-
_renderHeader(props: NavigationSceneRendererProps): ReactElement<any> {
32-
return (
33-
<NavigationHeader
34-
{...props}
35-
onNavigateBack={this._handleBack}
36-
renderTitleComponent={this._renderTitleComponent}
37-
/>
38-
);
39-
}
40-
41-
_renderTitleComponent(props: NavigationSceneRendererProps): ReactElement<any> {
42-
return (
43-
<NavigationHeader.Title>
44-
Firestack Example App
45-
</NavigationHeader.Title>
46-
);
47-
}
48-
49-
_renderScene(props: NavigationSceneRendererProps): ?ReactElement<any> {
50-
const state = props.scene.route;
51-
if (state.key === 'AppList') {
52-
return (
53-
<ExampleList
54-
onNavigate={this._handleAction}
55-
list={UIExplorerList}
56-
style={styles.exampleContainer}
57-
{...state}
58-
/>
59-
);
60-
}
12+
const wrapper = (props) => {
13+
return (
14+
<Provider store={store}>
15+
<App actions={actions} firestack={firestack} />
16+
</Provider>
17+
)
6118
}
6219

63-
export default FirestackApp
20+
export default wrapper;

app/components/Navigation/Header.js

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import React, { PropTypes as T } from 'react'
2+
3+
import {
4+
StyleSheet,
5+
View,
6+
Text,
7+
NavigationExperimental
8+
} from 'react-native'
9+
10+
const {
11+
Header: NavigationHeader
12+
} = NavigationExperimental;
13+
14+
import colors from '../../styles/colors'
15+
16+
export class Header extends React.Component {
17+
render() {
18+
return (
19+
<NavigationHeader
20+
{...this.props}
21+
style={styles.header}
22+
onNavigateBack={this._onBack.bind(this)} />
23+
)
24+
}
25+
26+
_onBack() {
27+
// on back
28+
}
29+
}
30+
31+
const styles = StyleSheet.create({
32+
header: {
33+
backgroundColor: colors.white
34+
}
35+
})
36+
37+
export default Header;
Lines changed: 143 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,143 @@
1+
import React, { PropTypes as T } from 'react'
2+
3+
import {
4+
StyleSheet,
5+
View,
6+
Text,
7+
NavigationExperimental,
8+
Easing,
9+
Dimensions
10+
} from 'react-native'
11+
12+
const {
13+
Header: NavigationHeader,
14+
Transitioner: NavigationTransitioner,
15+
CardStack: NavigationCardStack
16+
} = NavigationExperimental;
17+
18+
const { width, height } = Dimensions.get('window');
19+
20+
import routes from '../../routes';
21+
import appStyles from '../../styles/app'
22+
import Header from './Header'
23+
24+
export class FirestackNavigator extends React.Component {
25+
static propTypes: {
26+
navigationState: NavigationPropTypes.navigationState.isRequired,
27+
navigate: PropTypes.func.isRequired,
28+
};
29+
30+
_render(props) {
31+
const {scene} = props;
32+
return (
33+
<View style={appStyles.container} key={scene.key}>
34+
{this._renderHeader(props)}
35+
{props.scenes
36+
.map(scene => this._renderScene({ ...props, scene }))}
37+
</View>
38+
);
39+
}
40+
41+
_renderScene(sceneProps) {
42+
const {scene} = sceneProps;
43+
const {route} = scene;
44+
const definedRoute = this._lookupRoute(route);
45+
46+
let Component = definedRoute.Component;
47+
if (!Component) {
48+
Component = (
49+
<View style={styles.scene} key={sceneProps.scene.key}>
50+
<Text>Render scene</Text>
51+
</View>
52+
)
53+
}
54+
55+
return React.createElement(Component, {
56+
...this.props,
57+
...sceneProps,
58+
key: scene.key,
59+
route: definedRoute
60+
});
61+
}
62+
63+
_renderHeader(sceneProps) {
64+
const {actions, navigationState} = this.props;
65+
const {scene} = sceneProps;
66+
let route = this._lookupRoute(scene.route);
67+
68+
if (!route.noHeader) {
69+
// Route not implemented yet, use a default header
70+
if (!route.Component && navigationState.index > 0) {
71+
const title = route.key
72+
route = Object.assign({}, routes.default, {title, actions});
73+
}
74+
75+
route.actions = actions
76+
const {headerStyle} = route;
77+
let headerProps = Object.assign({}, sceneProps, {
78+
route,
79+
style: headerStyle || {}
80+
});
81+
82+
const {title, titleComponent} = route;
83+
if (title || titleComponent) {
84+
headerProps.renderTitleComponent = (props) => {
85+
return titleComponent ?
86+
titleComponent({...props, actions}) : (<NavigationHeader.Title>{title}</NavigationHeader.Title>);
87+
}
88+
}
89+
90+
const {leftComponent, rightComponent} = route;
91+
headerProps.renderLeftComponent = leftComponent ?
92+
leftComponent.bind(null, actions) : () => (<View />)
93+
headerProps.renderRightComponent = rightComponent ?
94+
rightComponent.bind(null, actions) : () => (<View />)
95+
96+
return (<Header {...headerProps} />)
97+
}
98+
}
99+
100+
_lookupRoute(routeObject) {
101+
const key = routeObject.key || 'default';
102+
return routes[key];
103+
}
104+
105+
_configureTransition() {
106+
const easing = Easing.inOut(Easing.ease);
107+
return {easing, duration: 200}
108+
}
109+
110+
render() {
111+
const {navigationState} = this.props;
112+
return (
113+
<NavigationTransitioner
114+
navigationState={navigationState}
115+
render={(transitionProps) => this._render(transitionProps)}
116+
configureTransition={this._configureTransition}
117+
/>
118+
)
119+
}
120+
}
121+
122+
const styles = StyleSheet.create({
123+
container: {
124+
},
125+
scene: {
126+
backgroundColor: '#E9E9EF',
127+
bottom: 0,
128+
flex: 1,
129+
left: 0,
130+
position: 'absolute',
131+
right: 0,
132+
shadowColor: 'black',
133+
shadowOffset: {width: 0, height: 0},
134+
shadowOpacity: 0.4,
135+
shadowRadius: 10,
136+
top: 0,
137+
},
138+
scrollView: {
139+
flex: 1,
140+
},
141+
})
142+
143+
export default FirestackNavigator

app/containers/App.js

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import React, { PropTypes as T } from 'react';
2+
import {connect} from 'react-redux';
3+
4+
import {
5+
StyleSheet,
6+
View,
7+
Text,
8+
NavigationExperimental
9+
} from 'react-native'
10+
11+
import FirestackNavigator from '../components/Navigation/Navigator'
12+
13+
export class App extends React.Component {
14+
15+
_navigate({type}) {
16+
console.log('_navigate called with type', type);
17+
}
18+
19+
render() {
20+
const {navigationState} = this.props;
21+
return (
22+
<FirestackNavigator
23+
{...this.props}
24+
navigationState={navigationState}
25+
navigate={this._navigate.bind(this)} />
26+
)
27+
}
28+
}
29+
30+
const styles = StyleSheet.create({
31+
container: {
32+
flex: 1
33+
}
34+
})
35+
36+
export default connect(state => {
37+
return {
38+
navigationState: state.navigation
39+
}
40+
})(App);

app/redux/configureStore.js

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import { applyMiddleware, combineReducers, createStore } from 'redux'
2+
import { bindActionCreators } from 'redux'
3+
import thunk from 'redux-thunk'
4+
5+
import Firestack from 'react-native-firestack'
6+
import env from '../../config/environment'
7+
8+
import * as currentUser from './modules/currentUser'
9+
import * as navigation from './modules/navigation'
10+
11+
export const configureStore = (initialState = {}) => {
12+
const middleware = applyMiddleware(thunk);
13+
14+
const firestack = new Firestack(env.firestack)
15+
16+
const rootReducer = combineReducers({
17+
user: currentUser.reducer,
18+
navigation: navigation.reducer,
19+
firestack: (state) => firestack
20+
});
21+
22+
const store = createStore(
23+
rootReducer,
24+
initialState,
25+
middleware);
26+
27+
firestack.setStore(store);
28+
29+
const dispatch = store.dispatch;
30+
const actions = {
31+
currentUser: bindActionCreators(currentUser.actions, dispatch)
32+
}
33+
34+
return {store,actions}
35+
}
36+
37+
export default configureStore

app/redux/modules/currentUser.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
export const CONSTANTS = {
2+
}
3+
4+
export const reducer = (state = {}, action) => {
5+
return state;
6+
}
7+
8+
export const actions = {
9+
}

app/redux/modules/firestack.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
export const CONSTANTS = {
2+
}
3+
4+
export const reducer = (state = {}, action) => {
5+
return state;
6+
}
7+
8+
export const actions = {
9+
}

0 commit comments

Comments
 (0)