From 7f112ffd4ebe7500ff4aee0e8cfdfe8b946af453 Mon Sep 17 00:00:00 2001 From: Andrei Prigorshnev Date: Tue, 19 Jul 2022 21:18:51 +0400 Subject: [PATCH] FIX: When a user status update received other users statuses were getting cleared (#17520) --- .../javascripts/discourse/app/models/user.js | 4 ++- .../discourse/tests/unit/models/user-test.js | 35 +++++++++++++++++++ 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/app/assets/javascripts/discourse/app/models/user.js b/app/assets/javascripts/discourse/app/models/user.js index e2a9379845..098a902023 100644 --- a/app/assets/javascripts/discourse/app/models/user.js +++ b/app/assets/javascripts/discourse/app/models/user.js @@ -1238,7 +1238,9 @@ User.reopen(Evented, { }, _updateStatus(statuses) { - this.set("status", statuses[this.id]); + if (statuses.hasOwnProperty(this.id)) { + this.set("status", statuses[this.id]); + } }, }); diff --git a/app/assets/javascripts/discourse/tests/unit/models/user-test.js b/app/assets/javascripts/discourse/tests/unit/models/user-test.js index e623523a4d..58eb7d7cbb 100644 --- a/app/assets/javascripts/discourse/tests/unit/models/user-test.js +++ b/app/assets/javascripts/discourse/tests/unit/models/user-test.js @@ -111,4 +111,39 @@ module("Unit | Model | user", function (hooks) { assert.ok(spyMomentGuess.notCalled); }); + + test("clears statuses of several users correctly when receiving status updates via appEvents", function (assert) { + const status1 = { + description: "user1 status", + emoji: "mega", + }; + const status2 = { + description: "user2 status", + emoji: "speech_balloon", + }; + const user1 = User.create({ + id: 1, + status: status1, + }); + const user2 = User.create({ id: 2, status: status2 }); + const appEvents = user1.appEvents; + + try { + user1.trackStatus(); + user2.trackStatus(); + assert.equal(user1.status, status1); + assert.equal(user2.status, status2); + + appEvents.trigger("user-status:changed", { [user1.id]: null }); + assert.equal(user1.status, null); + assert.equal(user2.status, status2); + + appEvents.trigger("user-status:changed", { [user2.id]: null }); + assert.equal(user1.status, null); + assert.equal(user2.status, null); + } finally { + user1.stopTrackingStatus(); + user2.stopTrackingStatus(); + } + }); });