diff --git a/app/controllers/access_controller.rb b/app/controllers/access_controller.rb index 302e9385..c48ac418 100644 --- a/app/controllers/access_controller.rb +++ b/app/controllers/access_controller.rb @@ -32,7 +32,7 @@ class AccessController < ApplicationController # POST maps/:id/access def access - user_ids = params[:access] || [] + user_ids = params[:access].to_a.map(&:to_i) || [] @map.add_new_collaborators(user_ids).each do |user_id| # add_new_collaborators returns array of added users, diff --git a/frontend/src/Metamaps/DataModel/Synapse.js b/frontend/src/Metamaps/DataModel/Synapse.js index e5002824..5f2a6b88 100644 --- a/frontend/src/Metamaps/DataModel/Synapse.js +++ b/frontend/src/Metamaps/DataModel/Synapse.js @@ -38,6 +38,7 @@ const Synapse = Backbone.Model.extend({ newOptions.success = function(model, response, opt) { if (s) s(model, response, opt) + model.set('calculated_permission', model.get('permission')) model.trigger('saved') if (permBefore === 'private' && model.get('permission') !== 'private') { diff --git a/frontend/src/Metamaps/DataModel/Topic.js b/frontend/src/Metamaps/DataModel/Topic.js index 1e27d138..dff635f2 100644 --- a/frontend/src/Metamaps/DataModel/Topic.js +++ b/frontend/src/Metamaps/DataModel/Topic.js @@ -37,8 +37,8 @@ const Topic = Backbone.Model.extend({ newOptions.success = function(model, response, opt) { if (s) s(model, response, opt) - model.trigger('saved') model.set('calculated_permission', model.get('permission')) + model.trigger('saved') if (permBefore === 'private' && model.get('permission') !== 'private') { model.trigger('noLongerPrivate') diff --git a/realtime/reducer.js b/realtime/reducer.js index ae2b7488..9b50d3a0 100644 --- a/realtime/reducer.js +++ b/realtime/reducer.js @@ -1,4 +1,4 @@ -const { omit, omitBy, isNil, mapValues } = require('lodash') +const { find, omit, mapValues, values } = require('lodash') const { JOIN_MAP, LEAVE_MAP, @@ -9,7 +9,16 @@ const { const NOT_IN_CONVERSATION = 0 const IN_CONVERSATION = 1 -const addMapperToMap = (map, userId) => { return Object.assign({}, map, { [userId]: NOT_IN_CONVERSATION }) } +const addMapperToMap = (map, userId) => Object.assign({}, map, { [userId]: NOT_IN_CONVERSATION }) +const userStillPresent = (userId, liveMaps) => { + if (!userId) return false + let stillPresent = false + const userIdString = userId.toString() + values(liveMaps).forEach(presentUsers => { + if (find(Object.keys(presentUsers), id => id === userIdString)) stillPresent = true + }) + return stillPresent +} const reducer = (state = { connectedPeople: {}, liveMaps: {} }, action) => { const { type, payload } = action @@ -37,10 +46,13 @@ const reducer = (state = { connectedPeople: {}, liveMaps: {} }, action) => { const newLiveMaps = mapWillEmpty ? omit(liveMaps, payload.mapid) : Object.assign({}, liveMaps, { [payload.mapid]: omit(map, payload.userid) }) + delete newLiveMaps[undefined] + delete newLiveMaps[null] + const updateConnectedPeople = userStillPresent(payload.userid, newLiveMaps) ? connectedPeople : omit(connectedPeople, payload.userid) return { - connectedPeople: omit(connectedPeople, payload.userid), - liveMaps: omitBy(newLiveMaps, isNil) + connectedPeople: updateConnectedPeople, + liveMaps: newLiveMaps } case JOIN_CALL: // update the user (payload.id is user id) in the given map to be marked in the conversation @@ -57,15 +69,18 @@ const reducer = (state = { connectedPeople: {}, liveMaps: {} }, action) => { : Object.assign({}, map, { [payload.userid]: NOT_IN_CONVERSATION }) return Object.assign({}, state, { - liveMaps: Object.assign({}, liveMaps, { map: newMap }) + liveMaps: Object.assign({}, liveMaps, { [payload.mapid]: newMap }) }) case 'DISCONNECT': const mapWithoutUser = omit(map, payload.userid) const newMapWithoutUser = callWillFinish ? mapValues(mapWithoutUser, () => NOT_IN_CONVERSATION) : mapWithoutUser const newLiveMapsWithoutUser = mapWillEmpty ? omit(liveMaps, payload.mapid) : Object.assign({}, liveMaps, { [payload.mapid]: newMapWithoutUser }) + delete newLiveMapsWithoutUser[undefined] + delete newLiveMapsWithoutUser[null] + const newConnectedPeople = userStillPresent(payload.userid, newLiveMapsWithoutUser) ? connectedPeople : omit(connectedPeople, payload.userid) return { - connectedPeople: omit(connectedPeople, payload.userid), - liveMaps: omitBy(newLiveMapsWithoutUser, isNil) + connectedPeople: newConnectedPeople, + liveMaps: newLiveMapsWithoutUser } default: return state