diff --git a/app/containers/message/Card.js b/app/containers/message/Card.js index 731354a2a..cc594bb63 100644 --- a/app/containers/message/Card.js +++ b/app/containers/message/Card.js @@ -4,7 +4,6 @@ import Meteor from 'react-native-meteor'; import { connect } from 'react-redux'; import { CachedImage } from 'react-native-img-cache'; import { Text, TouchableOpacity, View } from 'react-native'; -// import { Navigation } from 'react-native-navigation'; import { Card, CardImage, @@ -16,23 +15,6 @@ import RocketChat from '../../lib/rocketchat'; import PhotoModal from './PhotoModal'; -// const close = () => Navigation.dismissModal({ -// animationType: 'slide-down' -// }); - -const close = () => { }; - -const CustomButton = ({ text }) => ( - - {text} - -); - -CustomButton.propTypes = { - text: PropTypes.string -}; - -// Navigation.registerComponent('CustomButton', () => CustomButton); @connect(state => ({ base: state.settings.Site_Url, diff --git a/app/lib/realm.js b/app/lib/realm.js index f77882afa..d2f4886a4 100644 --- a/app/lib/realm.js +++ b/app/lib/realm.js @@ -1,4 +1,5 @@ import Realm from 'realm'; +import { AsyncStorage } from 'react-native'; const serversSchema = { name: 'servers', @@ -153,8 +154,8 @@ const messagesSchema = { // } }; // -// Realm.clearTestState(); -// AsyncStorage.clear(); +Realm.clearTestState(); +AsyncStorage.clear(); const realm = new Realm({ schema: [settingsSchema, serversSchema, subscriptionSchema, messagesSchema, usersSchema, attachment] }); diff --git a/app/lib/rocketchat.js b/app/lib/rocketchat.js index a9fd9c8b2..71ddb447d 100644 --- a/app/lib/rocketchat.js +++ b/app/lib/rocketchat.js @@ -4,7 +4,7 @@ import { AsyncStorage } from 'react-native'; import { hashPassword } from 'react-native-meteor/lib/utils'; import RNFetchBlob from 'react-native-fetch-blob'; -import reduxStore from '../lib/createStore'; +import reduxStore from './createStore'; import settingsType from '../constants/settings'; import realm from './realm'; import * as actions from '../actions'; @@ -366,33 +366,25 @@ const RocketChat = { } }, getRooms() { - // Meteor.Accounts.onLogin(() => { return Promise.all([call('subscriptions/get'), call('rooms/get')]).then(([subscriptions, rooms]) => { - // console.log('getRooms resolved', reduxStore.getState().server, subscriptions); subscriptions = subscriptions.sort((s1, s2) => (s1.rid > s2.rid ? 1 : -1)); rooms = rooms.sort((s1, s2) => (s1._id > s2._id ? 1 : -1)); + + const { server, login } = reduxStore.getState(); const data = subscriptions.map((subscription, index) => { subscription._updatedAt = rooms[index]._updatedAt; + subscription._server = { id: server.server }; return subscription; }); - // Meteor.subscribe('stream-notify-user', `${ Meteor.userId() }/rooms-changed`, false); + realm.write(() => { data.forEach((subscription) => { - // const subscription = { - // _id: item._id - // }; - // if (typeof item.value === 'string') { - // subscription.value = item.value; - // } - subscription._server = { id: reduxStore.getState().server.server }; - // write('subscriptions', subscription); realm.create('subscriptions', subscription, true); }); }); - Meteor.subscribe('stream-notify-user', `${ reduxStore.getState().user.id }/subscriptions-changed`, false); + Meteor.subscribe('stream-notify-user', `${ login.user.id }/subscriptions-changed`, false); return data; - }).then(data => data); - // }); + }); }, logout() { return AsyncStorage.clear(); diff --git a/app/sagas/login.js b/app/sagas/login.js index b1c63f9e1..95eb8d44a 100644 --- a/app/sagas/login.js +++ b/app/sagas/login.js @@ -63,46 +63,33 @@ const saveToken = function* saveToken() { yield AsyncStorage.setItem(`${ TOKEN_KEY }-${ server }`, JSON.stringify(user)); }; -const handleLoginRequest = function* handleLoginRequest() { - while (true) { - const { credentials } = yield take(types.LOGIN.REQUEST); - try { - const response = yield call(loginCall, credentials); - yield put(loginSuccess(response)); - } catch (err) { - if (err.error === 403) { - yield put(logout()); - } else { - yield put(loginFailure(err)); - } +const handleLoginRequest = function* handleLoginRequest({ credentials }) { + try { + const response = yield call(loginCall, credentials); + yield put(loginSuccess(response)); + } catch (err) { + if (err.error === 403) { + yield put(logout()); + } else { + yield put(loginFailure(err)); } } }; -const handleLoginSubmit = function* handleLoginSubmit() { - while (true) { - const { credentials } = yield take(types.LOGIN.SUBMIT); - // put a login request - yield put(loginRequest(credentials)); - // wait for a response - const { error } = yield race({ - success: take(types.LOGIN.SUCCESS), - error: take(types.LOGIN.FAILURE) - }); - - if (!error) { - // const { navigator } = yield select(state => state); - // navigator.resetTo({ - // screen: 'Rooms' - // }); - } - } +const handleLoginSubmit = function* handleLoginSubmit({ credentials }) { + // put a login request + yield put(loginRequest(credentials)); + // wait for a response + yield race({ + success: take(types.LOGIN.SUCCESS), + error: take(types.LOGIN.FAILURE) + }); }; const root = function* root() { yield takeEvery(types.SERVER.CHANGED, handleLoginWhenServerChanges); - yield fork(handleLoginRequest); + yield takeEvery(types.LOGIN.REQUEST, handleLoginRequest); yield takeEvery(types.LOGIN.SUCCESS, saveToken); - yield fork(handleLoginSubmit); + yield takeEvery(types.LOGIN.SUBMIT, handleLoginSubmit); }; export default root; diff --git a/app/sagas/rooms.js b/app/sagas/rooms.js index a751d6b8d..472f3e5d3 100644 --- a/app/sagas/rooms.js +++ b/app/sagas/rooms.js @@ -13,6 +13,7 @@ const watchRoomsRequest = function* watchRoomsRequest() { yield call(getRooms); yield put(roomsSuccess()); } catch (err) { + console.log(err); yield put(roomsFailure(err.status)); } }; diff --git a/app/sagas/selectServer.js b/app/sagas/selectServer.js index db1551150..f03f2985f 100644 --- a/app/sagas/selectServer.js +++ b/app/sagas/selectServer.js @@ -17,9 +17,6 @@ const selectServer = function* selectServer({ server }) { yield put(changedServer(server)); yield call([AsyncStorage, 'setItem'], 'currentServer', server); yield put(connectRequest(server)); - // yield Navigation.dismissModal({ - // animationType: 'slide-down' - // }); }; @@ -45,9 +42,6 @@ const addServer = function* addServer({ server }) { realm.write(() => { realm.create('servers', { id: server, current: false }, true); }); - // Navigation.dismissModal({ - // animationType: 'slide-down' - // }); } }; diff --git a/app/views/NewServerView.js b/app/views/NewServerView.js index c029840db..62ce32643 100644 --- a/app/views/NewServerView.js +++ b/app/views/NewServerView.js @@ -1,6 +1,5 @@ import React from 'react'; import PropTypes from 'prop-types'; -// import { Navigation } from 'react-native-navigation'; import { Text, TextInput, View, StyleSheet } from 'react-native'; import { connect } from 'react-redux'; import { serverRequest, addServer } from '../actions/server'; @@ -73,6 +72,22 @@ export default class NewServerView extends React.Component { editable: true, text: '' }; + this.adding = false; + this.props.validateServer(this.state.defaultServer); // Need to call because in case of submit with empty field + } + + componentDidUpdate() { + if (this.adding) { + if (!this.props.validInstance) { + /* eslint-disable react/no-did-update-set-state */ + this.setState({ editable: true }); + this.adding = false; + } + if (this.props.validInstance && !this.props.validating) { + this.props.navigation.goBack(); + this.adding = false; + } + } } onChangeText = (text) => { @@ -81,14 +96,16 @@ export default class NewServerView extends React.Component { } submit = () => { + this.setState({ editable: false }); + this.adding = true; this.props.addServer(this.completeUrl(this.state.text.trim() || this.state.defaultServer)); - this.props.navigation.goBack(); } completeUrl = (url) => { url = url.trim(); - if (/^(\w|[0-9-_]){3,}$/.test(url) && /^(htt(ps?)?)|(loca((l)?|(lh)?|(lho)?|(lhos)?|(lhost:?\d*)?)$)/.test(url) === false) { + if (/^(\w|[0-9-_]){3,}$/.test(url) && + /^(htt(ps?)?)|(loca((l)?|(lh)?|(lho)?|(lhos)?|(lhost:?\d*)?)$)/.test(url) === false) { url = `${ url }.rocket.chat`; } diff --git a/app/views/RoomView.js b/app/views/RoomView.js index b99c21d34..6aee14bbb 100644 --- a/app/views/RoomView.js +++ b/app/views/RoomView.js @@ -76,7 +76,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), + dataSource: [], loaded: true, joined: typeof props.rid === 'undefined' }; @@ -96,9 +96,13 @@ export default class RoomView extends React.Component { // this.setState({ // loaded: true // }); - this.data.addListener(this.updateState); + realm.addListener('change', this.updateState); // }); // this.updateState(); + this.state = { + ...this.state, + dataSource: ds.cloneWithRows(this.getData()) + }; } componentDidMount() { @@ -106,7 +110,7 @@ export default class RoomView extends React.Component { } componentWillUnmount() { - this.data.removeListener(this.updateState); + realm.removeListener('change', this.updateState); } onEndReached = () => { @@ -128,9 +132,16 @@ export default class RoomView extends React.Component { } } + getData() { + return realm + .objects('messages') + .filtered('_server.id = $0 AND rid = $1', this.props.server, this.rid) + .sorted('ts', true); + } + updateState = debounce(() => { this.setState({ - dataSource: ds.cloneWithRows(this.data) + dataSource: ds.cloneWithRows(this.getData()) }); // RocketChat.readMessages(this.rid); // this.setState({ diff --git a/app/views/RoomsListView.js b/app/views/RoomsListView.js index 9a56aed8b..d1929497c 100644 --- a/app/views/RoomsListView.js +++ b/app/views/RoomsListView.js @@ -73,19 +73,27 @@ export default class RoomsListView extends React.Component { constructor(props) { super(props); - this.data = realm.objects('subscriptions').filtered('_server.id = $0', this.props.server); + this.state = { - dataSource: ds.cloneWithRows(this.data), + dataSource: [], searching: false, searchDataSource: [], searchText: '', login: false }; - this.data.addListener(this.updateState); + } + + componentWillMount() { + realm.addListener('change', this.updateState); + + this.state = { + ...this.state, + dataSource: ds.cloneWithRows(this.getData()) + }; } componentWillUnmount() { - this.data.removeListener(this.updateState); + realm.removeListener('change', this.updateState); } onSearchChangeText = (text) => { @@ -146,10 +154,13 @@ export default class RoomsListView extends React.Component { }); } + getData() { + return realm.objects('subscriptions').filtered('_server.id = $0', this.props.server); + } updateState = () => { this.setState({ - dataSource: ds.cloneWithRows(this.data) + dataSource: ds.cloneWithRows(this.getData()) }); }; @@ -196,9 +207,11 @@ export default class RoomsListView extends React.Component { navigateToRoom({ sid: id }); clearSearch(); } + _createChannel() { this.props.navigation.navigate('CreateChannel'); } + renderSearchBar = () => ( this._onPressItem(item._id, item)} /> ) + renderList = () => ( ) + renderCreateButtons = () => ( { this._createChannel(); }} > - ); - render= () => ( + + ); + + render = () => ( {this.renderList()}