From fb54664862c4526ac8f0843a26166a60ea775b6a Mon Sep 17 00:00:00 2001 From: Marcos Spessatto Defendi Date: Tue, 15 Jan 2019 18:13:41 -0200 Subject: [PATCH] Remove dependency of RocketChat namespace inside rocketchat:ui (#13131) * Move rocketchat settings to specific package * WIP: Move models from rocketchat-lib to a specific package (server) * Move function from rocketchat:lib to rocketchat:utils to use it in rocketchat:models * Move client models from rocketchat:lib to rocketchat:models * Fix lint * Move rocketchat.info from lib to utils * Remove directly dependency between lib and migrations * Move statistics Model to rocketchat:models * Create rocketchat:metrics to be able to depacking rocketchat callbacks * Move callbacks to specific package * Remove unused dependency * Move rocketchat-notifications to a specific package * Move rocketchat-promises to a specific package * remove directly dependency from metrics and models * Move CachedCollection from lib to models * Move ui models/collections from ui to models * Move authorization client/ui models to rocketchat:models to be able to remove lib dependency * Creation of rocketchat:ui-utils to help decouple rocketchat:lib and rocketchat:authz * Move some common functions to rocketchat:utils * Change imports to dynamic imports to avoid directly dependency between some packages * Move authz models to rocketchat:models * Remove directly dependency between rocketchat:authz and rocketchat:lib * Move some functions from rocketchat:lib to rocketchat:utils * Add functions to settings package * Convert rocketchat:file-upload to main module structure * Import FileUpload where it is being used * Remove FileUpload and fileUploadHandler from globals eslintrc * Move some functions to rocketchat:ui-utils * Remove directly dependency between rocketchat:authorization and rocketchat:ui-utils * Remove dependency between lazy-load and lib * Change imports of renderMessageBody from ui-message to ui-utils * Add import of main ready from ui-utils * Convert rocketchat-ui-sidenav to main module structure * Add imports of toolbarSearch from ui-sidenav * Remove toolbarSearch from eslintrc globals * Move CachedCollection to a specific package * Change imports of CachedCollection to new package * Move some functions to rocketchat:ui-utils * Remove directly dependency between tooltip and lib * Remove directly dependency between settings and metrics * Move some settings client function from lib to settings * Convert rocketchat-ui-master to main module structure * Remove directly dependency between rocketchat:e2e and rocketchat:lib * Fix wrong import and lint * Convert rocketchat-webrtc to main module structure * Fix missing export * Remove directly dependency between rocketchat:emoji and lib * Add emoji dependencies inside RocketChat namespace * Merge branch 'develop' into globals/move-rocketchat-callbacks * Move some functions to utils * Fix lint * Move some ui functions to ui-utils * Fix import missed objects inside RocketChat namespace * Fix lint * Remove rocketchat:ui package dependency of RocketChat namespace * Remove lib dependency in rocketchat:ui-sidenav * Remove dependency between lib and ui-vrecord * Add logger dependency in file-upload * Revert commented test file --- packages/rocketchat-file-upload/package.js | 1 + .../rocketchat-lib/client/lib/ui-buttons.js | 7 ++ packages/rocketchat-lib/package.js | 2 + packages/rocketchat-ui-sidenav/package.js | 1 - .../client/lib/RoomManager.js | 1 - packages/rocketchat-ui-vrecord/package.js | 3 +- .../rocketchat-ui-vrecord/server/settings.js | 4 +- .../client/components/header/header.js | 29 +++-- .../client/components/popupList.js | 3 +- packages/rocketchat-ui/client/index.js | 1 + .../rocketchat-ui/client/lib/chatMessages.js | 53 ++++---- .../rocketchat-ui/client/lib/collections.js | 3 +- .../rocketchat-ui/client/lib/cordova/push.js | 3 +- .../client/lib/cordova/user-state.js | 1 + packages/rocketchat-ui/client/lib/esc.js | 8 +- .../rocketchat-ui/client/lib/fileUpload.js | 7 +- .../client/lib/iframeCommands.js | 9 +- packages/rocketchat-ui/client/lib/menu.js | 11 +- packages/rocketchat-ui/client/lib/modal.js | 110 ---------------- .../rocketchat-ui/client/lib/msgTyping.js | 10 +- .../rocketchat-ui/client/lib/notification.js | 18 +-- .../client/lib/recorderjs/recorder.js | 4 +- packages/rocketchat-ui/client/lib/rocket.js | 18 +-- .../rocketchat-ui/client/views/app/burger.js | 3 +- .../client/views/app/createChannel.js | 37 +++--- .../client/views/app/directory.js | 12 +- .../rocketchat-ui/client/views/app/home.js | 5 +- .../rocketchat-ui/client/views/app/room.js | 118 ++++++++++-------- .../client/views/app/roomSearch.js | 3 +- .../client/views/app/secretURL.js | 3 +- .../rocketchat-ui/client/views/cmsPage.js | 3 +- packages/rocketchat-ui/package.js | 4 +- 32 files changed, 227 insertions(+), 268 deletions(-) create mode 100644 packages/rocketchat-lib/client/lib/ui-buttons.js create mode 100644 packages/rocketchat-ui/client/index.js delete mode 100644 packages/rocketchat-ui/client/lib/modal.js diff --git a/packages/rocketchat-file-upload/package.js b/packages/rocketchat-file-upload/package.js index 3d2b1d8abae..4d19339dd79 100644 --- a/packages/rocketchat-file-upload/package.js +++ b/packages/rocketchat-file-upload/package.js @@ -20,6 +20,7 @@ Package.onUse(function(api) { 'rocketchat:settings', 'rocketchat:callbacks', 'rocketchat:authorization', + 'rocketchat:logger', 'random', 'accounts-base', 'tracker', diff --git a/packages/rocketchat-lib/client/lib/ui-buttons.js b/packages/rocketchat-lib/client/lib/ui-buttons.js new file mode 100644 index 00000000000..cf026fe7cfc --- /dev/null +++ b/packages/rocketchat-lib/client/lib/ui-buttons.js @@ -0,0 +1,7 @@ +import { Login, Button, animationSupport, animeBack, preLoadImgs } from 'meteor/rocketchat:ui'; + +RocketChat.Login = Login; +RocketChat.Button = Button; +RocketChat.animationSupport = animationSupport; +RocketChat.animeBack = animeBack; +RocketChat.preLoadImgs = preLoadImgs; diff --git a/packages/rocketchat-lib/package.js b/packages/rocketchat-lib/package.js index 8cc3c1c3ded..9784e41bedd 100644 --- a/packages/rocketchat-lib/package.js +++ b/packages/rocketchat-lib/package.js @@ -34,6 +34,7 @@ Package.onUse(function(api) { api.use('rocketchat:ui-utils'); api.use('rocketchat:tooltip'); api.use('rocketchat:emoji'); + api.use('rocketchat:ui'); api.use('rocketchat:accounts'); api.use('modules'); api.use('rocketchat:i18n'); @@ -240,6 +241,7 @@ Package.onUse(function(api) { api.addFiles('client/lib/authorization.js', 'client'); api.addFiles('client/lib/tooltip.js', 'client'); api.addFiles('client/lib/EmojiPicker.js', 'client'); + api.addFiles('client/lib/ui-buttons.js', 'client'); // CLIENT LIB STARTUP api.addFiles('client/lib/startup/commands.js', 'client'); diff --git a/packages/rocketchat-ui-sidenav/package.js b/packages/rocketchat-ui-sidenav/package.js index 66e3d0decee..a82212b38e4 100644 --- a/packages/rocketchat-ui-sidenav/package.js +++ b/packages/rocketchat-ui-sidenav/package.js @@ -14,7 +14,6 @@ Package.onUse(function(api) { api.use([ 'ecmascript', 'templating', - 'rocketchat:lib', 'rocketchat:callbacks', 'rocketchat:authorization', 'rocketchat:settings', diff --git a/packages/rocketchat-ui-utils/client/lib/RoomManager.js b/packages/rocketchat-ui-utils/client/lib/RoomManager.js index 006d6a24076..6d9abeb45f2 100644 --- a/packages/rocketchat-ui-utils/client/lib/RoomManager.js +++ b/packages/rocketchat-ui-utils/client/lib/RoomManager.js @@ -31,7 +31,6 @@ const onDeleteMessageBulkStream = ({ rid, ts, excludePinned, users }) => { export const RoomManager = new function() { const openedRooms = {}; - let openedRoom = undefined; //eslint-disable-line const msgStream = new Meteor.Streamer('room-messages'); const onlineUsers = new ReactiveVar({}); const Dep = new Tracker.Dependency(); diff --git a/packages/rocketchat-ui-vrecord/package.js b/packages/rocketchat-ui-vrecord/package.js index fca0a279381..374758fdfc1 100644 --- a/packages/rocketchat-ui-vrecord/package.js +++ b/packages/rocketchat-ui-vrecord/package.js @@ -11,7 +11,8 @@ Package.onUse(function(api) { 'ecmascript', 'templating', 'tracker', - 'rocketchat:lib', + 'rocketchat:settings', + 'rocketchat:ui', ]); api.addFiles('client/vrecord.css', 'client'); api.mainModule('server/index.js', 'server'); diff --git a/packages/rocketchat-ui-vrecord/server/settings.js b/packages/rocketchat-ui-vrecord/server/settings.js index 88f2f6a907a..ab10627c347 100644 --- a/packages/rocketchat-ui-vrecord/server/settings.js +++ b/packages/rocketchat-ui-vrecord/server/settings.js @@ -1,6 +1,6 @@ -import { RocketChat } from 'meteor/rocketchat:lib'; +import { settings } from 'meteor/rocketchat:settings'; -RocketChat.settings.addGroup('Message', function() { +settings.addGroup('Message', function() { this.add('Message_VideoRecorderEnabled', true, { type: 'boolean', public: true, diff --git a/packages/rocketchat-ui/client/components/header/header.js b/packages/rocketchat-ui/client/components/header/header.js index 03d82cffa02..cd9d5bfcfd1 100644 --- a/packages/rocketchat-ui/client/components/header/header.js +++ b/packages/rocketchat-ui/client/components/header/header.js @@ -1,11 +1,14 @@ import { Meteor } from 'meteor/meteor'; import { Session } from 'meteor/session'; import { Template } from 'meteor/templating'; -import { t } from 'meteor/rocketchat:utils'; +import { t, roomTypes, handleError } from 'meteor/rocketchat:utils'; +import { TabBar, fireGlobalEvent } from 'meteor/rocketchat:ui-utils'; +import { ChatSubscription, Rooms } from 'meteor/rocketchat:models'; +import { settings } from 'meteor/rocketchat:settings'; const isSubscribed = (_id) => ChatSubscription.find({ rid: _id }).count() > 0; -const favoritesEnabled = () => RocketChat.settings.get('Favorite_Rooms'); +const favoritesEnabled = () => settings.get('Favorite_Rooms'); Template.header.helpers({ back() { @@ -14,15 +17,15 @@ Template.header.helpers({ avatarBackground() { const roomData = Session.get(`roomData${ this._id }`); if (!roomData) { return ''; } - return RocketChat.roomTypes.getSecondaryRoomName(roomData.t, roomData) || RocketChat.roomTypes.getRoomName(roomData.t, roomData); + return roomTypes.getSecondaryRoomName(roomData.t, roomData) || roomTypes.getRoomName(roomData.t, roomData); }, buttons() { - return RocketChat.TabBar.getButtons(); + return TabBar.getButtons(); }, isTranslated() { const sub = ChatSubscription.findOne({ rid: this._id }, { fields: { autoTranslate: 1, autoTranslateLanguage: 1 } }); - return RocketChat.settings.get('AutoTranslate_Enabled') && ((sub != null ? sub.autoTranslate : undefined) === true) && (sub.autoTranslateLanguage != null); + return settings.get('AutoTranslate_Enabled') && ((sub != null ? sub.autoTranslate : undefined) === true) && (sub.autoTranslateLanguage != null); }, state() { @@ -38,21 +41,21 @@ Template.header.helpers({ }, isDirect() { - return RocketChat.models.Rooms.findOne(this._id).t === 'd'; + return Rooms.findOne(this._id).t === 'd'; }, roomName() { const roomData = Session.get(`roomData${ this._id }`); if (!roomData) { return ''; } - return RocketChat.roomTypes.getRoomName(roomData.t, roomData); + return roomTypes.getRoomName(roomData.t, roomData); }, secondaryName() { const roomData = Session.get(`roomData${ this._id }`); if (!roomData) { return ''; } - return RocketChat.roomTypes.getSecondaryRoomName(roomData.t, roomData); + return roomTypes.getSecondaryRoomName(roomData.t, roomData); }, roomTopic() { @@ -62,7 +65,7 @@ Template.header.helpers({ }, channelIcon() { - const roomType = RocketChat.models.Rooms.findOne(this._id).t; + const roomType = Rooms.findOne(this._id).t; switch (roomType) { case 'd': return 'at'; @@ -73,7 +76,7 @@ Template.header.helpers({ case 'l': return 'livechat'; default: - return RocketChat.roomTypes.getIcon(roomType); + return roomTypes.getIcon(roomType); } }, @@ -81,7 +84,7 @@ Template.header.helpers({ const roomData = Session.get(`roomData${ this._id }`); if (!(roomData != null ? roomData.t : undefined)) { return ''; } - return RocketChat.roomTypes.getIcon(roomData != null ? roomData.t : undefined); + return roomTypes.getIcon(roomData != null ? roomData.t : undefined); }, encryptedChannel() { @@ -91,7 +94,7 @@ Template.header.helpers({ userStatus() { const roomData = Session.get(`roomData${ this._id }`); - return RocketChat.roomTypes.getUserStatus(roomData.t, this._id) || t('offline'); + return roomTypes.getUserStatus(roomData.t, this._id) || t('offline'); }, showToggleFavorite() { @@ -146,5 +149,5 @@ Template.header.events({ }); Template.header.onCreated(function() { - this.currentChannel = (this.data && this.data._id && RocketChat.models.Rooms.findOne(this.data._id)) || undefined; + this.currentChannel = (this.data && this.data._id && Rooms.findOne(this.data._id)) || undefined; }); diff --git a/packages/rocketchat-ui/client/components/popupList.js b/packages/rocketchat-ui/client/components/popupList.js index 4fa3a349b56..eefbe85cd57 100644 --- a/packages/rocketchat-ui/client/components/popupList.js +++ b/packages/rocketchat-ui/client/components/popupList.js @@ -1,4 +1,5 @@ import { Template } from 'meteor/templating'; +import { settings } from 'meteor/rocketchat:settings'; Template.popupList.helpers({ config() { @@ -34,6 +35,6 @@ Template.popupList_default.helpers({ Template.popupList_item_default.helpers({ showRealNames() { - return RocketChat.settings.get('UI_Use_Real_Name'); + return settings.get('UI_Use_Real_Name'); }, }); diff --git a/packages/rocketchat-ui/client/index.js b/packages/rocketchat-ui/client/index.js new file mode 100644 index 00000000000..0ad4e65c1a3 --- /dev/null +++ b/packages/rocketchat-ui/client/index.js @@ -0,0 +1 @@ +export { Button, Login, animationSupport, animeBack, preLoadImgs } from './lib/rocket'; diff --git a/packages/rocketchat-ui/client/lib/chatMessages.js b/packages/rocketchat-ui/client/lib/chatMessages.js index c46d8ca0538..94d53e42741 100644 --- a/packages/rocketchat-ui/client/lib/chatMessages.js +++ b/packages/rocketchat-ui/client/lib/chatMessages.js @@ -5,7 +5,14 @@ import { Tracker } from 'meteor/tracker'; import { FlowRouter } from 'meteor/kadira:flow-router'; import { Session } from 'meteor/session'; import { TAPi18n } from 'meteor/tap:i18n'; -import { t } from 'meteor/rocketchat:utils'; +import { t, getUserPreference, slashCommands, handleError } from 'meteor/rocketchat:utils'; +import { MessageAction, messageProperties, MessageTypes, readMessage, modal } from 'meteor/rocketchat:ui-utils'; +import { settings } from 'meteor/rocketchat:settings'; +import { callbacks } from 'meteor/rocketchat:callbacks'; +import { promises } from 'meteor/rocketchat:promises'; +import { hasAtLeastOnePermission } from 'meteor/rocketchat:authorization'; +import { Messages, Rooms, ChatMessage } from 'meteor/rocketchat:models'; +import { emoji } from 'meteor/rocketchat:emoji'; import _ from 'underscore'; import s from 'underscore.string'; import moment from 'moment'; @@ -16,7 +23,7 @@ let sendOnEnter = ''; Meteor.startup(() => { Tracker.autorun(function() { const user = Meteor.userId(); - sendOnEnter = RocketChat.getUserPreference(user, 'sendOnEnter'); + sendOnEnter = getUserPreference(user, 'sendOnEnter'); }); }); @@ -32,7 +39,7 @@ ChatMessages = class ChatMessages { init(node) { this.editing = {}; this.records = {}; - this.messageMaxSize = RocketChat.settings.get('Message_MaxAllowedSize'); + this.messageMaxSize = settings.get('Message_MaxAllowedSize'); this.wrapper = $(node).find('.wrapper'); this.input = this.input || $(node).find('.js-input-message').get(0); this.$input = $(this.input); @@ -120,14 +127,14 @@ ChatMessages = class ChatMessages { const message = this.getMessageById(element.getAttribute('id')); - const hasPermission = RocketChat.authz.hasAtLeastOnePermission('edit-message', message.rid); - const editAllowed = RocketChat.settings.get('Message_AllowEditing'); + const hasPermission = hasAtLeastOnePermission('edit-message', message.rid); + const editAllowed = settings.get('Message_AllowEditing'); const editOwn = message && message.u && message.u._id === Meteor.userId(); if (!hasPermission && (!editAllowed || !editOwn)) { return; } if (element.classList.contains('system')) { return; } - const blockEditInMinutes = RocketChat.settings.get('Message_AllowEditing_BlockEditInMinutes'); + const blockEditInMinutes = settings.get('Message_AllowEditing_BlockEditInMinutes'); if (blockEditInMinutes && blockEditInMinutes !== 0) { let currentTsDiff; let msgTs; @@ -211,8 +218,8 @@ ChatMessages = class ChatMessages { const mentionUser = $(input).data('mention-user') || false; if (reply !== undefined) { - msg = `[ ](${ await RocketChat.MessageAction.getPermaLink(reply._id) }) `; - const roomInfo = RocketChat.models.Rooms.findOne(reply.rid, { fields: { t: 1 } }); + msg = `[ ](${ await MessageAction.getPermaLink(reply._id) }) `; + const roomInfo = Rooms.findOne(reply.rid, { fields: { t: 1 } }); if (roomInfo.t !== 'd' && reply.u.username !== Meteor.user().username && mentionUser) { msg += `@${ reply.u.username } `; } @@ -225,7 +232,7 @@ ChatMessages = class ChatMessages { if (msg.slice(0, 2) === '+:') { const reaction = msg.slice(1).trim(); - if (RocketChat.emoji.list[reaction]) { + if (emoji.list[reaction]) { const lastMessage = ChatMessage.findOne({ rid }, { fields: { ts: 1 }, sort: { ts: -1 } }); Meteor.call('setReaction', reaction, lastMessage._id); input.value = ''; @@ -235,7 +242,7 @@ ChatMessages = class ChatMessages { } // Run to allow local encryption, and maybe other client specific actions to be run before send - const msgObject = await RocketChat.promises.run('onClientBeforeSendMessage', { _id: Random.id(), rid, msg }); + const msgObject = await promises.run('onClientBeforeSendMessage', { _id: Random.id(), rid, msg }); // checks for the final msgObject.msg size before actually sending the message if (this.isMessageTooLong(msgObject.msg)) { @@ -290,12 +297,12 @@ ChatMessages = class ChatMessages { const match = msgObject.msg.match(/^\/([^\s]+)(?:\s+(.*))?$/m); if (match) { let command; - if (RocketChat.slashCommands.commands[match[1]]) { - const commandOptions = RocketChat.slashCommands.commands[match[1]]; + if (slashCommands.commands[match[1]]) { + const commandOptions = slashCommands.commands[match[1]]; command = match[1]; const param = match[2] || ''; - if (!commandOptions.permission || RocketChat.authz.hasAtLeastOnePermission(commandOptions.permission, Session.get('openedRoom'))) { + if (!commandOptions.permission || hasAtLeastOnePermission(commandOptions.permission, Session.get('openedRoom'))) { if (commandOptions.clientOnly) { commandOptions.callback(command, param, msgObject); } else { @@ -306,14 +313,14 @@ ChatMessages = class ChatMessages { } } - if (!RocketChat.settings.get('Message_AllowUnrecognizedSlashCommand')) { + if (!settings.get('Message_AllowUnrecognizedSlashCommand')) { const invalidCommandMsg = { _id: Random.id(), rid: msgObject.rid, ts: new Date, msg: TAPi18n.__('No_such_command', { command: match[1] }), u: { - username: RocketChat.settings.get('InternalHubot_Username'), + username: settings.get('InternalHubot_Username'), }, private: true, }; @@ -328,7 +335,7 @@ ChatMessages = class ChatMessages { } confirmDeleteMsg(message, done = function() {}) { - if (RocketChat.MessageTypes.isSystemMessage(message)) { return; } + if (MessageTypes.isSystemMessage(message)) { return; } modal.open({ title: t('Are_you_sure'), text: t('You_will_not_be_able_to_recover'), @@ -358,8 +365,8 @@ ChatMessages = class ChatMessages { } deleteMsg(message) { - const forceDelete = RocketChat.authz.hasAtLeastOnePermission('force-delete-message', message.rid); - const blockDeleteInMinutes = RocketChat.settings.get('Message_AllowDeleting_BlockDeleteInMinutes'); + const forceDelete = hasAtLeastOnePermission('force-delete-message', message.rid); + const blockDeleteInMinutes = settings.get('Message_AllowDeleting_BlockDeleteInMinutes'); if (blockDeleteInMinutes && forceDelete === false) { let msgTs; if (message.ts != null) { msgTs = moment(message.ts); } @@ -460,7 +467,7 @@ ChatMessages = class ChatMessages { if (!msgId) { return; } - const message = RocketChat.models.Messages.findOne(msgId); + const message = Messages.findOne(msgId); if (message) { return this.$input.data('reply', message).trigger('dataChange'); } @@ -594,8 +601,8 @@ ChatMessages = class ChatMessages { } isMessageTooLong(message) { - const adjustedMessage = RocketChat.messageProperties.messageWithoutEmojiShortnames(message); - return RocketChat.messageProperties.length(adjustedMessage) > this.messageMaxSize && message; + const adjustedMessage = messageProperties.messageWithoutEmojiShortnames(message); + return messageProperties.length(adjustedMessage) > this.messageMaxSize && message; } isEmpty() { @@ -604,10 +611,10 @@ ChatMessages = class ChatMessages { }; -RocketChat.callbacks.add('afterLogoutCleanUp', () => { +callbacks.add('afterLogoutCleanUp', () => { Object.keys(localStorage).forEach((item) => { if (item.indexOf('messagebox_') === 0) { localStorage.removeItem(item); } }); -}, RocketChat.callbacks.priority.MEDIUM, 'chatMessages-after-logout-cleanup'); +}, callbacks.priority.MEDIUM, 'chatMessages-after-logout-cleanup'); diff --git a/packages/rocketchat-ui/client/lib/collections.js b/packages/rocketchat-ui/client/lib/collections.js index 4db4b857d13..d6313d1ae67 100644 --- a/packages/rocketchat-ui/client/lib/collections.js +++ b/packages/rocketchat-ui/client/lib/collections.js @@ -1,5 +1,6 @@ import { Meteor } from 'meteor/meteor'; import { Tracker } from 'meteor/tracker'; +import { settings } from 'meteor/rocketchat:settings'; import { ChatMessage as chatMessage, CachedChatRoom as cachedChatRoom, @@ -27,7 +28,7 @@ this.CachedUserList = cachedUserList; Meteor.startup(() => { Tracker.autorun(() => { - if (!Meteor.userId() && RocketChat.settings.get('Accounts_AllowAnonymousRead') === true) { + if (!Meteor.userId() && settings.get('Accounts_AllowAnonymousRead') === true) { CachedChatRoom.init(); CachedChatSubscription.ready.set(true); } diff --git a/packages/rocketchat-ui/client/lib/cordova/push.js b/packages/rocketchat-ui/client/lib/cordova/push.js index dbb098ab7bf..813253be08f 100644 --- a/packages/rocketchat-ui/client/lib/cordova/push.js +++ b/packages/rocketchat-ui/client/lib/cordova/push.js @@ -2,6 +2,7 @@ import { Meteor } from 'meteor/meteor'; import { Tracker } from 'meteor/tracker'; import { FlowRouter } from 'meteor/kadira:flow-router'; import { Push } from 'meteor/rocketchat:push'; +import { settings } from 'meteor/rocketchat:settings'; if (Meteor.isCordova) { // Push.addListener 'token', (token) -> @@ -72,7 +73,7 @@ if (Meteor.isCordova) { Meteor.startup(() => Tracker.autorun(() => { - if (RocketChat.settings.get('Push_enable') === true) { + if (settings.get('Push_enable') === true) { Push.Configure({ android: { diff --git a/packages/rocketchat-ui/client/lib/cordova/user-state.js b/packages/rocketchat-ui/client/lib/cordova/user-state.js index a7dd9d0892f..a32910f294f 100644 --- a/packages/rocketchat-ui/client/lib/cordova/user-state.js +++ b/packages/rocketchat-ui/client/lib/cordova/user-state.js @@ -1,5 +1,6 @@ import { Meteor } from 'meteor/meteor'; import { UserPresence } from 'meteor/konecty:user-presence'; +import { readMessage } from 'meteor/rocketchat:ui-utils'; import _ from 'underscore'; let timer = undefined; diff --git a/packages/rocketchat-ui/client/lib/esc.js b/packages/rocketchat-ui/client/lib/esc.js index 4a4450ee5bf..d93b2cbf78f 100644 --- a/packages/rocketchat-ui/client/lib/esc.js +++ b/packages/rocketchat-ui/client/lib/esc.js @@ -1,3 +1,6 @@ +import { SideNav } from 'meteor/rocketchat:ui-utils'; +import { VideoRecorder } from './recorderjs/videoRecorder'; + const escapify = { init() { const that = this; @@ -6,7 +9,7 @@ const escapify = { if (keyName === 'Escape') { that.sideNavIcon(); that.flextTabButton(); - that.videoDialog(); + that.videoDialog().then(); that.sweetAlerts(); } }, false); @@ -36,7 +39,8 @@ const escapify = { } }, - videoDialog() { + async videoDialog() { + const { VRecDialog } = await import('meteor/rocketchat:ui-vrecord'); const vrecDialog = document.querySelector('.vrec-dialog'); if (vrecDialog && Number(window.getComputedStyle(vrecDialog).opacity) === 1) { VideoRecorder.stop(); diff --git a/packages/rocketchat-ui/client/lib/fileUpload.js b/packages/rocketchat-ui/client/lib/fileUpload.js index d3a30e794a1..13cd1372423 100644 --- a/packages/rocketchat-ui/client/lib/fileUpload.js +++ b/packages/rocketchat-ui/client/lib/fileUpload.js @@ -4,7 +4,8 @@ import { Session } from 'meteor/session'; import s from 'underscore.string'; import { fileUploadHandler } from 'meteor/rocketchat:file-upload'; import { Handlebars } from 'meteor/ui'; -import { t } from 'meteor/rocketchat:utils'; +import { t, fileUploadIsValidContentType } from 'meteor/rocketchat:utils'; +import { modal } from 'meteor/rocketchat:ui-utils'; const readAsDataURL = (file, callback) => { const reader = new FileReader(); @@ -135,7 +136,7 @@ const getUploadPreview = async(file, preview) => { return getGenericUploadPreview(file, preview); }; -fileUpload = async(files) => { //eslint-disable-line +fileUpload = async(files) => { files = [].concat(files); const roomId = Session.get('openedRoom'); @@ -147,7 +148,7 @@ fileUpload = async(files) => { //eslint-disable-line return; } - if (!RocketChat.fileUploadIsValidContentType(file.file.type)) { + if (!fileUploadIsValidContentType(file.file.type)) { modal.open({ title: t('FileUpload_MediaType_NotAccepted'), text: file.file.type || `*.${ s.strRightBack(file.file.name, '.') }`, diff --git a/packages/rocketchat-ui/client/lib/iframeCommands.js b/packages/rocketchat-ui/client/lib/iframeCommands.js index 01c06886e5f..56c49f0495d 100644 --- a/packages/rocketchat-ui/client/lib/iframeCommands.js +++ b/packages/rocketchat-ui/client/lib/iframeCommands.js @@ -2,6 +2,9 @@ import { Meteor } from 'meteor/meteor'; import { FlowRouter } from 'meteor/kadira:flow-router'; import { Session } from 'meteor/session'; import { ServiceConfiguration } from 'meteor/service-configuration'; +import { AccountBox } from 'meteor/rocketchat:ui-utils'; +import { settings } from 'meteor/rocketchat:settings'; +import { callbacks } from 'meteor/rocketchat:callbacks'; import s from 'underscore.string'; const commands = { @@ -52,7 +55,7 @@ const commands = { 'logout'() { const user = Meteor.user(); Meteor.logout(() => { - RocketChat.callbacks.run('afterLogoutCleanUp', user); + callbacks.run('afterLogoutCleanUp', user); Meteor.call('logoutCleanUp', user); return FlowRouter.go('home'); }); @@ -72,7 +75,7 @@ const commands = { }; window.addEventListener('message', (e) => { - if (RocketChat.settings.get('Iframe_Integration_receive_enable') !== true) { + if (settings.get('Iframe_Integration_receive_enable') !== true) { return; } @@ -80,7 +83,7 @@ window.addEventListener('message', (e) => { return; } - const origins = RocketChat.settings.get('Iframe_Integration_receive_origin'); + const origins = settings.get('Iframe_Integration_receive_origin'); if (origins !== '*' && origins.split(',').indexOf(e.origin) === -1) { return console.error('Origin not allowed', e.origin); diff --git a/packages/rocketchat-ui/client/lib/menu.js b/packages/rocketchat-ui/client/lib/menu.js index dd3899a7ef8..8217a5c80f8 100644 --- a/packages/rocketchat-ui/client/lib/menu.js +++ b/packages/rocketchat-ui/client/lib/menu.js @@ -1,20 +1,23 @@ import _ from 'underscore'; import { menu as _menu } from 'meteor/rocketchat:ui-utils'; +import EventEmitter from 'wolfy87-eventemitter'; + +const emitter = new EventEmitter(); window.addEventListener('resize', _.debounce((() => { let lastState = window.matchMedia('(min-width: 780px)').matches ? 'mini' : 'large'; - RocketChat.emit('grid', lastState); + emitter.emit('grid', lastState); return () => { const futureState = window.matchMedia('(min-width: 780px)').matches ? 'mini' : 'large'; if (lastState !== futureState) { lastState = futureState; - RocketChat.emit('grid', lastState); + emitter.emit('grid', lastState); } }; })(), 100)); this.menu = _menu; -RocketChat.on('grid', () => { - this.menu.close(); +emitter.on('grid', () => { + _menu.close(); }); diff --git a/packages/rocketchat-ui/client/lib/modal.js b/packages/rocketchat-ui/client/lib/modal.js deleted file mode 100644 index f09195e9b0e..00000000000 --- a/packages/rocketchat-ui/client/lib/modal.js +++ /dev/null @@ -1,110 +0,0 @@ -import { Blaze } from 'meteor/blaze'; - -this.Modal = (function() { - - const self = {}; - const win = $(window); - - // mistérios da vida c.483: Pq a self.$window diz ter 100% da janela via css mas na verdade ocupa menos de 100% da tela? - // isso impede que o retorno da janela ao normal quando não mais necessária a classe fluid. (comportamento dançante) - - function focus() { - if (self.$modal) { - const input = self.$modal.find('input[type=\'text\']'); - if (input.length) { return input.get(0).focus(); } - } - } - function check() { - if (self.$modal && self.$modal.length) { - if (win.height() < (self.$window.outerHeight() + (win.height() * 0.10))) { - if (!self.$modal.hasClass('fluid')) { - return self.$modal.addClass('fluid'); - } - } - } - } - function stopListening() { - if (self.interval) { return clearInterval(self.interval); } - } - function startListening() { - stopListening(); - return self.interval = setInterval(() => check(), 100); - } - - - function close() { - self.$modal.addClass('closed'); - win.unbind('keydown.modal'); - // acionar no on-complete da animação - return setTimeout(function() { - self.opened = 0; - stopListening(); - return self.$modal.removeClass('opened closed'); - }, 300); - } - function keydown(e) { - const k = e.which; - if (k === 27) { - e.preventDefault(); - e.stopImmediatePropagation(); - return close(); - } - } - function checkFooter() { - if (self.$footer && self.$footer.length) { - const buttons = self.$footer.find('button'); - return buttons.each(function() { - const btn = $(this); - if (btn.html().match(/fechar/ig)) { - return btn.click(function(e) { - e.preventDefault(); - return close(); - }); - } - }); - } - } - - function setContent(template, data) { - self.$main.empty(); - if (template) { - if (data) { - Blaze.renderWithData(template, data, self.$main.get(0)); - } else { - Blaze.render(template, self.$main.get(0)); - } - checkFooter(); - return check(); - } - } - - function open(template, params) { - params = params || {}; - RocketChat.animeBack(self.$modal, () => focus()); - self.opened = 1; - if (params.listening) { startListening(); } - if (template != null) { setContent(template, params.data); } - self.$modal.addClass('opened'); - self.$modal.removeClass('fluid'); - return setTimeout(() => focus(), 200); - } - - function init($modal, params) { - self.params = params || {}; - self.opened = 0; - self.initialized = 0; - self.$modal = $modal.length ? $modal : $('.rocket-modal'); - if (self.$modal.length) { - self.initialized = 0; - self.$window = self.$modal.find('.modal'); - self.$main = self.$modal.find('main'); - self.$close = self.$modal.find('header > .close'); - self.$footer = self.$modal.find('footer'); - self.$close.unbind('click').click(close); - win.unbind('resize.modal').bind('resize.modal', check); - return win.unbind('keydown.modal').bind('keydown.modal', (e) => keydown(e)); - } - } - - return { init, open, close, focus, setContent }; -}()); diff --git a/packages/rocketchat-ui/client/lib/msgTyping.js b/packages/rocketchat-ui/client/lib/msgTyping.js index 85dede240bc..a79e0b8a7d8 100644 --- a/packages/rocketchat-ui/client/lib/msgTyping.js +++ b/packages/rocketchat-ui/client/lib/msgTyping.js @@ -2,6 +2,8 @@ import { Meteor } from 'meteor/meteor'; import { Tracker } from 'meteor/tracker'; import { ReactiveVar } from 'meteor/reactive-var'; import { Session } from 'meteor/session'; +import { settings } from 'meteor/rocketchat:settings'; +import { Notifications } from 'meteor/rocketchat:notifications'; import _ from 'underscore'; export const MsgTyping = (function() { @@ -17,7 +19,7 @@ export const MsgTyping = (function() { if (!user) { return; } - if (RocketChat.settings.get('UI_Use_Real_Name')) { + if (settings.get('UI_Use_Real_Name')) { return user.name; } return user.username; @@ -28,7 +30,7 @@ export const MsgTyping = (function() { return; } usersTyping[room] = { users: {} }; - return RocketChat.Notifications.onRoom(room, 'typing', function(username, typing) { + return Notifications.onRoom(room, 'typing', function(username, typing) { const user = Meteor.users.findOne(Meteor.userId(), { fields: { name: 1, username: 1 } }); if (username === shownName(user)) { return; @@ -57,7 +59,7 @@ export const MsgTyping = (function() { timeouts[room] = null; } const user = Meteor.user(); - return RocketChat.Notifications.notifyRoom(room, 'typing', shownName(user), false); + return Notifications.notifyRoom(room, 'typing', shownName(user), false); }; const start = function(room) { if (!renew) { return; } @@ -67,7 +69,7 @@ export const MsgTyping = (function() { renew = false; selfTyping.set(true); const user = Meteor.user(); - RocketChat.Notifications.notifyRoom(room, 'typing', shownName(user), true); + Notifications.notifyRoom(room, 'typing', shownName(user), true); clearTimeout(timeouts[room]); return timeouts[room] = Meteor.setTimeout(() => stop(room), timeout); }; diff --git a/packages/rocketchat-ui/client/lib/notification.js b/packages/rocketchat-ui/client/lib/notification.js index c8e43ef2087..6a2428fdc6e 100644 --- a/packages/rocketchat-ui/client/lib/notification.js +++ b/packages/rocketchat-ui/client/lib/notification.js @@ -8,6 +8,10 @@ import { Session } from 'meteor/session'; import _ from 'underscore'; import s from 'underscore.string'; import { e2e } from 'meteor/rocketchat:e2e'; +import { Users, ChatSubscription } from 'meteor/rocketchat:models'; +import { getUserPreference } from 'meteor/rocketchat:utils'; +import { getAvatarUrlFromUsername } from 'meteor/rocketchat:ui-utils'; +import { promises } from 'meteor/rocketchat:promises'; import { getAvatarAsPng } from './avatar'; KonchatNotification = { @@ -28,7 +32,7 @@ KonchatNotification = { notify(notification) { if (window.Notification && Notification.permission === 'granted') { const message = { rid: (notification.payload != null ? notification.payload.rid : undefined), msg: notification.text, notification: true }; - return RocketChat.promises.run('onClientMessageReceived', message).then(function(message) { + return promises.run('onClientMessageReceived', message).then(function(message) { const n = new Notification(notification.title, { icon: notification.icon || getAvatarUrlFromUsername(notification.payload.sender.username), body: s.stripTags(message.msg), @@ -37,7 +41,7 @@ KonchatNotification = { canReply: true, }); - const notificationDuration = notification.duration - 0 || RocketChat.getUserPreference(Meteor.userId(), 'desktopNotificationDuration') - 0; + const notificationDuration = notification.duration - 0 || getUserPreference(Meteor.userId(), 'desktopNotificationDuration') - 0; if (notificationDuration > 0) { setTimeout((() => n.close()), notificationDuration * 1000); } @@ -95,8 +99,8 @@ KonchatNotification = { newMessage(rid) { if (!Session.equals(`user_${ Meteor.user().username }_status`, 'busy')) { const userId = Meteor.userId(); - const newMessageNotification = RocketChat.getUserPreference(userId, 'newMessageNotification'); - const audioVolume = RocketChat.getUserPreference(userId, 'notificationsSoundVolume'); + const newMessageNotification = getUserPreference(userId, 'newMessageNotification'); + const audioVolume = getUserPreference(userId, 'notificationsSoundVolume'); const sub = ChatSubscription.findOne({ rid }, { fields: { audioNotificationValue: 1 } }); @@ -144,14 +148,14 @@ KonchatNotification = { Meteor.startup(() => { Tracker.autorun(function() { - const user = RocketChat.models.Users.findOne(Meteor.userId(), { + const user = Users.findOne(Meteor.userId(), { fields: { 'settings.preferences.newRoomNotification': 1, 'settings.preferences.notificationsSoundVolume': 1, }, }); - const newRoomNotification = RocketChat.getUserPreference(user, 'newRoomNotification'); - const audioVolume = RocketChat.getUserPreference(user, 'notificationsSoundVolume'); + const newRoomNotification = getUserPreference(user, 'newRoomNotification'); + const audioVolume = getUserPreference(user, 'notificationsSoundVolume'); if ((Session.get('newRoomSound') || []).length > 0) { Meteor.defer(function() { diff --git a/packages/rocketchat-ui/client/lib/recorderjs/recorder.js b/packages/rocketchat-ui/client/lib/recorderjs/recorder.js index 1dee04ea274..83e8d6b0231 100644 --- a/packages/rocketchat-ui/client/lib/recorderjs/recorder.js +++ b/packages/rocketchat-ui/client/lib/recorderjs/recorder.js @@ -1,3 +1,5 @@ +import { settings } from 'meteor/rocketchat:settings'; + (function(window){ var WORKER_PATH = 'mp3-realtime-worker.js'; @@ -6,7 +8,7 @@ var config = cfg || {}; var bufferLen = config.bufferLen || 4096; var numChannels = config.numChannels || 1; - var bitRate = RocketChat.settings.get('Message_Audio_bitRate'); + var bitRate = settings.get('Message_Audio_bitRate'); this.context = source.context; this.node = (this.context.createScriptProcessor || this.context.createJavaScriptNode).call(this.context, diff --git a/packages/rocketchat-ui/client/lib/rocket.js b/packages/rocketchat-ui/client/lib/rocket.js index 87e2679835b..80ce4b8ab66 100644 --- a/packages/rocketchat-ui/client/lib/rocket.js +++ b/packages/rocketchat-ui/client/lib/rocket.js @@ -1,4 +1,4 @@ -RocketChat.Login = (function() { +export const Login = (function() { function onClick(el) { const $el = $(el); if ($el.length) { @@ -29,7 +29,7 @@ RocketChat.Login = (function() { return { check, onClick, onBlur }; }()); -RocketChat.Button = (function() { +export const Button = (function() { let time = undefined; const loading = function(el) { const next = el.attr('data-loading-text'); @@ -50,7 +50,7 @@ RocketChat.Button = (function() { return { done, loading, reset }; }()); -RocketChat.animationSupport = function() { +export const animationSupport = function() { const animeEnd = { WebkitAnimation: 'webkitAnimationEnd', OAnimation: 'oAnimationEnd', @@ -65,9 +65,9 @@ RocketChat.animationSupport = function() { msTransition: 'MSTransitionEnd', transition: 'transitionend', }; - const prefixB = transEndEventNames[Modernizr.prefixed('transition')]; - const prefixA = animeEnd[Modernizr.prefixed('animation')]; - const support = Modernizr.cssanimations; + const prefixB = transEndEventNames[window.Modernizr.prefixed('transition')]; + const prefixA = animeEnd[window.Modernizr.prefixed('animation')]; + const support = window.Modernizr.cssanimations; return { support, animation: prefixA, @@ -75,13 +75,13 @@ RocketChat.animationSupport = function() { }; }; -RocketChat.animeBack = function(e, callback, type) { +export const animeBack = function(e, callback, type) { const el = $(e); if (!el.length > 0) { if (callback) { callback(el); } return; } - const s = RocketChat.animationSupport(); + const s = animationSupport(); const p = ((type ? s.animation : s.transition)); el.one(p, function(e) { @@ -91,7 +91,7 @@ RocketChat.animeBack = function(e, callback, type) { }; -RocketChat.preLoadImgs = function(urls, callback) { +export const preLoadImgs = function(urls, callback) { const preLoader = $('
').attr({ id: 'perverter-preloader' }); let ended = undefined; const l_ = function(x) { diff --git a/packages/rocketchat-ui/client/views/app/burger.js b/packages/rocketchat-ui/client/views/app/burger.js index a3c61d48052..6c461529e0a 100644 --- a/packages/rocketchat-ui/client/views/app/burger.js +++ b/packages/rocketchat-ui/client/views/app/burger.js @@ -1,5 +1,6 @@ import { Session } from 'meteor/session'; import { Template } from 'meteor/templating'; +import { Layout } from 'meteor/rocketchat:ui-utils'; Template.burger.helpers({ unread() { @@ -11,6 +12,6 @@ Template.burger.helpers({ } }, embeddedVersion() { - return RocketChat.Layout.isEmbedded(); + return Layout.isEmbedded(); }, }); diff --git a/packages/rocketchat-ui/client/views/app/createChannel.js b/packages/rocketchat-ui/client/views/app/createChannel.js index 6a89273aabb..6b84080ce5f 100644 --- a/packages/rocketchat-ui/client/views/app/createChannel.js +++ b/packages/rocketchat-ui/client/views/app/createChannel.js @@ -5,7 +5,10 @@ import { Blaze } from 'meteor/blaze'; import { FlowRouter } from 'meteor/kadira:flow-router'; import { Template } from 'meteor/templating'; import { AutoComplete } from 'meteor/mizzao:autocomplete'; -import { t } from 'meteor/rocketchat:utils'; +import { settings } from 'meteor/rocketchat:settings'; +import { callbacks } from 'meteor/rocketchat:callbacks'; +import { t, roomTypes } from 'meteor/rocketchat:utils'; +import { hasAllPermission } from 'meteor/rocketchat:authorization'; import _ from 'underscore'; const acEvents = { @@ -34,20 +37,20 @@ const acEvents = { }; const validateChannelName = (name) => { - if (RocketChat.settings.get('UI_Allow_room_names_with_special_chars')) { + if (settings.get('UI_Allow_room_names_with_special_chars')) { return true; } - const reg = new RegExp(`^${ RocketChat.settings.get('UTF8_Names_Validation') }$`); + const reg = new RegExp(`^${ settings.get('UTF8_Names_Validation') }$`); return name.length === 0 || reg.test(name); }; const filterNames = (old) => { - if (RocketChat.settings.get('UI_Allow_room_names_with_special_chars')) { + if (settings.get('UI_Allow_room_names_with_special_chars')) { return old; } - const reg = new RegExp(`^${ RocketChat.settings.get('UTF8_Names_Validation') }$`); + const reg = new RegExp(`^${ settings.get('UTF8_Names_Validation') }$`); return [...old.replace(' ', '').toLocaleLowerCase()].filter((f) => reg.test(f)).join(''); }; @@ -101,7 +104,7 @@ Template.createChannel.helpers({ return Template.instance().type.get() !== 'p' || Template.instance().broadcast.get(); }, e2eEnabled() { - return RocketChat.settings.get('E2E_Enable'); + return settings.get('E2E_Enable'); }, readOnly() { return Template.instance().readOnly.get(); @@ -110,7 +113,7 @@ Template.createChannel.helpers({ return t(Template.instance().readOnly.get() ? t('Only_authorized_users_can_write_new_messages') : t('All_users_in_the_channel_can_write_new_messages')); }, cantCreateBothTypes() { - return !RocketChat.authz.hasAllPermission(['create-c', 'create-p']); + return !hasAllPermission(['create-c', 'create-p']); }, roomTypeIsP() { return Template.instance().type.get() === 'p'; @@ -131,7 +134,7 @@ Template.createChannel.helpers({ return Template.instance().type.get() === 'p' ? 'lock' : 'hashtag'; }, tokenAccessEnabled() { - return RocketChat.settings.get('API_Tokenpass_URL') !== ''; + return settings.get('API_Tokenpass_URL') !== ''; }, tokenIsDisabled() { return Template.instance().type.get() !== 'p' ? 'disabled' : null; @@ -148,19 +151,19 @@ Template.createChannel.helpers({ }; }, roomTypesBeforeStandard() { - const orderLow = RocketChat.roomTypes.roomTypesOrder.filter((roomTypeOrder) => roomTypeOrder.identifier === 'c')[0].order; - return RocketChat.roomTypes.roomTypesOrder.filter( + const orderLow = roomTypes.roomTypesOrder.filter((roomTypeOrder) => roomTypeOrder.identifier === 'c')[0].order; + return roomTypes.roomTypesOrder.filter( (roomTypeOrder) => roomTypeOrder.order < orderLow ).map( - (roomTypeOrder) => RocketChat.roomTypes.roomTypes[roomTypeOrder.identifier] + (roomTypeOrder) => roomTypes.roomTypes[roomTypeOrder.identifier] ).filter((roomType) => roomType.creationTemplate); }, roomTypesAfterStandard() { - const orderHigh = RocketChat.roomTypes.roomTypesOrder.filter((roomTypeOrder) => roomTypeOrder.identifier === 'd')[0].order; - return RocketChat.roomTypes.roomTypesOrder.filter( + const orderHigh = roomTypes.roomTypesOrder.filter((roomTypeOrder) => roomTypeOrder.identifier === 'd')[0].order; + return roomTypes.roomTypesOrder.filter( (roomTypeOrder) => roomTypeOrder.order > orderHigh ).map( - (roomTypeOrder) => RocketChat.roomTypes.roomTypes[roomTypeOrder.identifier] + (roomTypeOrder) => roomTypes.roomTypes[roomTypeOrder.identifier] ).filter((roomType) => roomType.creationTemplate); }, }); @@ -247,7 +250,7 @@ Template.createChannel.events({ } if (!isPrivate) { - RocketChat.callbacks.run('aftercreateCombined', { _id: result.rid, name: result.name }); + callbacks.run('aftercreateCombined', { _id: result.rid, name: result.name }); } return FlowRouter.go(isPrivate ? 'group' : 'channel', { name: result.name }, FlowRouter.current().queryParams); @@ -280,7 +283,7 @@ Template.createChannel.onCreated(function() { this.extensions_validations = {}; this.extensions_submits = {}; this.name = new ReactiveVar(''); - this.type = new ReactiveVar(RocketChat.authz.hasAllPermission(['create-p']) ? 'p' : 'c'); + this.type = new ReactiveVar(hasAllPermission(['create-p']) ? 'p' : 'c'); this.readOnly = new ReactiveVar(false); this.broadcast = new ReactiveVar(false); this.encrypted = new ReactiveVar(false); @@ -355,7 +358,7 @@ Template.createChannel.onCreated(function() { Template.tokenpass.onCreated(function() { this.data.validations.tokenpass = (instance) => { - const result = (RocketChat.settings.get('API_Tokenpass_URL') !== '' && instance.tokensRequired.get() && instance.type.get() === 'p') && this.selectedTokens.get().length === 0; + const result = (settings.get('API_Tokenpass_URL') !== '' && instance.tokensRequired.get() && instance.type.get() === 'p') && this.selectedTokens.get().length === 0; this.invalid.set(result); return !result; }; diff --git a/packages/rocketchat-ui/client/views/app/directory.js b/packages/rocketchat-ui/client/views/app/directory.js index 7391748a317..7cb91a5b3f4 100644 --- a/packages/rocketchat-ui/client/views/app/directory.js +++ b/packages/rocketchat-ui/client/views/app/directory.js @@ -4,7 +4,9 @@ import { Tracker } from 'meteor/tracker'; import { Template } from 'meteor/templating'; import _ from 'underscore'; import { timeAgo } from './helpers'; -import { t } from 'meteor/rocketchat:utils'; +import { t, roomTypes } from 'meteor/rocketchat:utils'; +import { settings } from 'meteor/rocketchat:settings'; +import { hasAtLeastOnePermission } from 'meteor/rocketchat:authorization'; function directorySearch(config, cb) { return Meteor.call('browseChannels', config, (err, result) => { @@ -38,7 +40,7 @@ Template.directory.helpers({ return Template.instance().searchText.get(); }, showLastMessage() { - return RocketChat.settings.get('Store_Last_Message'); + return settings.get('Store_Last_Message'); }, searchResults() { return Template.instance().results.get(); @@ -57,7 +59,7 @@ Template.directory.helpers({ return Template.instance().searchSortBy.get() === key; }, createChannelOrGroup() { - return RocketChat.authz.hasAtLeastOnePermission(['create-c', 'create-p']); + return hasAtLeastOnePermission(['create-c', 'create-p']); }, tabsData() { const { @@ -116,7 +118,7 @@ Template.directory.helpers({ type = 'd'; routeConfig = { name: item.username }; } - RocketChat.roomTypes.openRouteLink(type, routeConfig); + roomTypes.openRouteLink(type, routeConfig); }; }, isLoading() { @@ -203,7 +205,7 @@ Template.directory.onRendered(function() { }); Template.directory.onCreated(function() { - const viewType = RocketChat.settings.get('Accounts_Directory_DefaultView') || 'channels'; + const viewType = settings.get('Accounts_Directory_DefaultView') || 'channels'; this.searchType = new ReactiveVar(viewType); if (viewType === 'channels') { this.searchSortBy = new ReactiveVar('usersCount'); diff --git a/packages/rocketchat-ui/client/views/app/home.js b/packages/rocketchat-ui/client/views/app/home.js index 07f79aa9cce..27e05263aa0 100644 --- a/packages/rocketchat-ui/client/views/app/home.js +++ b/packages/rocketchat-ui/client/views/app/home.js @@ -1,10 +1,11 @@ import { Template } from 'meteor/templating'; +import { settings } from 'meteor/rocketchat:settings'; Template.home.helpers({ title() { - return RocketChat.settings.get('Layout_Home_Title'); + return settings.get('Layout_Home_Title'); }, body() { - return RocketChat.settings.get('Layout_Home_Body'); + return settings.get('Layout_Home_Body'); }, }); diff --git a/packages/rocketchat-ui/client/views/app/room.js b/packages/rocketchat-ui/client/views/app/room.js index 4244a34f09f..f77116f9309 100644 --- a/packages/rocketchat-ui/client/views/app/room.js +++ b/packages/rocketchat-ui/client/views/app/room.js @@ -4,36 +4,52 @@ import { Random } from 'meteor/random'; import { Tracker } from 'meteor/tracker'; import { Blaze } from 'meteor/blaze'; import { FlowRouter } from 'meteor/kadira:flow-router'; -import { RocketChatTabBar } from 'meteor/rocketchat:lib'; import { Session } from 'meteor/session'; import { Template } from 'meteor/templating'; -import { t } from 'meteor/rocketchat:utils'; +import { t, roomTypes, getUserPreference, handleError } from 'meteor/rocketchat:utils'; import { WebRTC } from 'meteor/rocketchat:webrtc'; +import { ChatSubscription, ChatMessage, RoomRoles, Users, Subscriptions, Rooms } from 'meteor/rocketchat:models'; +import { + fireGlobalEvent, + RoomHistoryManager, + RoomManager, + readMessage, + popover, + modal, + Layout, + MessageAction, + RocketChatTabBar, +} from 'meteor/rocketchat:ui-utils'; +import { settings } from 'meteor/rocketchat:settings'; +import { callbacks } from 'meteor/rocketchat:callbacks'; +import { promises } from 'meteor/rocketchat:promises'; +import { hasAllPermission, hasRole } from 'meteor/rocketchat:authorization'; import _ from 'underscore'; import moment from 'moment'; import mime from 'mime-type/with-db'; import Clipboard from 'clipboard'; - import { lazyloadtick } from 'meteor/rocketchat:lazy-load'; +import { ChatMessages } from '../../lib/chatMessages'; +import { fileUpload } from '../../lib/fileUpload'; chatMessages = {}; const isSubscribed = (_id) => ChatSubscription.find({ rid: _id }).count() > 0; -const favoritesEnabled = () => RocketChat.settings.get('Favorite_Rooms'); +const favoritesEnabled = () => settings.get('Favorite_Rooms'); -const userCanDrop = (_id) => !RocketChat.roomTypes.readOnly(_id, Meteor.user()); +const userCanDrop = (_id) => !roomTypes.readOnly(_id, Meteor.user()); const openProfileTab = (e, instance, username) => { const roomData = Session.get(`roomData${ Session.get('openedRoom') }`); - if (RocketChat.Layout.isEmbedded()) { + if (Layout.isEmbedded()) { fireGlobalEvent('click-user-card-message', { username }); e.preventDefault(); e.stopPropagation(); return; } - if (RocketChat.roomTypes.roomTypes[roomData.t].enableMembersListProfile()) { + if (roomTypes.roomTypes[roomData.t].enableMembersListProfile()) { instance.setUserDetail(username); } @@ -42,7 +58,7 @@ const openProfileTab = (e, instance, username) => { }; const openProfileTabOrOpenDM = (e, instance, username) => { - if (RocketChat.settings.get('UI_Click_Direct_Message')) { + if (settings.get('UI_Click_Direct_Message')) { Meteor.call('createDirectMessage', username, (error, result) => { if (error) { if (error.isClientSafe) { @@ -70,7 +86,7 @@ const mountPopover = (e, i, outerContext) => { const [, message] = outerContext._arguments; - let menuItems = RocketChat.MessageAction.getButtons(message, context, 'menu').map((item) => ({ + let menuItems = MessageAction.getButtons(message, context, 'menu').map((item) => ({ icon: item.icon, name: t(item.label), type: 'message-action', @@ -79,7 +95,7 @@ const mountPopover = (e, i, outerContext) => { })); if (window.matchMedia('(max-width: 500px)').matches) { - const messageItems = RocketChat.MessageAction.getButtons(message, context, 'message').map((item) => ({ + const messageItems = MessageAction.getButtons(message, context, 'message').map((item) => ({ icon: item.icon, name: t(item.label), type: 'message-action', @@ -136,23 +152,23 @@ const wipeFailedUploads = () => { }; function roomHasGlobalPurge(room) { - if (!RocketChat.settings.get('RetentionPolicy_Enabled')) { + if (!settings.get('RetentionPolicy_Enabled')) { return false; } switch (room.t) { case 'c': - return RocketChat.settings.get('RetentionPolicy_AppliesToChannels'); + return settings.get('RetentionPolicy_AppliesToChannels'); case 'p': - return RocketChat.settings.get('RetentionPolicy_AppliesToGroups'); + return settings.get('RetentionPolicy_AppliesToGroups'); case 'd': - return RocketChat.settings.get('RetentionPolicy_AppliesToDMs'); + return settings.get('RetentionPolicy_AppliesToDMs'); } return false; } function roomHasPurge(room) { - if (!room || !RocketChat.settings.get('RetentionPolicy_Enabled')) { + if (!room || !settings.get('RetentionPolicy_Enabled')) { return false; } @@ -172,7 +188,7 @@ function roomFilesOnly(room) { return room.retention.filesOnly; } - return RocketChat.settings.get('RetentionPolicy_FilesOnly'); + return settings.get('RetentionPolicy_FilesOnly'); } function roomExcludePinned(room) { @@ -184,7 +200,7 @@ function roomExcludePinned(room) { return room.retention.excludePinned; } - return RocketChat.settings.get('RetentionPolicy_ExcludePinned'); + return settings.get('RetentionPolicy_ExcludePinned'); } function roomMaxAge(room) { @@ -200,26 +216,26 @@ function roomMaxAge(room) { } if (room.t === 'c') { - return RocketChat.settings.get('RetentionPolicy_MaxAge_Channels'); + return settings.get('RetentionPolicy_MaxAge_Channels'); } if (room.t === 'p') { - return RocketChat.settings.get('RetentionPolicy_MaxAge_Groups'); + return settings.get('RetentionPolicy_MaxAge_Groups'); } if (room.t === 'd') { - return RocketChat.settings.get('RetentionPolicy_MaxAge_DMs'); + return settings.get('RetentionPolicy_MaxAge_DMs'); } } -RocketChat.callbacks.add('enter-room', wipeFailedUploads); +callbacks.add('enter-room', wipeFailedUploads); Template.room.helpers({ isTranslated() { const sub = ChatSubscription.findOne({ rid: this._id }, { fields: { autoTranslate: 1, autoTranslateLanguage: 1 } }); - RocketChat.settings.get('AutoTranslate_Enabled') && ((sub != null ? sub.autoTranslate : undefined) === true) && (sub.autoTranslateLanguage != null); + settings.get('AutoTranslate_Enabled') && ((sub != null ? sub.autoTranslate : undefined) === true) && (sub.autoTranslateLanguage != null); }, embeddedVersion() { - return RocketChat.Layout.isEmbedded(); + return Layout.isEmbedded(); }, subscribed() { @@ -228,7 +244,7 @@ Template.room.helpers({ messagesHistory() { const hideMessagesOfType = []; - RocketChat.settings.collection.find({ _id: /Message_HideType_.+/ }).forEach(function(record) { + settings.collection.find({ _id: /Message_HideType_.+/ }).forEach(function(record) { let types; const type = record._id.replace('Message_HideType_', ''); switch (type) { @@ -289,10 +305,10 @@ Template.room.helpers({ roomLeader() { const roles = RoomRoles.findOne({ rid: this._id, roles: 'leader', 'u._id': { $ne: Meteor.userId() } }); if (roles) { - const leader = RocketChat.models.Users.findOne({ _id: roles.u._id }, { fields: { status: 1 } }) || {}; + const leader = Users.findOne({ _id: roles.u._id }, { fields: { status: 1 } }) || {}; return { ...roles.u, - name: RocketChat.settings.get('UI_Use_Real_Name') ? (roles.u.name || roles.u.username) : roles.u.username, + name: settings.get('UI_Use_Real_Name') ? (roles.u.name || roles.u.username) : roles.u.username, status: leader.status || 'offline', statusDisplay: ((status) => status.charAt(0).toUpperCase() + status.slice(1))(leader.status || 'offline'), }; @@ -300,7 +316,7 @@ Template.room.helpers({ }, chatNowLink() { - return RocketChat.roomTypes.getRouteLink('d', { name: this.username }); + return roomTypes.getRouteLink('d', { name: this.username }); }, showAnnouncement() { @@ -337,7 +353,7 @@ Template.room.helpers({ const roomData = Session.get(`roomData${ this._id }`); if (!(roomData != null ? roomData.t : undefined)) { return ''; } - const roomIcon = RocketChat.roomTypes.getIcon(roomData != null ? roomData.t : undefined); + const roomIcon = roomTypes.getIcon(roomData != null ? roomData.t : undefined); // Remove this 'codegueira' on header redesign if (!roomIcon) { @@ -353,11 +369,11 @@ Template.room.helpers({ userStatus() { const roomData = Session.get(`roomData${ this._id }`); - return RocketChat.roomTypes.getUserStatus(roomData.t, this._id) || 'offline'; + return roomTypes.getUserStatus(roomData.t, this._id) || 'offline'; }, maxMessageLength() { - return RocketChat.settings.get('Message_MaxAllowedSize'); + return settings.get('Message_MaxAllowedSize'); }, unreadData() { @@ -401,7 +417,7 @@ Template.room.helpers({ }, adminClass() { - if (RocketChat.authz.hasRole(Meteor.userId(), 'admin')) { return 'admin'; } + if (hasRole(Meteor.userId(), 'admin')) { return 'admin'; } }, showToggleFavorite() { @@ -409,7 +425,7 @@ Template.room.helpers({ }, messageViewMode() { - const viewMode = RocketChat.getUserPreference(Meteor.userId(), 'messageViewMode'); + const viewMode = getUserPreference(Meteor.userId(), 'messageViewMode'); const modes = ['', 'cozy', 'compact']; return modes[viewMode] || modes[0]; }, @@ -419,11 +435,11 @@ Template.room.helpers({ }, hideUsername() { - return RocketChat.getUserPreference(Meteor.userId(), 'hideUsernames') ? 'hide-usernames' : undefined; + return getUserPreference(Meteor.userId(), 'hideUsernames') ? 'hide-usernames' : undefined; }, hideAvatar() { - return RocketChat.getUserPreference(Meteor.userId(), 'hideAvatars') ? 'hide-avatars' : undefined; + return getUserPreference(Meteor.userId(), 'hideAvatars') ? 'hide-avatars' : undefined; }, userCanDrop() { @@ -445,15 +461,15 @@ Template.room.helpers({ return true; } - if (RocketChat.settings.get('Accounts_AllowAnonymousRead') === true) { + if (settings.get('Accounts_AllowAnonymousRead') === true) { return true; } - if (RocketChat.authz.hasAllPermission('preview-c-room')) { + if (hasAllPermission('preview-c-room')) { return true; } - return (RocketChat.models.Subscriptions.findOne({ rid: this._id }) != null); + return (Subscriptions.findOne({ rid: this._id }) != null); }, hideLeaderHeader() { @@ -494,14 +510,14 @@ let lastScrollTop; Template.room.events({ 'click .js-reply-broadcast'() { const message = this._arguments[1]; - RocketChat.roomTypes.openRouteLink('d', { name: this._arguments[1].u.username }, { ...FlowRouter.current().queryParams, reply: message._id }); + roomTypes.openRouteLink('d', { name: this._arguments[1].u.username }, { ...FlowRouter.current().queryParams, reply: message._id }); }, 'click, touchend'(e, t) { Meteor.setTimeout(() => t.sendToBottomIfNecessaryDebounced(), 100); }, 'click .messages-container-main'() { - if (Template.instance().tabBar.getState() === 'opened' && RocketChat.getUserPreference(Meteor.userId(), 'hideFlexTab')) { + if (Template.instance().tabBar.getState() === 'opened' && getUserPreference(Meteor.userId(), 'hideFlexTab')) { Template.instance().tabBar.close(); } }, @@ -681,7 +697,7 @@ Template.room.events({ } const [, message] = this._arguments; - const allItems = RocketChat.MessageAction.getButtons(message, context, 'menu').map((item) => ({ + const allItems = MessageAction.getButtons(message, context, 'menu').map((item) => ({ icon: item.icon, name: t(item.label), type: 'message-action', @@ -721,7 +737,7 @@ Template.room.events({ } const channel = $(e.currentTarget).data('channel'); if (channel != null) { - if (RocketChat.Layout.isEmbedded()) { + if (Layout.isEmbedded()) { fireGlobalEvent('click-mention-link', { path: FlowRouter.path('channel', { name: channel }), channel }); } @@ -831,7 +847,7 @@ Template.room.events({ const roomData = Session.get(`roomData${ this._id }`); if (!roomData) { return false; } if (roomData.announcementDetails != null && roomData.announcementDetails.callback != null) { - return RocketChat.callbacks.run(roomData.announcementDetails.callback, this._id); + return callbacks.run(roomData.announcementDetails.callback, this._id); } else { modal.open({ title: t('Announcement'), @@ -853,9 +869,9 @@ Template.room.events({ if (!msg) { return; } - RocketChat.promises.run('onClientBeforeSendMessage', msgObject).then((msgObject) => { - const chatMessages = window.chatMessages[rid]; - if (chatMessages && chatMessages.processSlashCommand(msgObject)) { + promises.run('onClientBeforeSendMessage', msgObject).then((msgObject) => { + const _chatMessages = chatMessages[rid]; + if (_chatMessages && _chatMessages.processSlashCommand(msgObject)) { return; } @@ -941,7 +957,7 @@ Template.room.onCreated(function() { this.hasTokenpass = new ReactiveVar(false); - if (RocketChat.settings.get('API_Tokenpass_URL') !== '') { + if (settings.get('API_Tokenpass_URL') !== '') { Meteor.call('getChannelTokenpass', this.data._id, (error, result) => { if (!error) { this.hasTokenpass.set(!!(result && result.tokens && result.tokens.length > 0)); @@ -990,10 +1006,10 @@ Template.room.onDestroyed(function() { Template.room.onRendered(function() { // $(this.find('.messages-box .wrapper')).perfectScrollbar(); const rid = Session.get('openedRoom'); - if (!window.chatMessages[rid]) { - window.chatMessages[rid] = new ChatMessages; + if (!chatMessages[rid]) { + chatMessages[rid] = new ChatMessages; } - window.chatMessages[rid].init(this.firstNode); + chatMessages[rid].init(this.firstNode); // ScrollListener.init() const wrapper = this.find('.wrapper'); @@ -1137,7 +1153,7 @@ Template.room.onRendered(function() { } }); } - RocketChat.callbacks.add('streamMessage', (msg) => { + callbacks.add('streamMessage', (msg) => { if (rid !== msg.rid || msg.editedAt) { return; } @@ -1146,7 +1162,7 @@ Template.room.onRendered(function() { } }); Tracker.autorun(function() { - const room = RocketChat.models.Rooms.findOne({ _id: template.data._id }); + const room = Rooms.findOne({ _id: template.data._id }); if (!room) { FlowRouter.go('home'); } diff --git a/packages/rocketchat-ui/client/views/app/roomSearch.js b/packages/rocketchat-ui/client/views/app/roomSearch.js index 26c451fbf36..96034a2bcf4 100644 --- a/packages/rocketchat-ui/client/views/app/roomSearch.js +++ b/packages/rocketchat-ui/client/views/app/roomSearch.js @@ -1,4 +1,5 @@ import { Template } from 'meteor/templating'; +import { roomTypes } from 'meteor/rocketchat:utils'; Template.roomSearch.helpers({ roomIcon() { @@ -6,7 +7,7 @@ Template.roomSearch.helpers({ return 'icon-at'; } if (this.type === 'r') { - return RocketChat.roomTypes.getIcon(this.t); + return roomTypes.getIcon(this.t); } }, userStatus() { diff --git a/packages/rocketchat-ui/client/views/app/secretURL.js b/packages/rocketchat-ui/client/views/app/secretURL.js index f8b1f3fc709..cc85227ba27 100644 --- a/packages/rocketchat-ui/client/views/app/secretURL.js +++ b/packages/rocketchat-ui/client/views/app/secretURL.js @@ -3,11 +3,12 @@ import { ReactiveVar } from 'meteor/reactive-var'; import { FlowRouter } from 'meteor/kadira:flow-router'; import { Session } from 'meteor/session'; import { Template } from 'meteor/templating'; +import { settings } from 'meteor/rocketchat:settings'; Template.secretURL.helpers({ registrationAllowed() { const { hashIsValid } = Template.instance(); - return RocketChat.settings.get('Accounts_RegistrationForm') === 'Secret URL' && hashIsValid && hashIsValid.get(); + return settings.get('Accounts_RegistrationForm') === 'Secret URL' && hashIsValid && hashIsValid.get(); }, ready() { const instance = Template.instance(); diff --git a/packages/rocketchat-ui/client/views/cmsPage.js b/packages/rocketchat-ui/client/views/cmsPage.js index 27d1d4b37a3..17ee242341c 100644 --- a/packages/rocketchat-ui/client/views/cmsPage.js +++ b/packages/rocketchat-ui/client/views/cmsPage.js @@ -3,13 +3,14 @@ import { FlowRouter } from 'meteor/kadira:flow-router'; import { Session } from 'meteor/session'; import { Template } from 'meteor/templating'; import { Tracker } from 'meteor/tracker'; +import { settings } from 'meteor/rocketchat:settings'; Template.cmsPage.onCreated(function() { this.page = new ReactiveVar(''); return Tracker.autorun(() => { const cmsPage = Session.get('cmsPage'); if (cmsPage != null) { - return this.page.set(RocketChat.settings.get(cmsPage)); + return this.page.set(settings.get(cmsPage)); } }); }); diff --git a/packages/rocketchat-ui/package.js b/packages/rocketchat-ui/package.js index 13bf72e0cf5..74339d3006b 100644 --- a/packages/rocketchat-ui/package.js +++ b/packages/rocketchat-ui/package.js @@ -20,7 +20,6 @@ Package.onUse(function(api) { 'reactive-var', 'ecmascript', 'templating', - 'rocketchat:lib', 'rocketchat:ui-master', 'rocketchat:push', 'rocketchat:utils', @@ -52,7 +51,6 @@ Package.onUse(function(api) { api.addFiles('client/lib/fireEvent.js', 'client'); api.addFiles('client/lib/iframeCommands.js', 'client'); api.addFiles('client/lib/menu.js', 'client'); - api.addFiles('client/lib/modal.js', 'client'); api.addFiles('client/lib/Modernizr.js', 'client'); api.addFiles('client/lib/msgTyping.js', 'client'); api.addFiles('client/lib/notification.js', 'client'); @@ -147,6 +145,8 @@ Package.onUse(function(api) { api.addFiles('client/components/contextualBar.html', 'client'); api.addFiles('client/components/contextualBar.js', 'client'); + api.mainModule('client/index.js', 'client'); + api.export('fileUpload'); api.export('modal', 'client'); api.export('popover', 'client');