discourse/app/assets/javascripts
Alan Guo Xiang Tan 1106e4ad09
FIX: Sidebar custom sections rendering perf degrades over time (#21552)
What is the problem?

The main problem here is that we were incorrectly registering the same `onStateChange` callback with `TopicTrackingState`
each time a user reads a post. When a user reads a post, the state in `TopicTrackingState` is updated and it triggers all
the `onStateChange` callbacks which have been registered. In the `CommunitySection` class, we register a callback which
would then call the `onTopicTrackingStateChange` method for each link in the class. For the `EverythingSectionLink` class,
this would lookup the state in `TopicTrackingState` to get a new count of unread/new topics and update the `totalUnread` and
`totalNew` properties which are tracked. For some reason that I have yet to figure out, updating the either of the tracked properties
would result in Ember rerendering the entire `{{#each this.sections as |section|}}` in `component/sidebar/user/custom-sections.hbs`
template. Note that `this.sections` refers to a `@cached` getter in the `SidebarUserCustomSections` class. The problem is that
the `sections` getter is initializing a new bunch of sidebar sections related classes without calling the teardown function.
As a result, we end up registering new `onStateChange` callbacks in `TopicTrackingState` in `CommunitySection` without
removing the old ones. Over time, the number of callbacks build up and we end up slowing down the application. While we do
not know the reason why defining a getter for the `sections` is causing the entire block to re-render, I realized that
it is dangerous to use a getter for `sections` here since we have very little control on when the cached is broken.

Instead, I moved the `sections` getter to a tracked property instead where the property is updated via `appEvents`. With
this change, updating the tracked properties in `EverythingSectionLink` is no longer triggering a complete re-render of the
said block above. We also now call `teardown` on the section objects that has been initialised before updating the `sections`
property.
2023-05-15 15:43:41 +08:00
..
admin Build(deps): Bump webpack in /app/assets/javascripts (#21496) 2023-05-11 17:27:09 +02:00
bootstrap-json Build(deps): Bump jsdom from 21.1.1 to 22.0.0 in /app/assets/javascripts (#21350) 2023-05-08 11:45:28 +02:00
confirm-new-email DEV: Add error message styling (#21225) 2023-04-25 08:40:18 -04:00
dialog-holder Build(deps): Bump webpack in /app/assets/javascripts (#21496) 2023-05-11 17:27:09 +02:00
discourse FIX: Sidebar custom sections rendering perf degrades over time (#21552) 2023-05-15 15:43:41 +08:00
discourse-common Build(deps): Bump webpack in /app/assets/javascripts (#21496) 2023-05-11 17:27:09 +02:00
discourse-hbr Build(deps): Bump webpack in /app/assets/javascripts (#21496) 2023-05-11 17:27:09 +02:00
discourse-plugins Build(deps): Bump webpack in /app/assets/javascripts (#21496) 2023-05-11 17:27:09 +02:00
discourse-widget-hbs Build(deps): Bump webpack in /app/assets/javascripts (#21496) 2023-05-11 17:27:09 +02:00
docs
ember-addons
ember-cli-progress-ci DEV: Add progress output in CI during ember-cli build (#17977) 2022-08-17 22:39:52 +01:00
ember-production-deprecations DEV: Include ember deprecation messages in production builds (#20587) 2023-03-10 10:37:28 +00:00
locales UX/DEV: Review queue redesign fixes (#20239) 2023-03-02 16:40:53 +01:00
patches DEV: Update ember-cli to 4.12.0 (#21074) 2023-04-19 12:58:29 +02:00
pretty-text Build(deps): Bump webpack in /app/assets/javascripts (#21496) 2023-05-11 17:27:09 +02:00
select-kit Build(deps): Bump webpack in /app/assets/javascripts (#21496) 2023-05-11 17:27:09 +02:00
truth-helpers Build(deps): Bump webpack in /app/assets/javascripts (#21496) 2023-05-11 17:27:09 +02:00
wizard Build(deps): Bump webpack in /app/assets/javascripts (#21496) 2023-05-11 17:27:09 +02:00
.licensee.json Revert "DEV: Merge package.json files (#21172)" (#21182) 2023-04-20 14:57:40 +02:00
.npmrc
discourse-js-processor.js DEV: Update ember-cli-htmlbars to 6.2.0 (#20467) 2023-02-27 18:43:28 +01:00
handlebars-shim.js
package.json DEV: Move app build-time dependencies to devDependencies (#21310) 2023-05-03 09:25:13 +01:00
polyfills.js Drop support for iOS < 15.7 (#19847) 2023-01-16 17:28:59 +00:00
service-worker.js.erb FIX: Service worker for Safari (#21435) 2023-05-09 18:36:20 +03:00
yarn.lock Build(deps): Bump webpack in /app/assets/javascripts (#21496) 2023-05-11 17:27:09 +02:00