From c961dcc757911901b213b26c97a9972d7291c8c6 Mon Sep 17 00:00:00 2001 From: Sam Date: Mon, 6 Mar 2023 15:52:24 +1100 Subject: [PATCH] FIX: leaking callbacks to synchronize state (#20540) Every time we created a topic list we would leak a state change callback This happens on any topic list -> topic -> topic list sequence This can cause corruption of tracking state and memory bloating given that all information may be sent to the sync function. --- .../discourse/app/components/discovery-topics-list.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/app/assets/javascripts/discourse/app/components/discovery-topics-list.js b/app/assets/javascripts/discourse/app/components/discovery-topics-list.js index 4821ade3736..2de7ed73ef7 100644 --- a/app/assets/javascripts/discourse/app/components/discovery-topics-list.js +++ b/app/assets/javascripts/discourse/app/components/discovery-topics-list.js @@ -27,12 +27,16 @@ export default Component.extend(UrlRefresh, LoadMore, { @on("didInsertElement") _monitorTrackingState() { - this.topicTrackingState.onStateChange(() => this._updateTrackingTopics()); + this.stateChangeCallbackId = this.topicTrackingState.onStateChange(() => + this._updateTrackingTopics() + ); }, @on("willDestroyElement") _removeTrackingStateChangeMonitor() { - this.topicTrackingState.offStateChange(this.stateChangeCallbackId); + if (this.stateChangeCallbackId) { + this.topicTrackingState.offStateChange(this.stateChangeCallbackId); + } }, _updateTrackingTopics() {