diff --git a/action-creators/team-action-creators.js b/action-creators/team-action-creators.js index a0cc0bc3..82249a16 100644 --- a/action-creators/team-action-creators.js +++ b/action-creators/team-action-creators.js @@ -145,7 +145,7 @@ export const saveTeam = (team: Object): ThunkType => { function thunk(dispatch: Dispatch) { firebaseDataLayer.saveTeam(team) .then((savedTeam: TeamType) => { - dispatch({ type: types.SAVE_TEAM_SUCCESS, savedTeam }); + dispatch({ type: types.SAVE_TEAM_SUCCESS, data: team }); }) .catch((error: Error) => { dispatch({ type: types.SAVE_TEAM_FAIL, error }); @@ -158,7 +158,11 @@ export const saveTeam = (team: Object): ThunkType => { export const createTeam = (team: Object, user: UserType): ThunkType => { function thunk(dispatch: Dispatch) { - firebaseDataLayer.createTeam(Team.create(team), TeamMember.create(user), dispatch); + const newTeam = Team.create(team); + firebaseDataLayer.createTeam(newTeam, TeamMember.create(user), dispatch) + .then((teamId: string) => { + dispatch({ type: types.CREATE_TEAM_SUCCESS, data: { ...newTeam, id: teamId } }); + }); } thunk.interceptOnOffline = true; @@ -170,7 +174,7 @@ export const deleteTeam = (teamId: string): ThunkType => { function thunk(dispatch: Dispatch) { firebaseDataLayer.deleteTeam(teamId) .then((data: any) => { - dispatch({ type: types.DELETE_TEAM_SUCCESS, data }); + dispatch({ type: types.DELETE_TEAM_SUCCESS, data: teamId }); }) .catch((error: Error) => { dispatch({ type: types.DELETE_TEAM_FAIL, error }); diff --git a/components/team-details-editor/index.js b/components/team-details-editor/index.js index bcb95e59..4df079ba 100644 --- a/components/team-details-editor/index.js +++ b/components/team-details-editor/index.js @@ -163,7 +163,7 @@ const mapStateToProps = (state: Object): Object => { const otherCleanAreas = R.compose( R.flatten, R.map((entry: [string, TeamType]): Array => mapToPinData(entry[1].locations, entry[1].name)), - R.filter((entry: [string, TeamType]): boolean => (entry[0] !== selectedTeam.id)), + R.filter((entry: [string, TeamType]): boolean => (entry[0] !== (selectedTeam || {}).id)), Object.entries )(state.teams.teams); diff --git a/constants/action-types.js b/constants/action-types.js index 560734a2..5eab6e56 100644 --- a/constants/action-types.js +++ b/constants/action-types.js @@ -2,6 +2,7 @@ export const ADD_TEAM_MEMBER_FAIL = "ADD_TEAM_MEMBER_FAIL"; export const ADD_TEAM_MEMBER_SUCCESS = "ADD_TEAM_MEMBER_SUCCESS"; export const CREATING_USER = "CREATING_USER"; +export const CREATE_TEAM_SUCCESS = "CREATE_TEAM_SUCCESS"; export const CREATE_USER_FAIL = "CREATE_USER_FAIL"; export const DELETE_MESSAGE_FAIL = "DELETE_MESSAGE_FAIL"; export const DELETE_MESSAGE_SUCCESS = "DELETE_MESSAGE_SUCCESS"; diff --git a/data-sources/firebase-data-layer.js b/data-sources/firebase-data-layer.js index c545e236..4d547ee0 100644 --- a/data-sources/firebase-data-layer.js +++ b/data-sources/firebase-data-layer.js @@ -946,7 +946,7 @@ export async function createTeam(team: Object = {}, user: ?Object = {}, dispatch // setupTeamMemberListener([docRef.id], dispatch); // setupTeamMessageListener([docRef.id], dispatch); - + return docRef.id; } export function saveTeam(team: TeamType): Promise { @@ -984,7 +984,15 @@ export function deleteTeam(teamId: string): Promise { // return new Promise(function(r) { // setTimeout(() => { r('blah'); }, 2000); // }); - return deleteDoc(doc(firestore, "teams", teamId)); + return deleteDoc(doc(firestore, "teams", teamId)).then(() => { + // Clean up all listeners for this team + removeListener(`team_${teamId}_messages`); + removeListener(`team_${teamId}_members`); + removeListener(`team_${teamId}_requests`); + removeListener(`teamMembers_${teamId}_invitations`); + }).catch((error) => { + console.log("error: " + error); + }); // return db.collection("teams").doc(teamId).delete(); } diff --git a/reducers/profile-reducers.js b/reducers/profile-reducers.js index 6006cd19..8c332a43 100644 --- a/reducers/profile-reducers.js +++ b/reducers/profile-reducers.js @@ -28,6 +28,21 @@ export function profileReducers(state: Object = initialState.profile, action: Ac ...state, teams }; + case types.CREATE_TEAM_SUCCESS: { + const createdTeam = action.data; + return { + ...state, + teams: { ...state.teams, [createdTeam.id]: { ...createdTeam, isMember: true } } + }; + } + case types.DELETE_TEAM_SUCCESS: { + const remainingTeams = { ...state.teams }; + delete remainingTeams[action.data]; + return { + ...state, + teams: remainingTeams + }; + } case types.LEAVE_TEAM_FAIL: return { ...state, diff --git a/reducers/teams-reducers.js b/reducers/teams-reducers.js index 7e6cdb07..1a6217fb 100644 --- a/reducers/teams-reducers.js +++ b/reducers/teams-reducers.js @@ -42,7 +42,35 @@ export const teamsReducers = (state: Object = initialState.teams, action: Action ...state, teams: action.data }; - + case types.CREATE_TEAM_SUCCESS : { + const newTeam = action.data; + return { + ...state, + teams: { ...state.teams, [newTeam.id]: newTeam } + }; + } + case types.SAVE_TEAM_SUCCESS : { + const savedTeam = action.data; + return { + ...state, + teams: { ...state.teams, [savedTeam.id]: { ...state.teams[savedTeam.id], ...savedTeam } }, + selectedTeam: state.selectedTeam && state.selectedTeam.id === savedTeam.id + ? { ...state.selectedTeam, ...savedTeam } + : state.selectedTeam + }; + } + case types.DELETE_TEAM_SUCCESS : { + const deletedTeamId = action.data; + const remainingTeams = { ...state.teams }; + delete remainingTeams[deletedTeamId]; + return { + ...state, + teams: remainingTeams, + selectedTeam: state.selectedTeam && state.selectedTeam.id === deletedTeamId + ? null + : state.selectedTeam + }; + } case types.SET_SELECTED_TEAM_VALUE: { const newSelectedTeam = Object.assign({}, state.selectedTeam); newSelectedTeam[(action.data || {}).key] = (action.data || {}).value;