diff --git a/app/actions/actionsTypes.js b/app/actions/actionsTypes.js
index 5b541dcd..7d0d5906 100644
--- a/app/actions/actionsTypes.js
+++ b/app/actions/actionsTypes.js
@@ -12,6 +12,7 @@ function createRequestTypes(base, types = defaultTypes) {
// Login events
export const LOGIN = createRequestTypes('LOGIN');
export const ROOMS = createRequestTypes('ROOMS');
+export const MESSAGES = createRequestTypes('MESSAGES');
export const METEOR = createRequestTypes('METEOR_CONNECT');
export const LOGOUT = 'LOGOUT'; // logout is always success
diff --git a/app/actions/messages.js b/app/actions/messages.js
new file mode 100644
index 00000000..6c508fdc
--- /dev/null
+++ b/app/actions/messages.js
@@ -0,0 +1,22 @@
+import * as types from './actionsTypes';
+
+export function messagesRequest({ rid }) {
+ console.log(types.MESSAGES.REQUEST, rid);
+ return {
+ type: types.MESSAGES.REQUEST,
+ rid
+ };
+}
+
+export function messagesSuccess() {
+ return {
+ type: types.MESSAGES.SUCCESS
+ };
+}
+
+export function messagesFailure(err) {
+ return {
+ type: types.MESSAGES.FAILURE,
+ err
+ };
+}
diff --git a/app/actions/rooms.js b/app/actions/rooms.js
index e22049e4..bdbf94d0 100644
--- a/app/actions/rooms.js
+++ b/app/actions/rooms.js
@@ -1,6 +1,6 @@
import * as types from './actionsTypes';
-export function roomsSuccessRequest() {
+export function roomsRequest() {
return {
type: types.ROOMS.REQUEST
};
@@ -12,7 +12,7 @@ export function roomsSuccess() {
};
}
-export function roomsSuccessFailure(err) {
+export function roomsFailure(err) {
return {
type: types.ROOMS.FAILURE,
err
diff --git a/app/components/banner.js b/app/components/banner.js
new file mode 100644
index 00000000..eb468338
--- /dev/null
+++ b/app/components/banner.js
@@ -0,0 +1,41 @@
+import { StyleSheet, View, Text } from 'react-native';
+import React from 'react';
+
+import { connect } from 'react-redux';
+
+const styles = StyleSheet.create({
+ bannerContainer: {
+ backgroundColor: '#ddd'
+ },
+ bannerText: {
+ textAlign: 'center',
+ margin: 5
+ }
+});
+
+@connect(state => ({
+ connecting: state.meteor && state.meteor.connecting,
+ authenticating: state.login && state.login.isFetching
+}))
+
+export default class Banner extends React.PureComponent {
+ render() {
+ const { connecting, authenticating } = this.props;
+ if (connecting) {
+ return (
+
+ Connecting...
+
+ );
+ }
+
+ if (authenticating) {
+ return (
+
+ Authenticating...
+
+ );
+ }
+ return null;
+ }
+}
diff --git a/app/lib/createStore.js b/app/lib/createStore.js
index cd923bcb..749e2860 100644
--- a/app/lib/createStore.js
+++ b/app/lib/createStore.js
@@ -4,7 +4,7 @@ import 'regenerator-runtime/runtime';
import { createStore, applyMiddleware } from 'redux';
import createSagaMiddleware from 'redux-saga';
import logger from 'redux-logger';
-import rootReducer from '../reducers/rootReducer';
+import reducers from '../reducers';
import sagas from '../sagas';
const sagaMiddleware = createSagaMiddleware();
@@ -19,7 +19,7 @@ if (__DEV__) {
}
export default createStore(
- rootReducer,
+ reducers,
applyMiddleware(sagaMiddleware)
);
sagaMiddleware.run(sagas);
diff --git a/app/lib/rocketchat.js b/app/lib/rocketchat.js
index a7666ed4..450bdcd8 100644
--- a/app/lib/rocketchat.js
+++ b/app/lib/rocketchat.js
@@ -189,35 +189,36 @@ const RocketChat = {
},
loadMessagesForRoom(rid, end, cb) {
- Meteor.call('loadHistory', rid, end, 20, (err, data) => {
- if (err) {
- console.error(err);
- if (cb) {
- cb({ end: true });
+ return new Promise((resolve, reject) => {
+ Meteor.call('loadHistory', rid, end, 20, (err, data) => {
+ if (err) {
+ if (cb) {
+ cb({ end: true });
+ }
+ return reject(err);
}
- return;
- }
- if (data.messages.length) {
- realm.write(() => {
- data.messages.forEach((message) => {
- message.temp = false;
- message._server = { id: RocketChat.currentServer };
- // write('messages', message);
- realm.create('messages', message, true);
+ if (data.messages.length) {
+ realm.write(() => {
+ data.messages.forEach((message) => {
+ message.temp = false;
+ message._server = { id: RocketChat.currentServer };
+ // write('messages', message);
+ realm.create('messages', message, true);
+ });
});
- });
- }
-
- if (cb) {
- if (data.messages.length < 20) {
- cb({ end: true });
- } else {
- cb({ end: false });
}
- }
- });
- Meteor.subscribe('stream-room-messages', rid, false);
+ if (cb) {
+ if (data.messages.length < 20) {
+ cb({ end: true });
+ } else {
+ cb({ end: false });
+ }
+ }
+ resolve();
+ Meteor.subscribe('stream-room-messages', rid, false);
+ });
+ });
},
getMessage(rid, msg = {}) {
diff --git a/app/reducers/index.js b/app/reducers/index.js
new file mode 100644
index 00000000..2bc2642d
--- /dev/null
+++ b/app/reducers/index.js
@@ -0,0 +1,12 @@
+import { combineReducers } from 'redux';
+import * as reducers from './reducers';
+import login from './login';
+import meteor from './connect';
+import messages from './messages';
+
+console.log(Object.keys({
+ ...reducers, login, meteor, messages
+}));
+export default combineReducers({
+ ...reducers, login, meteor, messages
+});
diff --git a/app/reducers/messages.js b/app/reducers/messages.js
new file mode 100644
index 00000000..c0fb2749
--- /dev/null
+++ b/app/reducers/messages.js
@@ -0,0 +1,29 @@
+import * as types from '../actions/actionsTypes';
+
+const initialState = {
+ isFetching: false,
+ failure: false
+};
+
+export default function messages(state = initialState, action) {
+ switch (action.type) {
+ case types.MESSAGES.REQUEST:
+ return { ...state,
+ isFetching: true
+ };
+ case types.MESSAGES.SUCCESS:
+ return { ...state,
+ isFetching: false
+ };
+ case types.LOGIN.FAILURE:
+ return { ...state,
+ isFetching: false,
+ failure: true,
+ errorMessage: action.err
+ };
+ // case types.LOGOUT:
+ // return initialState;
+ default:
+ return state;
+ }
+}
diff --git a/app/reducers/reducers.js b/app/reducers/reducers.js
index 3cd0c5ac..7e23459f 100644
--- a/app/reducers/reducers.js
+++ b/app/reducers/reducers.js
@@ -13,7 +13,7 @@ export function server(state = initialState.server, action) {
export function settings(state = initialState.settings, action) {
if (action.type === types.SET_ALL_SETTINGS) {
- return {
+ return { ...state,
...action.payload
};
}
diff --git a/app/reducers/rooms.js b/app/reducers/rooms.js
index f1e15813..5964a0d7 100644
--- a/app/reducers/rooms.js
+++ b/app/reducers/rooms.js
@@ -15,7 +15,7 @@ export default function login(state = initialState, action) {
return { ...state,
isFetching: false
};
- case types.LOGIN.FAILURE:
+ case types.ROOMS.FAILURE:
return { ...state,
isFetching: false,
failure: true,
diff --git a/app/reducers/rootReducer.js b/app/reducers/rootReducer.js
deleted file mode 100644
index 7c29d61c..00000000
--- a/app/reducers/rootReducer.js
+++ /dev/null
@@ -1,10 +0,0 @@
-import { combineReducers } from 'redux';
-import * as reducers from './reducers';
-import * as login from './login';
-import * as connect from './connect';
-
-const rootReducer = combineReducers({
- ...reducers, ...login, ...connect
-});
-
-export default rootReducer;
diff --git a/app/routes/index.js b/app/routes/index.js
new file mode 100644
index 00000000..5b189b99
--- /dev/null
+++ b/app/routes/index.js
@@ -0,0 +1,39 @@
+import React from 'react';
+import {
+ Scene,
+ Router
+ // Actions,
+ // Reducer,
+ // ActionConst,
+ // Tabs,
+ // Modal,
+ // Drawer,
+ // Stack,
+ // Lightbox
+} from 'react-native-router-flux';
+// import { Navigation } from 'react-native-navigation';
+import { Provider } from 'react-redux';
+
+import LoginView from '../views/login';
+import NewServerView from '../views/serverNew';
+import ListServerView from '../views/serverList';
+import RoomsListView from '../views/roomsList';
+import RoomView from '../views/room';
+// import PhotoView from '../views/Photo';
+// import CreateChannel from '../views/CreateChannel';
+import store from '../lib/createStore';
+
+export default () => (
+
+
+
+
+
+
+
+
+
+
+
+);
+//
diff --git a/app/sagas/connect.js b/app/sagas/connect.js
index deab72e0..bc3a5b1f 100644
--- a/app/sagas/connect.js
+++ b/app/sagas/connect.js
@@ -1,4 +1,4 @@
-import { take, put, call, fork } from 'redux-saga/effects';
+import { take, put, call } from 'redux-saga/effects';
import { METEOR } from '../actions/actionsTypes';
import RocketChat from '../lib/rocketchat';
@@ -20,8 +20,4 @@ const watchConnect = function* watchConnect() {
}
}
};
-
-const root = function* root() {
- yield fork(watchConnect);
-};
-export default root;
+export default watchConnect;
diff --git a/app/sagas/index.js b/app/sagas/index.js
index c2e3aead..9b9e0f2d 100644
--- a/app/sagas/index.js
+++ b/app/sagas/index.js
@@ -3,12 +3,16 @@ import hello from './hello';
import login from './login';
import connect from './connect';
import rooms from './rooms';
+import logger from './logger';
+import messages from './messages';
const root = function* root() {
yield fork(hello);
yield fork(rooms);
yield fork(login);
yield fork(connect);
+ yield fork(logger);
+ yield fork(messages);
};
// Consider using takeEvery
export default root;
diff --git a/app/sagas/logger.js b/app/sagas/logger.js
new file mode 100644
index 00000000..85781127
--- /dev/null
+++ b/app/sagas/logger.js
@@ -0,0 +1,12 @@
+import { select, takeEvery } from 'redux-saga/effects';
+
+const root = function* watchAndLog() {
+ yield takeEvery('*', function* logger(action) {
+ const state = yield select();
+ const tmp = { ...state };
+ delete tmp.settings;
+ console.log('action', action);
+ console.log('state after', tmp);
+ });
+};
+export default root;
diff --git a/app/sagas/login.js b/app/sagas/login.js
index aec7be89..04b4ac62 100644
--- a/app/sagas/login.js
+++ b/app/sagas/login.js
@@ -1,5 +1,5 @@
import React from 'react';
-import { take, put, call, fork } from 'redux-saga/effects';
+import { take, put, call, takeLast } from 'redux-saga/effects';
import * as types from '../actions/actionsTypes';
import { loginSuccess, loginFailure } from '../actions/login';
import RocketChat from '../lib/rocketchat';
@@ -23,8 +23,4 @@ const watchLoginRequest = function* watchLoginRequest() {
}
}
};
-
-const root = function* root() {
- yield fork(watchLoginRequest);
-};
-export default root;
+export default watchLoginRequest;
diff --git a/app/sagas/messages.js b/app/sagas/messages.js
new file mode 100644
index 00000000..47774474
--- /dev/null
+++ b/app/sagas/messages.js
@@ -0,0 +1,27 @@
+import { takeEvery, takeLatest, select, take, put } from 'redux-saga/effects';
+import { MESSAGES, LOGIN } from '../actions/actionsTypes';
+import { messagesSuccess, messagesFailure } from '../actions/messages';
+import RocketChat from '../lib/rocketchat';
+
+const get = function* get({ rid }) {
+ const auth = yield select(state => state.login.isAuthenticated);
+ if (!auth) {
+ yield take(LOGIN.SUCCESS);
+ }
+ try {
+ yield RocketChat.loadMessagesForRoom(rid, null);
+ yield put(messagesSuccess());
+ } catch (err) {
+ console.log(err);
+ yield put(messagesFailure(err.status));
+ }
+};
+const getData = function* getData() {
+ yield takeLatest(MESSAGES.REQUEST, get);
+};
+
+const getMessages = function* getMessages() {
+ yield takeEvery(LOGIN.SUCCESS, getData);
+};
+
+export default getMessages;
diff --git a/app/sagas/rooms.js b/app/sagas/rooms.js
index f02a445a..1c8dfeb9 100644
--- a/app/sagas/rooms.js
+++ b/app/sagas/rooms.js
@@ -25,7 +25,4 @@ const watchRoomsRequest = function* watchRoomsRequest() {
}
};
-const root = function* root() {
- yield fork(watchRoomsRequest);
-};
-export default root;
+export default watchRoomsRequest;
diff --git a/app/views/login.js b/app/views/login.js
index 3b6d0b39..3b60024b 100644
--- a/app/views/login.js
+++ b/app/views/login.js
@@ -65,7 +65,9 @@ class LoginView extends React.Component {
}
submit = () => {
const { username, password, code } = this.state;
+ console.log({ username, password, code });
this.props.loginRequest({ username, password, code });
+ this.props.navigator.dismissModal();
//
//
// this.setState({
@@ -107,10 +109,10 @@ class LoginView extends React.Component {
}
}
+ // {this.props.login.isFetching && LOGANDO}
render() {
return (
- {this.props.login.isFetching && LOGANDO}
this.setState({ username })}
@@ -140,11 +142,12 @@ class LoginView extends React.Component {
}
function mapStateToProps(state) {
+ // console.log(Object.keys(state));
return {
server: state.server,
Accounts_EmailOrUsernamePlaceholder: state.settings.Accounts_EmailOrUsernamePlaceholder,
Accounts_PasswordPlaceholder: state.settings.Accounts_PasswordPlaceholder,
- login: state.default
+ login: state.login || state.default
};
}
diff --git a/app/views/room.js b/app/views/room.js
index 1530799a..24395418 100644
--- a/app/views/room.js
+++ b/app/views/room.js
@@ -6,6 +6,7 @@ import { connect } from 'react-redux';
import { bindActionCreators } from 'redux';
import * as actions from '../actions';
+import { messagesRequest } from '../actions/messages';
import realm from '../lib/realm';
import RocketChat from '../lib/rocketchat';
import debounce from '../utils/throttle';
@@ -47,9 +48,11 @@ const styles = StyleSheet.create({
@connect(state => ({
server: state.server,
Site_Url: state.settings.Site_Url,
- Message_TimeFormat: state.settings.Message_TimeFormat
+ Message_TimeFormat: state.settings.Message_TimeFormat,
+ loading: state.messages.isFetching
}), dispatch => ({
- actions: bindActionCreators(actions, dispatch)
+ actions: bindActionCreators(actions, dispatch),
+ getMessages: rid => dispatch(messagesRequest({ rid }))
}))
export default class RoomView extends React.Component {
static propTypes = {
@@ -69,7 +72,7 @@ export default class RoomView extends React.Component {
this.data = realm.objects('messages').filtered('_server.id = $0 AND rid = $1', this.props.server, this.rid).sorted('ts', true);
this.state = {
- dataSource: ds.cloneWithRows(this.data.slice(0, 10)),
+ dataSource: ds.cloneWithRows(this.data),
loaded: true,
joined: typeof props.rid === 'undefined'
};
@@ -80,17 +83,18 @@ export default class RoomView extends React.Component {
}
componentWillMount() {
- const late = setTimeout(() => this.setState({
- loaded: false
- }), 1000);
- RocketChat.loadMessagesForRoom(this.rid, null, () => {
- clearTimeout(late);
- this.setState({
- loaded: true
- });
- this.data.addListener(this.updateState);
- });
- this.updateState();
+ this.props.getMessages(this.rid);
+ // const late = setTimeout(() => this.setState({
+ // loaded: false
+ // }), 1000);
+ // RocketChat.loadMessagesForRoom(this.rid, null, () => {
+ // clearTimeout(late);
+ // this.setState({
+ // loaded: true
+ // });
+ this.data.addListener(this.updateState);
+ // });
+ // this.updateState();
}
componentDidMount() {
@@ -141,15 +145,13 @@ export default class RoomView extends React.Component {
});
};
- renderBanner = () => {
- if (this.state.loaded === false) {
- return (
-
- Loading new messages...
-
- );
- }
- };
+ renderBanner = () => (this.props.loading ?
+ (
+
+ Loading new messages...
+
+ ) : null)
+
renderItem = ({ item }) => (
item._id}
- //
return (
{this.renderBanner()}
diff --git a/app/views/roomsList.js b/app/views/roomsList.js
index 9b0831f3..05695553 100644
--- a/app/views/roomsList.js
+++ b/app/views/roomsList.js
@@ -13,7 +13,8 @@ import * as meteor from '../actions/connect';
import realm from '../lib/realm';
import RocketChat from '../lib/rocketchat';
import RoomItem from '../components/RoomItem';
-import debounce from '../utils/debounce';
+import Banner from '../components/banner';
+// import debounce from '../utils/debounce';
const styles = StyleSheet.create({
container: {
@@ -38,13 +39,6 @@ const styles = StyleSheet.create({
fontSize: 18,
color: '#ccc'
},
- bannerContainer: {
- backgroundColor: '#ddd'
- },
- bannerText: {
- textAlign: 'center',
- margin: 5
- },
actionButtonIcon: {
fontSize: 20,
height: 22,
@@ -254,11 +248,11 @@ export default class RoomsListView extends React.Component {
});
}
- updateState = debounce(() => {
+ updateState = () => {
this.setState({
dataSource: ds.cloneWithRows(this.state.data)
});
- }, 500);
+ };
_onPressItem = (id, item = {}) => {
const navigateToRoom = (room) => {
@@ -312,27 +306,6 @@ export default class RoomsListView extends React.Component {
screen: 'CreateChannel'
});
}
-
- renderBanner = () => {
- const status = Meteor.getData() && Meteor.getData().ddp && Meteor.getData().ddp.status;
-
- if (status === 'disconnected') {
- return (
-
- Connecting...
-
- );
- }
-
- if (status === 'connected' && Meteor._isLoggingIn) {
- return (
-
- Authenticating...
-
- );
- }
- }
-
renderItem = ({ item }) => (
- {this.renderBanner()}
+
{this.renderList()}
{this.renderCreateButtons()}
diff --git a/index.ios.js b/index.ios.js
index 31dc38cf..dac1db54 100644
--- a/index.ios.js
+++ b/index.ios.js
@@ -1,3 +1,7 @@
import 'babel-polyfill';
import 'regenerator-runtime/runtime';
import './app/navigation';
+// import { AppRegistry } from 'react-native';
+// import Routes from './app/routes';
+//
+// AppRegistry.registerComponent('RocketChatRN', () => Routes);
diff --git a/package-lock.json b/package-lock.json
index a297c56e..8baaeece 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -4512,6 +4512,11 @@
"resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz",
"integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U="
},
+ "lodash.isequal": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz",
+ "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA="
+ },
"lodash.keys": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz",
@@ -4859,6 +4864,14 @@
"resolved": "https://registry.npmjs.org/mobx/-/mobx-2.7.0.tgz",
"integrity": "sha1-zz2C0YwMp/RY2PKiQIF7PcflSgE="
},
+ "mobx-react": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/mobx-react/-/mobx-react-4.2.2.tgz",
+ "integrity": "sha1-25zDyv772DDQWEwRSa9armeCkgE=",
+ "requires": {
+ "hoist-non-react-statics": "1.2.0"
+ }
+ },
"moment": {
"version": "2.18.1",
"resolved": "https://registry.npmjs.org/moment/-/moment-2.18.1.tgz",
@@ -5156,6 +5169,92 @@
"mimic-fn": "1.1.0"
}
},
+ "opencollective": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/opencollective/-/opencollective-1.0.3.tgz",
+ "integrity": "sha1-ruY3K8KBRFg2kMPKja7PwSDdDvE=",
+ "requires": {
+ "babel-polyfill": "6.23.0",
+ "chalk": "1.1.3",
+ "inquirer": "3.0.6",
+ "minimist": "1.2.0",
+ "node-fetch": "1.6.3",
+ "opn": "4.0.2"
+ },
+ "dependencies": {
+ "ansi-escapes": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz",
+ "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4="
+ },
+ "babel-polyfill": {
+ "version": "6.23.0",
+ "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.23.0.tgz",
+ "integrity": "sha1-g2TKYt+Or7gwSZ9pkXdGbDsDSZ0=",
+ "requires": {
+ "babel-runtime": "6.25.0",
+ "core-js": "2.5.0",
+ "regenerator-runtime": "0.10.5"
+ }
+ },
+ "core-js": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.0.tgz",
+ "integrity": "sha1-VpwFCRi+ZIazg3VSAorgRmtxcIY="
+ },
+ "inquirer": {
+ "version": "3.0.6",
+ "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.0.6.tgz",
+ "integrity": "sha1-4EqqnQW3o8ubD0B9BDdfBEcZA0c=",
+ "requires": {
+ "ansi-escapes": "1.4.0",
+ "chalk": "1.1.3",
+ "cli-cursor": "2.1.0",
+ "cli-width": "2.1.0",
+ "external-editor": "2.0.4",
+ "figures": "2.0.0",
+ "lodash": "4.17.4",
+ "mute-stream": "0.0.7",
+ "run-async": "2.3.0",
+ "rx": "4.1.0",
+ "string-width": "2.1.1",
+ "strip-ansi": "3.0.1",
+ "through": "2.3.8"
+ }
+ },
+ "node-fetch": {
+ "version": "1.6.3",
+ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.6.3.tgz",
+ "integrity": "sha1-3CNO3WSJmC1Y6PDbT2lQKavNjAQ=",
+ "requires": {
+ "encoding": "0.1.12",
+ "is-stream": "1.1.0"
+ }
+ },
+ "opn": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/opn/-/opn-4.0.2.tgz",
+ "integrity": "sha1-erwi5kTf9jsKltWrfyeQwPAavJU=",
+ "requires": {
+ "object-assign": "4.1.1",
+ "pinkie-promise": "2.0.1"
+ }
+ },
+ "regenerator-runtime": {
+ "version": "0.10.5",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz",
+ "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg="
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ }
+ }
+ },
"opn": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/opn/-/opn-3.0.3.tgz",
@@ -5842,6 +5941,14 @@
"resolved": "https://registry.npmjs.org/react-native-autogrow-textinput/-/react-native-autogrow-textinput-4.1.0.tgz",
"integrity": "sha1-p+WxfrPBarCOMbv7iNkkiO2H8nY="
},
+ "react-native-button": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/react-native-button/-/react-native-button-2.1.0.tgz",
+ "integrity": "sha1-o54jKSkir+6k974UHdQ+GPG1GHY=",
+ "requires": {
+ "prop-types": "15.5.10"
+ }
+ },
"react-native-card-view": {
"version": "0.0.3",
"resolved": "https://registry.npmjs.org/react-native-card-view/-/react-native-card-view-0.0.3.tgz",
@@ -5958,6 +6065,27 @@
"resolved": "https://registry.npmjs.org/react-native-optimized-flatlist/-/react-native-optimized-flatlist-1.0.1.tgz",
"integrity": "sha1-2+6C8gi0i+8jxssm8dXzrFjmdbI="
},
+ "react-native-router-flux": {
+ "version": "4.0.0-beta.18",
+ "resolved": "https://registry.npmjs.org/react-native-router-flux/-/react-native-router-flux-4.0.0-beta.18.tgz",
+ "integrity": "sha1-wjSIm2+VCZmlZoZaulGexfjJ54g=",
+ "requires": {
+ "lodash.isequal": "4.5.0",
+ "mobx": "3.2.2",
+ "mobx-react": "4.2.2",
+ "opencollective": "1.0.3",
+ "prop-types": "15.5.10",
+ "react-native-button": "2.1.0",
+ "react-navigation": "1.0.0-beta.11"
+ },
+ "dependencies": {
+ "mobx": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/mobx/-/mobx-3.2.2.tgz",
+ "integrity": "sha1-qmcUWb7e39mIDJSIiaP2K84JJ5w="
+ }
+ }
+ },
"react-native-svg": {
"version": "5.4.1",
"resolved": "https://registry.npmjs.org/react-native-svg/-/react-native-svg-5.4.1.tgz",
@@ -6520,6 +6648,11 @@
"is-promise": "2.1.0"
}
},
+ "rx": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/rx/-/rx-4.1.0.tgz",
+ "integrity": "sha1-pfE/957zt0D+MKqAP7CfmIBdR4I="
+ },
"rx-lite": {
"version": "4.0.8",
"resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz",
diff --git a/package.json b/package.json
index be7054a5..b8111b8e 100644
--- a/package.json
+++ b/package.json
@@ -32,6 +32,7 @@
"react-native-meteor": "^1.1.0",
"react-native-navigation": "^1.1.193",
"react-native-optimized-flatlist": "^1.0.1",
+ "react-native-router-flux": "^4.0.0-beta.18",
"react-native-svg": "^5.4.1",
"react-native-svg-image": "^1.1.4",
"react-native-vector-icons": "^4.3.0",