Don't show the same user twice in Spotlight (#8978)
Co-authored-by: Janne Mareike Koschinski <janne@kuschku.de>
This commit is contained in:
parent
7afc8c5869
commit
e65409861a
2 changed files with 53 additions and 5 deletions
|
@ -55,6 +55,7 @@ declare global {
|
||||||
roomHeaderName(
|
roomHeaderName(
|
||||||
options?: Partial<Loggable & Timeoutable & Withinable & Shadow>
|
options?: Partial<Loggable & Timeoutable & Withinable & Shadow>
|
||||||
): Chainable<JQuery<HTMLElement>>;
|
): Chainable<JQuery<HTMLElement>>;
|
||||||
|
startDM(name: string): Chainable<void>;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -109,6 +110,20 @@ Cypress.Commands.add("roomHeaderName", (
|
||||||
return cy.get(".mx_RoomHeader_nametext", options);
|
return cy.get(".mx_RoomHeader_nametext", options);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
Cypress.Commands.add("startDM", (name: string) => {
|
||||||
|
cy.openSpotlightDialog().within(() => {
|
||||||
|
cy.spotlightFilter(Filter.People);
|
||||||
|
cy.spotlightSearch().clear().type(name);
|
||||||
|
cy.get(".mx_Spinner").should("not.exist");
|
||||||
|
cy.spotlightResults().should("have.length", 1);
|
||||||
|
cy.spotlightResults().eq(0).should("contain", name);
|
||||||
|
cy.spotlightResults().eq(0).click();
|
||||||
|
}).then(() => {
|
||||||
|
cy.roomHeaderName().should("contain", name);
|
||||||
|
cy.get(".mx_RoomSublist[aria-label=People]").should("contain", name);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
describe("Spotlight", () => {
|
describe("Spotlight", () => {
|
||||||
let synapse: SynapseInstance;
|
let synapse: SynapseInstance;
|
||||||
|
|
||||||
|
@ -319,6 +334,23 @@ describe("Spotlight", () => {
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it("should close spotlight after starting a DM", () => {
|
||||||
|
cy.startDM(bot1Name);
|
||||||
|
cy.get(".mx_SpotlightDialog").should("have.length", 0);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should show the same user only once", () => {
|
||||||
|
cy.startDM(bot1Name);
|
||||||
|
cy.visit("/#/home");
|
||||||
|
|
||||||
|
cy.openSpotlightDialog().within(() => {
|
||||||
|
cy.spotlightFilter(Filter.People);
|
||||||
|
cy.spotlightSearch().clear().type(bot1Name);
|
||||||
|
cy.get(".mx_Spinner").should("not.exist");
|
||||||
|
cy.spotlightResults().should("have.length", 1);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
it("should be able to navigate results via keyboard", () => {
|
it("should be able to navigate results via keyboard", () => {
|
||||||
cy.openSpotlightDialog().within(() => {
|
cy.openSpotlightDialog().within(() => {
|
||||||
cy.spotlightFilter(Filter.People);
|
cy.spotlightFilter(Filter.People);
|
||||||
|
|
|
@ -320,8 +320,25 @@ const SpotlightDialog: React.FC<IProps> = ({ initialText = "", initialFilter = n
|
||||||
);
|
);
|
||||||
const possibleResults = useMemo<Result[]>(
|
const possibleResults = useMemo<Result[]>(
|
||||||
() => {
|
() => {
|
||||||
const roomMembers = findVisibleRoomMembers(cli);
|
const roomResults = findVisibleRooms(cli).map(toRoomResult);
|
||||||
const roomMemberIds = new Set(roomMembers.map(item => item.userId));
|
// If we already have a DM with the user we're looking for, we will
|
||||||
|
// show that DM instead of the user themselves
|
||||||
|
const alreadyAddedUserIds = roomResults.reduce((userIds, result) => {
|
||||||
|
const userId = DMRoomMap.shared().getUserIdForRoomId(result.room.roomId);
|
||||||
|
if (!userId) return userIds;
|
||||||
|
if (result.room.getJoinedMemberCount() > 2) return userIds;
|
||||||
|
userIds.add(userId);
|
||||||
|
return userIds;
|
||||||
|
}, new Set<string>());
|
||||||
|
const userResults = [];
|
||||||
|
for (const user of [...findVisibleRoomMembers(cli), ...users]) {
|
||||||
|
// Make sure we don't have any user more than once
|
||||||
|
if (alreadyAddedUserIds.has(user.userId)) continue;
|
||||||
|
alreadyAddedUserIds.add(user.userId);
|
||||||
|
|
||||||
|
userResults.push(toMemberResult(user));
|
||||||
|
}
|
||||||
|
|
||||||
return [
|
return [
|
||||||
...SpaceStore.instance.enabledMetaSpaces.map(spaceKey => ({
|
...SpaceStore.instance.enabledMetaSpaces.map(spaceKey => ({
|
||||||
section: Section.Spaces,
|
section: Section.Spaces,
|
||||||
|
@ -335,9 +352,8 @@ const SpotlightDialog: React.FC<IProps> = ({ initialText = "", initialFilter = n
|
||||||
SpaceStore.instance.setActiveSpace(spaceKey);
|
SpaceStore.instance.setActiveSpace(spaceKey);
|
||||||
},
|
},
|
||||||
})),
|
})),
|
||||||
...findVisibleRooms(cli).map(toRoomResult),
|
...roomResults,
|
||||||
...roomMembers.map(toMemberResult),
|
...userResults,
|
||||||
...users.filter(item => !roomMemberIds.has(item.userId)).map(toMemberResult),
|
|
||||||
...(profile ? [new DirectoryMember(profile)] : []).map(toMemberResult),
|
...(profile ? [new DirectoryMember(profile)] : []).map(toMemberResult),
|
||||||
...publicRooms.map(toPublicRoomResult),
|
...publicRooms.map(toPublicRoomResult),
|
||||||
].filter(result => filter === null || result.filter.includes(filter));
|
].filter(result => filter === null || result.filter.includes(filter));
|
||||||
|
|
Loading…
Reference in a new issue