Skip to content
This repository has been archived by the owner on Sep 11, 2024. It is now read-only.

Commit

Permalink
Show error when searching public rooms fails (#11378)
Browse files Browse the repository at this point in the history
* Show error when searching public rooms fails

* Fix types

* Improve test coverage

* Improve coverage
  • Loading branch information
t3chguy authored Aug 8, 2023
1 parent b5bfc5b commit 2b17fc3
Show file tree
Hide file tree
Showing 4 changed files with 63 additions and 13 deletions.
29 changes: 19 additions & 10 deletions src/components/views/dialogs/spotlight/SpotlightDialog.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -311,6 +311,7 @@ const SpotlightDialog: React.FC<IProps> = ({ initialText = "", initialFilter = n
config,
setConfig,
search: searchPublicRooms,
error: publicRoomsError,
} = usePublicRoomDirectory();
const [showRooms, setShowRooms] = useState(true);
const [showSpaces, setShowSpaces] = useState(false);
Expand Down Expand Up @@ -757,6 +758,23 @@ const SpotlightDialog: React.FC<IProps> = ({ initialText = "", initialFilter = n

let publicRoomsSection: JSX.Element | undefined;
if (filter === Filter.PublicRooms) {
let content: JSX.Element | JSX.Element[];
if (!showRooms && !showSpaces) {
content = (
<div className="mx_SpotlightDialog_otherSearches_messageSearchText">
{_t("You cannot search for rooms that are neither a room nor a space")}
</div>
);
} else if (publicRoomsError) {
content = (
<div className="mx_SpotlightDialog_otherSearches_messageSearchText">
{_t("Failed to query public rooms")}
</div>
);
} else {
content = results[Section.PublicRooms].slice(0, SECTION_LIMIT).map(resultMapper);
}

publicRoomsSection = (
<div
className="mx_SpotlightDialog_section mx_SpotlightDialog_results"
Expand All @@ -783,16 +801,7 @@ const SpotlightDialog: React.FC<IProps> = ({ initialText = "", initialFilter = n
<NetworkDropdown protocols={protocols} config={config ?? null} setConfig={setConfig} />
</div>
</div>
<div>
{" "}
{showRooms || showSpaces ? (
results[Section.PublicRooms].slice(0, SECTION_LIMIT).map(resultMapper)
) : (
<div className="mx_SpotlightDialog_otherSearches_messageSearchText">
{_t("You cannot search for rooms that are neither a room nor a space")}
</div>
)}{" "}
</div>
<div>{content}</div>
</div>
);
}
Expand Down
7 changes: 6 additions & 1 deletion src/hooks/usePublicRoomDirectory.ts
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ export const usePublicRoomDirectory = (): {
config?: IPublicRoomDirectoryConfig | null;
setConfig(config: IPublicRoomDirectoryConfig | null): void;
search(opts: IPublicRoomsOpts): Promise<boolean>;
error?: Error | true; // true if an unknown error is encountered
} => {
const [publicRooms, setPublicRooms] = useState<IPublicRoomsChunkRoom[]>([]);

Expand All @@ -60,6 +61,7 @@ export const usePublicRoomDirectory = (): {

const [ready, setReady] = useState(false);
const [loading, setLoading] = useState(false);
const [error, setError] = useState<Error | true | undefined>();

const [updateQuery, updateResult] = useLatestResult<IRoomDirectoryOptions, IPublicRoomsChunkRoom[]>(setPublicRooms);

Expand Down Expand Up @@ -112,12 +114,14 @@ export const usePublicRoomDirectory = (): {
}

updateQuery(opts);
setLoading(true);
setError(undefined);
try {
setLoading(true);
const { chunk } = await MatrixClientPeg.safeGet().publicRooms(opts);
updateResult(opts, showNsfwPublicRooms ? chunk : chunk.filter(cheapNsfwFilter));
return true;
} catch (e) {
setError(e instanceof Error ? e : true);
console.error("Could not fetch public rooms for params", opts, e);
updateResult(opts, []);
return false;
Expand Down Expand Up @@ -183,5 +187,6 @@ export const usePublicRoomDirectory = (): {
config,
search,
setConfig,
error,
} as const;
};
3 changes: 2 additions & 1 deletion src/i18n/strings/en_EN.json
Original file line number Diff line number Diff line change
Expand Up @@ -3138,9 +3138,10 @@
"Search for": "Search for",
"View": "View",
"Spaces you're in": "Spaces you're in",
"You cannot search for rooms that are neither a room nor a space": "You cannot search for rooms that are neither a room nor a space",
"Failed to query public rooms": "Failed to query public rooms",
"Show rooms": "Show rooms",
"Show spaces": "Show spaces",
"You cannot search for rooms that are neither a room nor a space": "You cannot search for rooms that are neither a room nor a space",
"Other rooms in %(spaceName)s": "Other rooms in %(spaceName)s",
"Join %(roomAddress)s": "Join %(roomAddress)s",
"Some results may be hidden for privacy": "Some results may be hidden for privacy",
Expand Down
37 changes: 36 additions & 1 deletion test/components/views/dialogs/SpotlightDialog-test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,14 @@ limitations under the License.

import React from "react";
import { mocked } from "jest-mock";
import { IProtocol, IPublicRoomsChunkRoom, MatrixClient, Room, RoomMember } from "matrix-js-sdk/src/matrix";
import {
ConnectionError,
IProtocol,
IPublicRoomsChunkRoom,
MatrixClient,
Room,
RoomMember,
} from "matrix-js-sdk/src/matrix";
import sanitizeHtml from "sanitize-html";
import { fireEvent, render, screen } from "@testing-library/react";

Expand Down Expand Up @@ -495,4 +502,32 @@ describe("Spotlight Dialog", () => {
expect(screen.getByText(potatoRoom.name!)).toBeInTheDocument();
});
});

it("should show error if /publicRooms API failed", async () => {
mocked(mockedClient.publicRooms).mockRejectedValue(new ConnectionError("Failed to fetch"));
render(<SpotlightDialog initialFilter={Filter.PublicRooms} onFinished={() => null} />);

jest.advanceTimersByTime(200);
await flushPromisesWithFakeTimers();

expect(screen.getByText("Failed to query public rooms")).toBeInTheDocument();
});

it("should show error both 'Show rooms' and 'Show spaces' are unchecked", async () => {
jest.spyOn(SettingsStore, "getValue").mockImplementation((settingName, roomId, excludeDefault) => {
if (settingName === "feature_exploring_public_spaces") {
return true;
} else {
return []; // SpotlightSearch.recentSearches
}
});
render(<SpotlightDialog initialFilter={Filter.PublicRooms} onFinished={() => null} />);

jest.advanceTimersByTime(200);
await flushPromisesWithFakeTimers();

fireEvent.click(screen.getByText("Show rooms"));

expect(screen.getByText("You cannot search for rooms that are neither a room nor a space")).toBeInTheDocument();
});
});

0 comments on commit 2b17fc3

Please sign in to comment.