Reuse comment thread elements when possible When threads are updated, we first check if a thread element with the same rootId already exists and simply update the thread element in that case instead of creating a new element. Change-Id: Ica460fceeff6661eaf5fa31894c58bcbd50d0926
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-host/gr-diff-host.ts b/polygerrit-ui/app/elements/diff/gr-diff-host/gr-diff-host.ts index 4641897..b1bad1c 100644 --- a/polygerrit-ui/app/elements/diff/gr-diff-host/gr-diff-host.ts +++ b/polygerrit-ui/app/elements/diff/gr-diff-host/gr-diff-host.ts
@@ -56,6 +56,7 @@ PatchRange, PatchSetNum, RepoName, + UrlEncodedCommentId, } from '../../../types/common'; import { DiffInfo, @@ -730,11 +731,24 @@ } _threadsChanged(threads: CommentThread[]) { - const threadEls = new Set<Object>(); + const threadEls = new Set<GrCommentThread>(); + const rootIdToThreadEl = new Map<UrlEncodedCommentId, GrCommentThread>(); + for (const threadEl of this.getThreadEls()) { + if (threadEl.rootId) { + rootIdToThreadEl.set(threadEl.rootId, threadEl); + } + } for (const thread of threads) { - const threadEl = this._createThreadElement(thread); - this._attachThreadElement(threadEl); - threadEls.add(threadEl); + const existingThreadEl = + thread.rootId && rootIdToThreadEl.get(thread.rootId); + if (existingThreadEl) { + this._updateThreadElement(existingThreadEl, thread); + threadEls.add(existingThreadEl); + } else { + const threadEl = this._createThreadElement(thread); + this._attachThreadElement(threadEl); + threadEls.add(threadEl); + } } // Remove all threads that are no longer existing. for (const threadEl of this.getThreadEls()) {
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-host/gr-diff-host_test.js b/polygerrit-ui/app/elements/diff/gr-diff-host/gr-diff-host_test.js index ed3ffe0..8901636 100644 --- a/polygerrit-ui/app/elements/diff/gr-diff-host/gr-diff-host_test.js +++ b/polygerrit-ui/app/elements/diff/gr-diff-host/gr-diff-host_test.js
@@ -1145,11 +1145,19 @@ .queryDistributedElements('gr-comment-thread'); assert.equal(threads.length, 1); - element.threads= [...element.threads, thread]; threads = dom(element.$.diff) .queryDistributedElements('gr-comment-thread'); + // Threads have same rootId so element is reused + assert.equal(threads.length, 1); + + const newThread = {...thread}; + newThread.rootId = 'differentRootId'; + element.threads= [...element.threads, newThread]; + threads = dom(element.$.diff) + .queryDistributedElements('gr-comment-thread'); + // New thread has a different rootId assert.equal(threads.length, 2); });