diff --git a/src/stores/widgets/StopGapWidgetDriver.ts b/src/stores/widgets/StopGapWidgetDriver.ts index dfd1ae50b80..b21152beb22 100644 --- a/src/stores/widgets/StopGapWidgetDriver.ts +++ b/src/stores/widgets/StopGapWidgetDriver.ts @@ -31,6 +31,7 @@ import { WidgetDriver, WidgetEventCapability, WidgetKind, + ISearchUserDirectoryResult, } from "matrix-widget-api"; import { ClientEvent, ITurnServer as IClientTurnServer } from "matrix-js-sdk/src/client"; import { EventType } from "matrix-js-sdk/src/@types/event"; @@ -486,4 +487,19 @@ export class StopGapWidgetDriver extends WidgetDriver { prevBatch: prevBatch ?? undefined, }; } + + public async searchUserDirectory(searchTerm: string, limit?: number): Promise { + const client = MatrixClientPeg.get(); + + const { limited, results } = await client.searchUserDirectory({ term: searchTerm, limit }); + + return { + limited, + results: results.map((r) => ({ + userId: r.user_id, + displayName: r.display_name, + avatarUrl: r.avatar_url, + })), + }; + } } diff --git a/test/stores/widgets/StopGapWidgetDriver-test.ts b/test/stores/widgets/StopGapWidgetDriver-test.ts index 6bb82a065e9..28f2becbeff 100644 --- a/test/stores/widgets/StopGapWidgetDriver-test.ts +++ b/test/stores/widgets/StopGapWidgetDriver-test.ts @@ -394,4 +394,40 @@ describe("StopGapWidgetDriver", () => { expect(client.getVisibleRooms).toHaveBeenCalledWith(true); }); }); + + describe("searchUserDirectory", () => { + let driver: WidgetDriver; + + beforeEach(() => { + driver = mkDefaultDriver(); + }); + + it("searches for users in the user directory", async () => { + client.searchUserDirectory.mockResolvedValue({ + limited: false, + results: [{ user_id: "@user", display_name: "Name", avatar_url: "mxc://" }], + }); + + await expect(driver.searchUserDirectory("foo")).resolves.toEqual({ + limited: false, + results: [{ userId: "@user", displayName: "Name", avatarUrl: "mxc://" }], + }); + + expect(client.searchUserDirectory).toHaveBeenCalledWith({ term: "foo", limit: undefined }); + }); + + it("searches for users with a custom limit", async () => { + client.searchUserDirectory.mockResolvedValue({ + limited: true, + results: [], + }); + + await expect(driver.searchUserDirectory("foo", 25)).resolves.toEqual({ + limited: true, + results: [], + }); + + expect(client.searchUserDirectory).toHaveBeenCalledWith({ term: "foo", limit: 25 }); + }); + }); }); diff --git a/test/test-utils/test-utils.ts b/test/test-utils/test-utils.ts index 05e86a3b8f4..add949b12dc 100644 --- a/test/test-utils/test-utils.ts +++ b/test/test-utils/test-utils.ts @@ -231,6 +231,8 @@ export function createTestClient(): MatrixClient { room_id: roomId, }); }), + + searchUserDirectory: jest.fn().mockResolvedValue({ limited: false, results: [] }), } as unknown as MatrixClient; client.reEmitter = new ReEmitter(client); diff --git a/yarn.lock b/yarn.lock index dfd1abd0b18..ca1ba5485b3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6510,15 +6510,7 @@ matrix-web-i18n@^1.3.0: "@babel/traverse" "^7.18.5" walk "^2.3.15" -matrix-widget-api@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/matrix-widget-api/-/matrix-widget-api-1.1.1.tgz#d3fec45033d0cbc14387a38ba92dac4dbb1be962" - integrity sha512-gNSgmgSwvOsOcWK9k2+tOhEMYBiIMwX95vMZu0JqY7apkM02xrOzUBuPRProzN8CnbIALH7e3GAhatF6QCNvtA== - dependencies: - "@types/events" "^3.0.0" - events "^3.2.0" - -matrix-widget-api@^1.3.1: +matrix-widget-api@^1.0.0, matrix-widget-api@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/matrix-widget-api/-/matrix-widget-api-1.3.1.tgz#e38f404c76bb15c113909505c1c1a5b4d781c2f5" integrity sha512-+rN6vGvnXm+fn0uq9r2KWSL/aPtehD6ObC50jYmUcEfgo8CUpf9eUurmjbRlwZkWq3XHXFuKQBUCI9UzqWg37Q==