diff --git a/app/assets/javascripts/discourse/app/models/topic-tracking-state.js b/app/assets/javascripts/discourse/app/models/topic-tracking-state.js index 39ea6edda58..82f719536de 100644 --- a/app/assets/javascripts/discourse/app/models/topic-tracking-state.js +++ b/app/assets/javascripts/discourse/app/models/topic-tracking-state.js @@ -397,8 +397,9 @@ const TopicTrackingState = EmberObject.extend({ * @method removeTopic */ removeTopic(topicId) { - this.states.delete(this._stateKey(topicId)); - this._afterStateChange(); + if (this.states.delete(this._stateKey(topicId))) { + this._afterStateChange(); + } }, /** diff --git a/app/assets/javascripts/discourse/tests/unit/models/topic-tracking-state-test.js b/app/assets/javascripts/discourse/tests/unit/models/topic-tracking-state-test.js index 3f03c156407..162ed0546e0 100644 --- a/app/assets/javascripts/discourse/tests/unit/models/topic-tracking-state-test.js +++ b/app/assets/javascripts/discourse/tests/unit/models/topic-tracking-state-test.js @@ -335,6 +335,12 @@ module("Unit | Model | topic-tracking-state", function (hooks) { trackingState.loadStates([{ topic_id: 111 }, { topic_id: 222 }]); trackingState.set("_trackedTopicLimit", 1); + let stateChangeCallbackCalledTimes = 0; + + trackingState.onStateChange(() => { + stateChangeCallbackCalledTimes += 1; + }); + const list = { topics: [ this.store.createRecord("topic", { @@ -344,15 +350,36 @@ module("Unit | Model | topic-tracking-state", function (hooks) { unread_posts: 0, prevent_sync: false, }), + this.store.createRecord("topic", { + id: 333, + unseen: false, + seen: true, + unread_posts: 0, + prevent_sync: false, + }), + this.store.createRecord("topic", { + id: 444, + unseen: false, + seen: true, + unread_posts: 0, + prevent_sync: false, + }), ], }; trackingState.sync(list, "unread"); + assert.notOk( trackingState.states.has("t111"), "expect state for topic 111 to be deleted" ); + assert.equal( + stateChangeCallbackCalledTimes, + 1, + "callback is only called once" + ); + trackingState.loadStates([{ topic_id: 111 }, { topic_id: 222 }]); trackingState.set("_trackedTopicLimit", 5); trackingState.sync(list, "unread");