[NEW] Reload room on return from background (#117)
* update screen when returns to foreground
This commit is contained in:
parent
9e641ea8cc
commit
e95043bc3f
|
@ -12,7 +12,8 @@ import * as NavigationService from './routes/NavigationService';
|
||||||
@connect(
|
@connect(
|
||||||
state => ({
|
state => ({
|
||||||
login: state.login,
|
login: state.login,
|
||||||
app: state.app
|
app: state.app,
|
||||||
|
background: state.app.background
|
||||||
}),
|
}),
|
||||||
dispatch => bindActionCreators({
|
dispatch => bindActionCreators({
|
||||||
appInit
|
appInit
|
||||||
|
@ -26,7 +27,7 @@ export default class Routes extends React.Component {
|
||||||
}
|
}
|
||||||
|
|
||||||
componentWillMount() {
|
componentWillMount() {
|
||||||
this.props.appInit();
|
return !this.props.app.ready && this.props.appInit();
|
||||||
}
|
}
|
||||||
|
|
||||||
componentDidUpdate() {
|
componentDidUpdate() {
|
||||||
|
@ -40,7 +41,7 @@ export default class Routes extends React.Component {
|
||||||
return (<Loading />);
|
return (<Loading />);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((login.token && !login.failure && !login.isRegistering) || app.ready) {
|
if (login.token && !login.failure && !login.isRegistering) {
|
||||||
return (<AuthRoutes ref={nav => this.navigator = nav} />);
|
return (<AuthRoutes ref={nav => this.navigator = nav} />);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
import { NavigationActions } from 'react-navigation';
|
import { NavigationActions } from 'react-navigation';
|
||||||
|
import reduxStore from '../../lib/createStore';
|
||||||
|
|
||||||
const config = {};
|
const config = {};
|
||||||
|
|
||||||
|
@ -31,6 +32,7 @@ export function goRoom({ rid, name }, counter = 0) {
|
||||||
if (!config.navigator) {
|
if (!config.navigator) {
|
||||||
return setTimeout(() => goRoom({ rid, name }, counter + 1), 200);
|
return setTimeout(() => goRoom({ rid, name }, counter + 1), 200);
|
||||||
}
|
}
|
||||||
|
|
||||||
const action = NavigationActions.reset({
|
const action = NavigationActions.reset({
|
||||||
index: 1,
|
index: 1,
|
||||||
actions: [
|
actions: [
|
||||||
|
@ -39,5 +41,5 @@ export function goRoom({ rid, name }, counter = 0) {
|
||||||
]
|
]
|
||||||
});
|
});
|
||||||
|
|
||||||
return config.navigator.dispatch(action);
|
requestAnimationFrame(() => config.navigator.dispatch(action), reduxStore.getState().app.starting);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,19 +1,46 @@
|
||||||
|
import { FOREGROUND, BACKGROUND, INACTIVE } from 'redux-enhancer-react-native-appstate';
|
||||||
import { APP } from '../actions/actionsTypes';
|
import { APP } from '../actions/actionsTypes';
|
||||||
|
|
||||||
const initialState = {
|
const initialState = {
|
||||||
starting: true
|
starting: true,
|
||||||
|
ready: false,
|
||||||
|
inactive: false,
|
||||||
|
background: false
|
||||||
};
|
};
|
||||||
|
|
||||||
export default function app(state = initialState, action) {
|
export default function app(state = initialState, action) {
|
||||||
switch (action.type) {
|
switch (action.type) {
|
||||||
|
case FOREGROUND:
|
||||||
|
return {
|
||||||
|
...state,
|
||||||
|
inactive: false,
|
||||||
|
foreground: true,
|
||||||
|
background: false
|
||||||
|
};
|
||||||
|
case BACKGROUND:
|
||||||
|
return {
|
||||||
|
...state,
|
||||||
|
inactive: false,
|
||||||
|
foreground: false,
|
||||||
|
background: true
|
||||||
|
};
|
||||||
|
case INACTIVE:
|
||||||
|
return {
|
||||||
|
...state,
|
||||||
|
inactive: true,
|
||||||
|
foreground: false,
|
||||||
|
background: false
|
||||||
|
};
|
||||||
case APP.INIT:
|
case APP.INIT:
|
||||||
return {
|
return {
|
||||||
...state,
|
...state,
|
||||||
|
ready: false,
|
||||||
starting: true
|
starting: true
|
||||||
};
|
};
|
||||||
case APP.READY:
|
case APP.READY:
|
||||||
return {
|
return {
|
||||||
...state,
|
...state,
|
||||||
|
ready: true,
|
||||||
starting: false
|
starting: false
|
||||||
};
|
};
|
||||||
default:
|
default:
|
||||||
|
|
|
@ -11,6 +11,8 @@ const initialState = {
|
||||||
|
|
||||||
export default function login(state = initialState, action) {
|
export default function login(state = initialState, action) {
|
||||||
switch (action.type) {
|
switch (action.type) {
|
||||||
|
case types.APP.INIT:
|
||||||
|
return initialState;
|
||||||
case types.LOGIN.REQUEST:
|
case types.LOGIN.REQUEST:
|
||||||
return {
|
return {
|
||||||
...state,
|
...state,
|
||||||
|
|
|
@ -130,7 +130,9 @@ const handleSetUsernameRequest = function* handleSetUsernameRequest({ credential
|
||||||
|
|
||||||
const handleLogout = function* handleLogout() {
|
const handleLogout = function* handleLogout() {
|
||||||
const server = yield select(getServer);
|
const server = yield select(getServer);
|
||||||
|
if (server) {
|
||||||
yield call(logoutCall, { server });
|
yield call(logoutCall, { server });
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const handleRegisterIncomplete = function* handleRegisterIncomplete() {
|
const handleRegisterIncomplete = function* handleRegisterIncomplete() {
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
import { put, call, takeLatest, take, select, race, fork, cancel } from 'redux-saga/effects';
|
import { put, call, takeLatest, take, select, race, fork, cancel } from 'redux-saga/effects';
|
||||||
import { delay } from 'redux-saga';
|
import { delay } from 'redux-saga';
|
||||||
|
import { FOREGROUND } from 'redux-enhancer-react-native-appstate';
|
||||||
import * as types from '../actions/actionsTypes';
|
import * as types from '../actions/actionsTypes';
|
||||||
import { roomsSuccess, roomsFailure } from '../actions/rooms';
|
import { roomsSuccess, roomsFailure } from '../actions/rooms';
|
||||||
import { addUserTyping, removeUserTyping } from '../actions/room';
|
import { addUserTyping, removeUserTyping } from '../actions/room';
|
||||||
|
@ -60,7 +61,6 @@ const watchRoomOpen = function* watchRoomOpen({ room }) {
|
||||||
if (open) {
|
if (open) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
RocketChat.readMessages(room.rid);
|
RocketChat.readMessages(room.rid);
|
||||||
subscriptions.push(RocketChat.subscribe('stream-room-messages', room.rid, false));
|
subscriptions.push(RocketChat.subscribe('stream-room-messages', room.rid, false));
|
||||||
subscriptions.push(RocketChat.subscribe('stream-notify-room', `${ room.rid }/typing`, false));
|
subscriptions.push(RocketChat.subscribe('stream-notify-room', `${ room.rid }/typing`, false));
|
||||||
|
@ -89,9 +89,18 @@ const watchuserTyping = function* watchuserTyping({ status }) {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const updateRoom = function* updateRoom() {
|
||||||
|
const room = yield select(state => state.room);
|
||||||
|
if (!room || !room.rid) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
yield put(messagesRequest({ rid: room.rid }));
|
||||||
|
};
|
||||||
const root = function* root() {
|
const root = function* root() {
|
||||||
yield takeLatest(types.ROOM.USER_TYPING, watchuserTyping);
|
yield takeLatest(types.ROOM.USER_TYPING, watchuserTyping);
|
||||||
yield takeLatest(types.LOGIN.SUCCESS, watchRoomsRequest);
|
yield takeLatest(types.LOGIN.SUCCESS, watchRoomsRequest);
|
||||||
yield takeLatest(types.ROOM.OPEN, watchRoomOpen);
|
yield takeLatest(types.ROOM.OPEN, watchRoomOpen);
|
||||||
|
yield takeLatest(FOREGROUND, updateRoom);
|
||||||
|
yield takeLatest(FOREGROUND, watchRoomsRequest);
|
||||||
};
|
};
|
||||||
export default root;
|
export default root;
|
||||||
|
|
|
@ -81,6 +81,9 @@ export default class RoomView extends React.Component {
|
||||||
this.rid =
|
this.rid =
|
||||||
props.rid ||
|
props.rid ||
|
||||||
props.navigation.state.params.room.rid;
|
props.navigation.state.params.room.rid;
|
||||||
|
this.name = this.props.name ||
|
||||||
|
this.props.navigation.state.params.name ||
|
||||||
|
this.props.navigation.state.params.room.name;
|
||||||
|
|
||||||
this.data = realm
|
this.data = realm
|
||||||
.objects('messages')
|
.objects('messages')
|
||||||
|
@ -96,12 +99,9 @@ export default class RoomView extends React.Component {
|
||||||
|
|
||||||
componentWillMount() {
|
componentWillMount() {
|
||||||
this.props.navigation.setParams({
|
this.props.navigation.setParams({
|
||||||
title:
|
title: this.name
|
||||||
this.props.name ||
|
|
||||||
this.props.navigation.state.params.name ||
|
|
||||||
this.props.navigation.state.params.room.name
|
|
||||||
});
|
});
|
||||||
this.props.openRoom({ rid: this.rid });
|
this.props.openRoom({ rid: this.rid, name: this.name });
|
||||||
this.data.addListener(this.updateState);
|
this.data.addListener(this.updateState);
|
||||||
}
|
}
|
||||||
componentDidMount() {
|
componentDidMount() {
|
||||||
|
|
Loading…
Reference in New Issue