From: Scott <97430840+scme0@users.noreply.github.com> Date: Thu, 29 Jun 2023 02:44:47 +0000 (+0930) Subject: Fix search page to stop `couldnt_find_object` error (#1669) X-Git-Url: http://these/git/%22https:/lemmy.ml/u/Liwott/%7B%60%24%7BrepoUrl%7D?a=commitdiff_plain;h=a077924f385cf014434fc6c32aa28f4c33e1b9c1;p=lemmy-ui.git Fix search page to stop `couldnt_find_object` error (#1669) * Add silent client and use it for resolve object * more changes * Fix more issues * make double equals a triple equals --- diff --git a/src/shared/components/search.tsx b/src/shared/components/search.tsx index b58580e..5360066 100644 --- a/src/shared/components/search.tsx +++ b/src/shared/components/search.tsx @@ -332,9 +332,7 @@ export class Search extends Component { } async componentDidMount() { - if ( - !(this.state.isIsomorphic || this.props.history.location.state?.searched) - ) { + if (!this.state.isIsomorphic) { const promises = [this.fetchCommunities()]; if (this.state.searchText) { promises.push(this.search()); @@ -432,7 +430,15 @@ export class Search extends Component { q: query, auth, }; - resolveObjectResponse = await client.resolveObject(resolveObjectForm); + resolveObjectResponse = await HttpService.silent_client.resolveObject( + resolveObjectForm + ); + + // If we return this object with a state of failed, the catch-all-handler will redirect + // to an error page, so we ignore it by covering up the error with the empty state. + if (resolveObjectResponse.state === "failed") { + resolveObjectResponse = { state: "empty" }; + } } } } @@ -950,7 +956,7 @@ export class Search extends Component { if (auth) { this.setState({ resolveObjectRes: { state: "loading" } }); this.setState({ - resolveObjectRes: await HttpService.client.resolveObject({ + resolveObjectRes: await HttpService.silent_client.resolveObject({ q, auth, }), @@ -1097,10 +1103,6 @@ export class Search extends Component { sort: sort ?? urlSort, }; - this.props.history.push(`/search${getQueryString(queryParams)}`, { - searched: true, - }); - - await this.search(); + this.props.history.push(`/search${getQueryString(queryParams)}`); } } diff --git a/src/shared/services/HttpService.ts b/src/shared/services/HttpService.ts index 361ffbd..11ec292 100644 --- a/src/shared/services/HttpService.ts +++ b/src/shared/services/HttpService.ts @@ -1,9 +1,9 @@ import { getHttpBase } from "@utils/env"; import { LemmyHttp } from "lemmy-js-client"; -import { toast } from "../../shared/toast"; +import { toast } from "../toast"; import { I18NextService } from "./I18NextService"; -type EmptyRequestState = { +export type EmptyRequestState = { state: "empty"; }; @@ -45,7 +45,7 @@ export type WrappedLemmyHttp = { class WrappedLemmyHttpClient { #client: LemmyHttp; - constructor(client: LemmyHttp) { + constructor(client: LemmyHttp, silent = false) { this.#client = client; for (const key of Object.getOwnPropertyNames( @@ -61,8 +61,10 @@ class WrappedLemmyHttpClient { state: !(res === undefined || res === null) ? "success" : "empty", }; } catch (error) { - console.error(`API error: ${error}`); - toast(I18NextService.i18n.t(error), "danger"); + if (!silent) { + console.error(`API error: ${error}`); + toast(I18NextService.i18n.t(error), "danger"); + } return { state: "failed", msg: error, @@ -74,16 +76,23 @@ class WrappedLemmyHttpClient { } } -export function wrapClient(client: LemmyHttp) { - return new WrappedLemmyHttpClient(client) as unknown as WrappedLemmyHttp; // unfortunately, this verbose cast is necessary +export function wrapClient(client: LemmyHttp, silent = false) { + // unfortunately, this verbose cast is necessary + return new WrappedLemmyHttpClient( + client, + silent + ) as unknown as WrappedLemmyHttp; } export class HttpService { static #_instance: HttpService; + #silent_client: WrappedLemmyHttp; #client: WrappedLemmyHttp; private constructor() { - this.#client = wrapClient(new LemmyHttp(getHttpBase())); + const lemmyHttp = new LemmyHttp(getHttpBase()); + this.#client = wrapClient(lemmyHttp); + this.#silent_client = wrapClient(lemmyHttp, true); } static get #Instance() { @@ -93,4 +102,8 @@ export class HttpService { public static get client() { return this.#Instance.#client; } + + public static get silent_client() { + return this.#Instance.#silent_client; + } }