Merge "Fill account details in mentionedUsersInUnresolvedDrafts state"
diff --git a/polygerrit-ui/app/elements/change/gr-reply-dialog/gr-reply-dialog_test.ts b/polygerrit-ui/app/elements/change/gr-reply-dialog/gr-reply-dialog_test.ts
index fda4016..a6f33fa 100644
--- a/polygerrit-ui/app/elements/change/gr-reply-dialog/gr-reply-dialog_test.ts
+++ b/polygerrit-ui/app/elements/change/gr-reply-dialog/gr-reply-dialog_test.ts
@@ -50,6 +50,7 @@
ReviewResult,
RevisionPatchSetNum,
Suggestion,
+ Timestamp,
UrlEncodedCommentId,
UserId,
} from '../../../types/common';
@@ -2583,6 +2584,12 @@
});
test('mentioned user in unresolved draft is added to CC and AttentionSet', async () => {
+ stubRestApi('getAccountDetails').returns(
+ Promise.resolve({
+ ...createAccountWithEmail('abcd@def.com' as EmailAddress),
+ registered_on: '2015-03-12 18:32:08.000000000' as Timestamp,
+ })
+ );
const draft = {
...createDraft(),
message: 'hey @abcd@def.com take a look at this',
@@ -2599,7 +2606,9 @@
discardedDrafts: [],
});
element.draftCommentThreads = [createCommentThread([draft])];
- await waitUntil(() => element.mentionedUsers.length > 0);
+ await waitUntil(
+ () => element.mentionedUsersInUnresolvedDrafts.length > 0
+ );
await element.updateComplete;
@@ -2622,6 +2631,12 @@
});
test('mention user can be manually removed from attention set', async () => {
+ stubRestApi('getAccountDetails').returns(
+ Promise.resolve({
+ ...createAccountWithEmail('abcd@def.com' as EmailAddress),
+ registered_on: '2015-03-12 18:32:08.000000000' as Timestamp,
+ })
+ );
const draft = {
...createDraft(),
message: 'hey @abcd@def.com take a look at this',
@@ -2638,7 +2653,9 @@
discardedDrafts: [],
});
element.draftCommentThreads = [createCommentThread([draft])];
- await waitUntil(() => element.mentionedUsers.length > 0);
+ await waitUntil(
+ () => element.mentionedUsersInUnresolvedDrafts.length > 0
+ );
await element.updateComplete;
diff --git a/polygerrit-ui/app/models/comments/comments-model.ts b/polygerrit-ui/app/models/comments/comments-model.ts
index e737005..3372b26 100644
--- a/polygerrit-ui/app/models/comments/comments-model.ts
+++ b/polygerrit-ui/app/models/comments/comments-model.ts
@@ -30,7 +30,7 @@
import {RouterModel} from '../../services/router/router-model';
import {Finalizable} from '../../services/registry';
import {define} from '../dependency';
-import {combineLatest, Subscription} from 'rxjs';
+import {combineLatest, forkJoin, from, Observable, Subscription} from 'rxjs';
import {fire, fireAlert, fireEvent} from '../../utils/event-util';
import {CURRENT} from '../../utils/patch-set-util';
import {RestApiService} from '../../services/gr-rest-api/gr-rest-api';
@@ -46,6 +46,13 @@
import {EventType} from '../../types/events';
import {SpecialFilePath} from '../../constants/constants';
import {AccountsModel} from '../accounts-model/accounts-model';
+import {
+ distinctUntilChanged,
+ map,
+ shareReplay,
+ switchMap,
+} from 'rxjs/operators';
+import {notUndefined} from '../../types/types';
export interface CommentState {
/** undefined means 'still loading' */
@@ -284,22 +291,28 @@
);
});
- public readonly mentionedUsersInUnresolvedDrafts$ = select(
- this.drafts$,
- drafts => {
- const users: AccountInfo[] = [];
- const comments = Object.values(drafts ?? {})
- .flat()
- .filter(c => c.unresolved);
- for (const comment of comments) {
- users.push(...extractMentionedUsers(comment.message));
- }
- return users.filter(
- (user, index) =>
- index === users.findIndex(u => getUserId(u) === getUserId(user))
- );
- }
- );
+ public readonly mentionedUsersInUnresolvedDrafts$: Observable<AccountInfo[]> =
+ this.drafts$.pipe(
+ switchMap(drafts => {
+ const users: AccountInfo[] = [];
+ const comments = Object.values(drafts ?? {})
+ .flat()
+ .filter(c => c.unresolved);
+ for (const comment of comments) {
+ users.push(...extractMentionedUsers(comment.message));
+ }
+ const uniqueUsers = users.filter(
+ (user, index) =>
+ index === users.findIndex(u => getUserId(u) === getUserId(user))
+ );
+ const filledUsers$: Observable<AccountInfo | undefined>[] =
+ uniqueUsers.map(user => from(this.accountsModel.fillDetails(user)));
+ return forkJoin(filledUsers$);
+ }),
+ map(users => users.filter(notUndefined)),
+ distinctUntilChanged(deepEqual),
+ shareReplay(1)
+ );
// Emits a new value even if only a single draft is changed. Components should
// aim to subsribe to something more specific.