diff --git a/packages/rocketchat-apps/client/admin/appInstall.html b/packages/rocketchat-apps/client/admin/appInstall.html index 15564eac7a4..fa7b7cdc720 100644 --- a/packages/rocketchat-apps/client/admin/appInstall.html +++ b/packages/rocketchat-apps/client/admin/appInstall.html @@ -49,8 +49,14 @@
{{/if}} diff --git a/packages/rocketchat-apps/client/admin/appInstall.js b/packages/rocketchat-apps/client/admin/appInstall.js index f41dcb84401..0369f75254c 100644 --- a/packages/rocketchat-apps/client/admin/appInstall.js +++ b/packages/rocketchat-apps/client/admin/appInstall.js @@ -21,6 +21,11 @@ Template.appInstall.helpers({ disabled() { const instance = Template.instance(); return !(instance.appUrl.get() || instance.file.get()); + }, + isUpdating() { + const instance = Template.instance(); + + return !!instance.isUpdatingId.get(); } }); diff --git a/packages/rocketchat-apps/server/communication/websockets.js b/packages/rocketchat-apps/server/communication/websockets.js index 098f65811f5..8c0d4025a67 100644 --- a/packages/rocketchat-apps/server/communication/websockets.js +++ b/packages/rocketchat-apps/server/communication/websockets.js @@ -23,6 +23,7 @@ export class AppServerListener { this.engineStreamer.on(AppEvents.APP_STATUS_CHANGE, this.onAppStatusUpdated.bind(this)); this.engineStreamer.on(AppEvents.APP_SETTING_UPDATED, this.onAppSettingUpdated.bind(this)); this.engineStreamer.on(AppEvents.APP_REMOVED, this.onAppRemoved.bind(this)); + this.engineStreamer.on(AppEvents.APP_UPDATED, this.onAppUpdated.bind(this)); this.engineStreamer.on(AppEvents.COMMAND_ADDED, this.onCommandAdded.bind(this)); this.engineStreamer.on(AppEvents.COMMAND_DISABLED, this.onCommandDisabled.bind(this)); this.engineStreamer.on(AppEvents.COMMAND_UPDATED, this.onCommandUpdated.bind(this)); @@ -53,6 +54,15 @@ export class AppServerListener { this.clientStreamer.emit(AppEvents.APP_SETTING_UPDATED, { appId }); } + async onAppUpdated(appId) { + this.recieved.set(`${ AppEvents.APP_UPDATED }_${ appId }`, { appId, when: new Date() }); + + const storageItem = await this.orch.getStorage().retrieveOne(appId); + + await this.orch.getManager().update(storageItem.zip); + this.clientStreamer.emit(AppEvents.APP_UPDATED, appId); + } + async onAppRemoved(appId) { await this.orch.getManager().remove(appId); this.clientStreamer.emit(AppEvents.APP_REMOVED, appId); @@ -105,6 +115,11 @@ export class AppServerNotifier { } async appUpdated(appId) { + if (this.recieved.has(`${ AppEvents.APP_UPDATED }_${ appId }`)) { + this.recieved.delete(`${ AppEvents.APP_UPDATED }_${ appId }`); + return; + } + this.engineStreamer.emit(AppEvents.APP_UPDATED, appId); this.clientStreamer.emit(AppEvents.APP_UPDATED, appId); } diff --git a/packages/rocketchat-lib/client/lib/RestApiClient.js b/packages/rocketchat-lib/client/lib/RestApiClient.js index cadcbaed02e..b3e95811765 100644 --- a/packages/rocketchat-lib/client/lib/RestApiClient.js +++ b/packages/rocketchat-lib/client/lib/RestApiClient.js @@ -70,7 +70,7 @@ RocketChat.API = { return new Promise(function _jqueryFormDataPromise(resolve, reject) { jQuery.ajax({ - url: `${ Meteor.absoluteUrl() }api/${ endpoint }${ query }`, + url: `${ window.location.origin }/api/${ endpoint }${ query }`, headers: { 'X-User-Id': localStorage['Meteor.userId'], 'X-Auth-Token': localStorage['Meteor.loginToken']