From 219817f7cc9f65c9961a2bbdbbaff5cff7cde2b7 Mon Sep 17 00:00:00 2001 From: Guilherme Gazzo Date: Mon, 8 Apr 2019 13:38:16 -0300 Subject: [PATCH 1/5] fix user rerender messages --- app/models/client/models/Users.js | 2 +- app/ui-message/client/messageBox.js | 62 ++++++++++++++++------- app/ui-utils/client/lib/messageContext.js | 7 +-- app/ui-utils/client/lib/prependReplies.js | 4 +- app/ui/client/views/app/room.js | 2 +- app/utils/client/lib/roomTypes.js | 6 +-- 6 files changed, 54 insertions(+), 29 deletions(-) diff --git a/app/models/client/models/Users.js b/app/models/client/models/Users.js index 5e2c299a7113..298cddb9cd96 100644 --- a/app/models/client/models/Users.js +++ b/app/models/client/models/Users.js @@ -6,7 +6,7 @@ Object.assign(Users, { _id: userId, }; - const user = this.findOne(query); + const user = this.findOne(query, { fields: { roles: 1 } }); return user && Array.isArray(user.roles) && user.roles.includes(roleName); }, diff --git a/app/ui-message/client/messageBox.js b/app/ui-message/client/messageBox.js index e7286f51667a..2f3e0fe055e2 100644 --- a/app/ui-message/client/messageBox.js +++ b/app/ui-message/client/messageBox.js @@ -1,9 +1,11 @@ import { Meteor } from 'meteor/meteor'; import { ReactiveVar } from 'meteor/reactive-var'; +import { ReactiveDict } from 'meteor/reactive-dict'; import { Session } from 'meteor/session'; import { Template } from 'meteor/templating'; import { Tracker } from 'meteor/tracker'; import { EmojiPicker } from '../../emoji'; +import { Users } from '../../models'; import { settings } from '../../settings'; import { fileUpload, @@ -34,6 +36,7 @@ import './messageBox.html'; Template.messageBox.onCreated(function() { + this.state = new ReactiveDict(); EmojiPicker.init(); this.popupConfig = new ReactiveVar(null); this.replyMessageData = new ReactiveVar(); @@ -42,6 +45,32 @@ Template.messageBox.onCreated(function() { }); Template.messageBox.onRendered(function() { + + this.autorun(() => { + const { rid, subscription } = Template.currentData(); + const room = Session.get(`roomData${ rid }`); + + if (!room) { + return this.state.set({ + room: false, + isBlockedOrBlocker: false, + mustJoinWithCode: false, + }); + } + + const isBlocked = (room && room.t === 'd' && subscription && subscription.blocked); + const isBlocker = (room && room.t === 'd' && subscription && subscription.blocker); + const isBlockedOrBlocker = isBlocked || isBlocker; + + const mustJoinWithCode = !subscription && room.joinCodeRequired; + + return this.state.set({ + room: false, + isBlockedOrBlocker, + mustJoinWithCode, + }); + }); + this.autorun(() => { const { rid, onInputChanged, onResize } = Template.currentData(); @@ -84,15 +113,14 @@ Template.messageBox.onRendered(function() { Template.messageBox.helpers({ isAnonymousOrMustJoinWithCode() { - const { rid, subscription } = Template.currentData(); + const instance = Template.instance(); + const { rid } = Template.currentData(); if (!rid) { return false; } - const roomData = Session.get(`roomData${ rid }`); const isAnonymous = !Meteor.userId(); - const mustJoinWithCode = !subscription && roomData && roomData.joinCodeRequired; - return isAnonymous || mustJoinWithCode; + return isAnonymous || instance.state.get('mustJoinWithCode'); }, isWritable() { const { rid, subscription } = Template.currentData(); @@ -100,12 +128,16 @@ Template.messageBox.helpers({ return true; } - const roomData = Session.get(`roomData${ rid }`); - const isReadOnly = roomTypes.readOnly(rid, Meteor.user()); - const isArchived = roomTypes.archived(rid) || (roomData && roomData.t === 'd' && subscription && subscription.archived); - const isBlocked = (roomData && roomData.t === 'd' && subscription && subscription.blocked); - const isBlocker = (roomData && roomData.t === 'd' && subscription && subscription.blocker); - return !isReadOnly && !isArchived && !isBlocked && !isBlocker; + const isBlockedOrBlocker = Template.instance().state.get('isBlockedOrBlocker'); + + if (isBlockedOrBlocker) { + return false; + } + + const isReadOnly = roomTypes.readOnly(rid, Users.findOne({ _id: Meteor.userId() }, { fields: { username: 1 } })); + const isArchived = roomTypes.archived(rid) || (subscription && subscription.t === 'd' && subscription.archived); + + return !isReadOnly && !isArchived; }, popupConfig() { return Template.instance().popupConfig.get(); @@ -142,15 +174,7 @@ Template.messageBox.helpers({ return formattingButtons.filter(({ condition }) => !condition || condition()); }, isBlockedOrBlocker() { - const { rid, subscription } = Template.currentData(); - if (!rid) { - return true; - } - - const roomData = Session.get(`roomData${ rid }`); - const isBlocked = (roomData && roomData.t === 'd' && subscription && subscription.blocked); - const isBlocker = (roomData && roomData.t === 'd' && subscription && subscription.blocker); - return isBlocked || isBlocker; + return Template.instance().state.get('isBlockedOrBlocker'); }, }); diff --git a/app/ui-utils/client/lib/messageContext.js b/app/ui-utils/client/lib/messageContext.js index d9aacf4c5e58..ff288ab45cee 100644 --- a/app/ui-utils/client/lib/messageContext.js +++ b/app/ui-utils/client/lib/messageContext.js @@ -1,15 +1,16 @@ import { Meteor } from 'meteor/meteor'; import { Template } from 'meteor/templating'; -import { Subscriptions, Rooms } from '../../../models'; +import { Subscriptions, Rooms, Users } from '../../../models'; import { hasPermission } from '../../../authorization'; import { settings } from '../../../settings'; import { getUserPreference } from '../../../utils'; export function messageContext() { const { rid } = Template.instance(); + const uid = Meteor.userId(); return { - u: Meteor.user(), + u: Users.findOne({ _id: uid }, { fields: { name: 1, username: 1 }, reactive: false }), room: Rooms.findOne({ _id: rid }, { reactive: false, fields: { @@ -27,7 +28,7 @@ export function messageContext() { showreply: true, showReplyButton: true, hasPermissionDeleteMessage: hasPermission('delete-message', rid), - hideRoles: !settings.get('UI_DisplayRoles') || getUserPreference(Meteor.userId(), 'hideRoles'), + hideRoles: !settings.get('UI_DisplayRoles') || getUserPreference(uid, 'hideRoles'), UI_Use_Real_Name: settings.get('UI_Use_Real_Name'), Chatops_Username: settings.get('Chatops_Username'), AutoTranslate_Enabled: settings.get('AutoTranslate_Enabled'), diff --git a/app/ui-utils/client/lib/prependReplies.js b/app/ui-utils/client/lib/prependReplies.js index 0e85b08a70b7..2834457f65f4 100644 --- a/app/ui-utils/client/lib/prependReplies.js +++ b/app/ui-utils/client/lib/prependReplies.js @@ -1,9 +1,9 @@ import { Meteor } from 'meteor/meteor'; import { MessageAction } from './MessageAction'; -import { Rooms } from '../../../models'; +import { Rooms, Users } from '../../../models'; export const prependReplies = async (msg, replies = [], mention = false) => { - const { username } = Meteor.user(); + const { username } = Users.findOne({ _id: Meteor.userID() }, { fields: { username: 1 } }); const chunks = await Promise.all(replies.map(async ({ _id, rid, u }) => { const permalink = await MessageAction.getPermaLink(_id); diff --git a/app/ui/client/views/app/room.js b/app/ui/client/views/app/room.js index fd2279e85403..c3d64e3a92f4 100644 --- a/app/ui/client/views/app/room.js +++ b/app/ui/client/views/app/room.js @@ -37,7 +37,7 @@ export const chatMessages = {}; const favoritesEnabled = () => settings.get('Favorite_Rooms'); -const userCanDrop = (_id) => !roomTypes.readOnly(_id, Meteor.user()); +const userCanDrop = (_id) => !roomTypes.readOnly(_id, Users.findOne({ _id: Meteor.userId() }, { fields: { username: 1 } })); const openProfileTab = (e, instance, username) => { const roomData = Session.get(`roomData${ RoomManager.openedRoom }`); diff --git a/app/utils/client/lib/roomTypes.js b/app/utils/client/lib/roomTypes.js index 0237a0a66cad..f0ef0325ab60 100644 --- a/app/utils/client/lib/roomTypes.js +++ b/app/utils/client/lib/roomTypes.js @@ -38,7 +38,7 @@ export const roomTypes = new class RocketChatRoomTypes extends RoomTypesCommon { rid: roomId, }).count() > 0; } - readOnly(roomId, user) { + readOnly(rid, user) { const fields = { ro: 1, }; @@ -46,7 +46,7 @@ export const roomTypes = new class RocketChatRoomTypes extends RoomTypesCommon { fields.muted = 1; } const room = ChatRoom.findOne({ - _id: roomId, + _id: rid, }, { fields, }); @@ -54,7 +54,7 @@ export const roomTypes = new class RocketChatRoomTypes extends RoomTypesCommon { return room && room.ro; } const userOwner = RoomRoles.findOne({ - rid: roomId, + rid, 'u._id': user._id, roles: 'owner', }, { From 95f8760b7e1960d84aed57b7b70ebea81ca0f44f Mon Sep 17 00:00:00 2001 From: Diego Sampaio Date: Mon, 8 Apr 2019 14:34:28 -0300 Subject: [PATCH 2/5] Use reactive find for user --- app/ui-utils/client/lib/messageContext.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/ui-utils/client/lib/messageContext.js b/app/ui-utils/client/lib/messageContext.js index ff288ab45cee..d851ff9edf26 100644 --- a/app/ui-utils/client/lib/messageContext.js +++ b/app/ui-utils/client/lib/messageContext.js @@ -10,7 +10,7 @@ export function messageContext() { const { rid } = Template.instance(); const uid = Meteor.userId(); return { - u: Users.findOne({ _id: uid }, { fields: { name: 1, username: 1 }, reactive: false }), + u: Users.findOne({ _id: uid }, { fields: { name: 1, username: 1 } }), room: Rooms.findOne({ _id: rid }, { reactive: false, fields: { From ea9810ca672c1bdc766463de77de62e8157fed36 Mon Sep 17 00:00:00 2001 From: Diego Sampaio Date: Mon, 8 Apr 2019 14:36:20 -0300 Subject: [PATCH 3/5] Fix import paths --- app/ui-utils/client/lib/messageContext.js | 8 ++++---- app/ui-utils/client/lib/prependReplies.js | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/ui-utils/client/lib/messageContext.js b/app/ui-utils/client/lib/messageContext.js index d851ff9edf26..2e1ec808ae1d 100644 --- a/app/ui-utils/client/lib/messageContext.js +++ b/app/ui-utils/client/lib/messageContext.js @@ -1,10 +1,10 @@ import { Meteor } from 'meteor/meteor'; import { Template } from 'meteor/templating'; -import { Subscriptions, Rooms, Users } from '../../../models'; -import { hasPermission } from '../../../authorization'; -import { settings } from '../../../settings'; -import { getUserPreference } from '../../../utils'; +import { Subscriptions, Rooms, Users } from '../../../models/client'; +import { hasPermission } from '../../../authorization/client'; +import { settings } from '../../../settings/client'; +import { getUserPreference } from '../../../utils/client'; export function messageContext() { const { rid } = Template.instance(); diff --git a/app/ui-utils/client/lib/prependReplies.js b/app/ui-utils/client/lib/prependReplies.js index 2834457f65f4..38163f0d1177 100644 --- a/app/ui-utils/client/lib/prependReplies.js +++ b/app/ui-utils/client/lib/prependReplies.js @@ -1,6 +1,6 @@ import { Meteor } from 'meteor/meteor'; import { MessageAction } from './MessageAction'; -import { Rooms, Users } from '../../../models'; +import { Rooms, Users } from '../../../models/client'; export const prependReplies = async (msg, replies = [], mention = false) => { const { username } = Users.findOne({ _id: Meteor.userID() }, { fields: { username: 1 } }); From 5114bd412dbdf2bf96959ee2849c3ebe19e918b5 Mon Sep 17 00:00:00 2001 From: Diego Sampaio Date: Mon, 8 Apr 2019 15:58:18 -0300 Subject: [PATCH 4/5] Fix Meteor.userId() --- app/ui-utils/client/lib/prependReplies.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/ui-utils/client/lib/prependReplies.js b/app/ui-utils/client/lib/prependReplies.js index 38163f0d1177..b7a944eeca05 100644 --- a/app/ui-utils/client/lib/prependReplies.js +++ b/app/ui-utils/client/lib/prependReplies.js @@ -3,7 +3,7 @@ import { MessageAction } from './MessageAction'; import { Rooms, Users } from '../../../models/client'; export const prependReplies = async (msg, replies = [], mention = false) => { - const { username } = Users.findOne({ _id: Meteor.userID() }, { fields: { username: 1 } }); + const { username } = Users.findOne({ _id: Meteor.userId() }, { fields: { username: 1 } }); const chunks = await Promise.all(replies.map(async ({ _id, rid, u }) => { const permalink = await MessageAction.getPermaLink(_id); From 1f46526d39e1aae0b789641cb08873cd34c0f92c Mon Sep 17 00:00:00 2001 From: Diego Sampaio Date: Mon, 8 Apr 2019 15:59:22 -0300 Subject: [PATCH 5/5] Improve imports and import order --- app/ui/client/lib/chatMessages.js | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/app/ui/client/lib/chatMessages.js b/app/ui/client/lib/chatMessages.js index 9eb9817b4fef..b0c46671f4df 100644 --- a/app/ui/client/lib/chatMessages.js +++ b/app/ui/client/lib/chatMessages.js @@ -1,9 +1,14 @@ +import _ from 'underscore'; +import moment from 'moment'; +import toastr from 'toastr'; + import { Meteor } from 'meteor/meteor'; import { Random } from 'meteor/random'; import { FlowRouter } from 'meteor/kadira:flow-router'; import { Session } from 'meteor/session'; import { TAPi18n } from 'meteor/tap:i18n'; -import { t, slashCommands, handleError } from '../../../utils'; + +import { t, slashCommands, handleError } from '../../../utils/client'; import { messageProperties, MessageTypes, @@ -12,18 +17,16 @@ import { call, keyCodes, prependReplies, -} from '../../../ui-utils'; -import { settings } from '../../../settings'; -import { callbacks } from '../../../callbacks'; +} from '../../../ui-utils/client'; +import { settings } from '../../../settings/client'; +import { callbacks } from '../../../callbacks/client'; import { promises } from '../../../promises/client'; -import { hasAtLeastOnePermission } from '../../../authorization'; -import { Messages, Rooms, ChatMessage, ChatSubscription } from '../../../models'; -import { emoji } from '../../../emoji'; +import { hasAtLeastOnePermission } from '../../../authorization/client'; +import { Messages, Rooms, ChatMessage, ChatSubscription } from '../../../models/client'; +import { emoji } from '../../../emoji/client'; + import { KonchatNotification } from './notification'; import { MsgTyping } from './msgTyping'; -import _ from 'underscore'; -import moment from 'moment'; -import toastr from 'toastr'; import { fileUpload } from './fileUpload'; const messageBoxState = {