From 677f7a8cb058d41f237df68547304b5aaf9e832b Mon Sep 17 00:00:00 2001 From: Chris Duarte Date: Tue, 17 Jan 2017 06:27:53 -0800 Subject: [PATCH] Auto select last team viewed (#161) * WIP Autoselect last team viewed * Auto select last team viewed * Fix auto login in root. * Fix per PR comments Remove unused actions. Use currentTeam selector. --- app/actions/storage/index.js | 19 ++++++++++++++----- app/scenes/root/root.js | 1 + app/scenes/root/root_container.js | 3 ++- app/scenes/select_team/select_team.js | 12 ++++++++++-- .../select_team/select_team_container.js | 4 ++++ service/actions/teams.js | 10 ++++------ 6 files changed, 35 insertions(+), 14 deletions(-) diff --git a/app/actions/storage/index.js b/app/actions/storage/index.js index 012dfd065..5ae724feb 100644 --- a/app/actions/storage/index.js +++ b/app/actions/storage/index.js @@ -2,14 +2,21 @@ // See License.txt for license information. import {AsyncStorage} from 'react-native'; -import {GeneralTypes, UsersTypes} from 'service/constants'; +import {batchActions} from 'redux-batched-actions'; +import {GeneralTypes, TeamsTypes, UsersTypes} from 'service/constants'; import Client from 'service/client'; export function loadStorage() { return async (dispatch, getState) => { try { const data = JSON.parse(await AsyncStorage.getItem('storage')); - dispatch({type: GeneralTypes.RECEIVED_APP_CREDENTIALS, data}, getState); + const {token, url, currentTeamId} = data; + const credentials = {token, url}; + + dispatch(batchActions([ + {type: GeneralTypes.RECEIVED_APP_CREDENTIALS, data: credentials}, + {type: TeamsTypes.SELECT_TEAM, data: currentTeamId} + ]), getState); } catch (error) { // Error loading data dispatch({type: GeneralTypes.REMOVED_APP_CREDENTIALS, error}, getState); @@ -17,15 +24,17 @@ export function loadStorage() { }; } -export function saveStorage() { +export function saveStorage(data = {}) { return async (dispatch, getState) => { try { - const data = { + const clientData = { token: Client.getToken(), url: Client.getUrl() }; - await AsyncStorage.setItem('storage', JSON.stringify(data)); + const mergedStorageData = Object.assign({}, data, clientData); + + await AsyncStorage.setItem('storage', JSON.stringify(mergedStorageData)); dispatch({type: GeneralTypes.RECEIVED_APP_CREDENTIALS, data}, getState); } catch (error) { // Error saving data diff --git a/app/scenes/root/root.js b/app/scenes/root/root.js index 95afc9ac5..b77d9fd09 100644 --- a/app/scenes/root/root.js +++ b/app/scenes/root/root.js @@ -12,6 +12,7 @@ export default class Root extends React.Component { logoutRequest: React.PropTypes.object, loginRequest: React.PropTypes.object, actions: React.PropTypes.shape({ + goToChannelView: React.PropTypes.func, goToSelectServer: React.PropTypes.func, goToSelectTeam: React.PropTypes.func, loadStorage: React.PropTypes.func, diff --git a/app/scenes/root/root_container.js b/app/scenes/root/root_container.js index 10429869e..53fe0d11e 100644 --- a/app/scenes/root/root_container.js +++ b/app/scenes/root/root_container.js @@ -6,7 +6,7 @@ import {connect} from 'react-redux'; import {loadStorage, removeStorage} from 'app/actions/storage'; import {goToSelectServer, setStoreFromLocalData} from 'app/actions/views/root'; -import {goToSelectTeam} from 'app/actions/navigation'; +import {goToSelectTeam, goToChannelView} from 'app/actions/navigation'; import {resetLogout} from 'service/actions/users'; import Root from './root'; @@ -23,6 +23,7 @@ function mapStateToProps(state, ownProps) { function mapDispatchToProps(dispatch) { return { actions: bindActionCreators({ + goToChannelView, goToSelectServer, goToSelectTeam, loadStorage, diff --git a/app/scenes/select_team/select_team.js b/app/scenes/select_team/select_team.js index 99372df3d..86ab31d77 100644 --- a/app/scenes/select_team/select_team.js +++ b/app/scenes/select_team/select_team.js @@ -21,6 +21,7 @@ export default class SelectTeam extends Component { teams: PropTypes.object.isRequired, myMembers: PropTypes.object.isRequired, teamsRequest: PropTypes.object.isRequired, + currentTeam: PropTypes.object, actions: PropTypes.object.isRequired }; @@ -29,7 +30,13 @@ export default class SelectTeam extends Component { } componentDidMount() { - this.selectFirstTeam(this.props.teams, this.props.myMembers); + const {currentTeam, myMembers, teams} = this.props; + + if (currentTeam) { + this.onSelectTeam(currentTeam); + } else if (!currentTeam) { + this.selectFirstTeam(teams, myMembers); + } } componentWillReceiveProps(nextProps) { @@ -49,7 +56,8 @@ export default class SelectTeam extends Component { onSelectTeam(team) { this.props.actions.selectTeam(team).then(() => { - this.props.actions.goToChannelView(); + this.props.actions.saveStorage({currentTeamId: team.id}). + then(this.props.actions.goToChannelView()); }); } diff --git a/app/scenes/select_team/select_team_container.js b/app/scenes/select_team/select_team_container.js index b08f38039..a33ec1715 100644 --- a/app/scenes/select_team/select_team_container.js +++ b/app/scenes/select_team/select_team_container.js @@ -6,7 +6,9 @@ import {connect} from 'react-redux'; import {selectTeam} from 'service/actions/teams'; import {init as websocket} from 'service/actions/websocket'; +import {saveStorage} from 'app/actions/storage'; import {goToChannelView} from 'app/actions/navigation'; +import {getCurrentTeam} from 'service/selectors/entities/teams'; import SelectTeamView from './select_team.js'; @@ -15,6 +17,7 @@ function mapStateToProps(state) { config: state.entities.general.config, teamsRequest: state.requests.teams.allTeams, teams: state.entities.teams.teams, + currentTeam: getCurrentTeam(state), myMembers: state.entities.teams.myMembers }; } @@ -23,6 +26,7 @@ function mapDispatchToProps(dispatch) { return { actions: bindActionCreators({ goToChannelView, + saveStorage, selectTeam, websocket }, dispatch) diff --git a/service/actions/teams.js b/service/actions/teams.js index 8b7ae28e4..00b608c8b 100644 --- a/service/actions/teams.js +++ b/service/actions/teams.js @@ -32,12 +32,10 @@ async function getProfilesAndStatusesForMembers(userIds, dispatch, getState) { } export function selectTeam(team) { - return async (dispatch, getState) => { - dispatch({ - type: TeamsTypes.SELECT_TEAM, - data: team.id - }, getState); - }; + return async (dispatch, getState) => dispatch({ + type: TeamsTypes.SELECT_TEAM, + data: team.id + }, getState); } export function fetchTeams() {