]> Untitled Git - lemmy-ui.git/commitdiff
Integrating resolve_user into search. (#377)
authorDessalines <dessalines@users.noreply.github.com>
Mon, 23 Aug 2021 20:18:11 +0000 (16:18 -0400)
committerGitHub <noreply@github.com>
Mon, 23 Aug 2021 20:18:11 +0000 (16:18 -0400)
* Integrating resolve_user into search.

* Upgrading lemmy-js-client.

package.json
src/shared/components/search.tsx
yarn.lock

index 7d3ef6d4609621b891cb26544ab0b43abb7f7ee6..026c5822264978c1b2dc003905e7aa6a760337d1 100644 (file)
@@ -69,7 +69,7 @@
     "husky": "^7.0.1",
     "import-sort-style-module": "^6.0.0",
     "iso-639-1": "^2.1.9",
-    "lemmy-js-client": "0.11.4-rc.14",
+    "lemmy-js-client": "0.11.4-rc.16",
     "lint-staged": "^11.0.1",
     "mini-css-extract-plugin": "^2.1.0",
     "node-fetch": "^2.6.1",
index 61c3000edd249552b1681944d6996b05eb77457b..4a1c8521559fd040b6b41626003fd3ece82d91cc 100644 (file)
@@ -11,6 +11,8 @@ import {
   PersonViewSafe,
   PostResponse,
   PostView,
+  ResolveObject,
+  ResolveObjectResponse,
   Search as SearchForm,
   SearchResponse,
   SearchType,
@@ -91,6 +93,7 @@ interface SearchState {
   loading: boolean;
   site: Site;
   searchText: string;
+  resolveObjectResponse: ResolveObjectResponse;
 }
 
 interface UrlParams {
@@ -103,6 +106,12 @@ interface UrlParams {
   page?: number;
 }
 
+interface Combined {
+  type_: string;
+  data: CommentView | PostView | CommunityView | PersonViewSafe;
+  published: string;
+}
+
 export class Search extends Component<any, SearchState> {
   private isoData = setIsoData(this.context);
   private communityChoices: any;
@@ -128,6 +137,12 @@ export class Search extends Component<any, SearchState> {
       communities: [],
       users: [],
     },
+    resolveObjectResponse: {
+      comment: null,
+      post: null,
+      community: null,
+      person: null,
+    },
     loading: true,
     site: this.isoData.site_res.site_view.site,
     communities: [],
@@ -187,6 +202,7 @@ export class Search extends Component<any, SearchState> {
       }
       if (this.state.q != "") {
         this.state.searchResponse = this.isoData.routeData[2];
+        this.state.resolveObjectResponse = this.isoData.routeData[3];
         this.state.loading = false;
       } else {
         this.search();
@@ -283,8 +299,14 @@ export class Search extends Component<any, SearchState> {
     }
     setOptionalAuth(form, req.auth);
 
+    let resolveObjectForm: ResolveObject = {
+      q: this.getSearchQueryFromProps(pathSplit[3]),
+    };
+    setOptionalAuth(resolveObjectForm, req.auth);
+
     if (form.q != "") {
       promises.push(req.client.search(form));
+      promises.push(req.client.resolveObject(resolveObjectForm));
     }
 
     return promises;
@@ -402,33 +424,78 @@ export class Search extends Component<any, SearchState> {
     );
   }
 
-  all() {
-    let combined: {
-      type_: string;
-      data: CommentView | PostView | CommunityView | PersonViewSafe;
-      published: string;
-    }[] = [];
-    let comments = this.state.searchResponse.comments.map(e => {
-      return { type_: "comments", data: e, published: e.comment.published };
-    });
-    let posts = this.state.searchResponse.posts.map(e => {
-      return { type_: "posts", data: e, published: e.post.published };
-    });
-    let communities = this.state.searchResponse.communities.map(e => {
-      return {
-        type_: "communities",
-        data: e,
-        published: e.community.published,
-      };
-    });
-    let users = this.state.searchResponse.users.map(e => {
-      return { type_: "users", data: e, published: e.person.published };
-    });
+  postViewToCombined(postView: PostView): Combined {
+    return {
+      type_: "posts",
+      data: postView,
+      published: postView.post.published,
+    };
+  }
+
+  commentViewToCombined(commentView: CommentView): Combined {
+    return {
+      type_: "comments",
+      data: commentView,
+      published: commentView.comment.published,
+    };
+  }
+
+  communityViewToCombined(communityView: CommunityView): Combined {
+    return {
+      type_: "communities",
+      data: communityView,
+      published: communityView.community.published,
+    };
+  }
+
+  personViewSafeToCombined(personViewSafe: PersonViewSafe): Combined {
+    return {
+      type_: "users",
+      data: personViewSafe,
+      published: personViewSafe.person.published,
+    };
+  }
 
-    combined.push(...comments);
-    combined.push(...posts);
-    combined.push(...communities);
-    combined.push(...users);
+  buildCombined(): Combined[] {
+    let combined: Combined[] = [];
+
+    // Push the possible resolve / federated objects first
+    let resolveComment = this.state.resolveObjectResponse.comment;
+    if (resolveComment) {
+      combined.push(this.commentViewToCombined(resolveComment));
+    }
+    let resolvePost = this.state.resolveObjectResponse.post;
+    if (resolvePost) {
+      combined.push(this.postViewToCombined(resolvePost));
+    }
+    let resolveCommunity = this.state.resolveObjectResponse.community;
+    if (resolveCommunity) {
+      combined.push(this.communityViewToCombined(resolveCommunity));
+    }
+    let resolveUser = this.state.resolveObjectResponse.person;
+    if (resolveUser) {
+      combined.push(this.personViewSafeToCombined(resolveUser));
+    }
+
+    // Push the search results
+    combined.push(
+      ...this.state.searchResponse.comments.map(e =>
+        this.commentViewToCombined(e)
+      )
+    );
+    combined.push(
+      ...this.state.searchResponse.posts.map(e => this.postViewToCombined(e))
+    );
+    combined.push(
+      ...this.state.searchResponse.communities.map(e =>
+        this.communityViewToCombined(e)
+      )
+    );
+    combined.push(
+      ...this.state.searchResponse.users.map(e =>
+        this.personViewSafeToCombined(e)
+      )
+    );
 
     // Sort it
     if (this.state.sort == SortType.New) {
@@ -444,7 +511,11 @@ export class Search extends Component<any, SearchState> {
             (a.data as PersonViewSafe).counts.comment_score)
       );
     }
+    return combined;
+  }
 
+  all() {
+    let combined = this.buildCombined();
     return (
       <div>
         {combined.map(i => (
@@ -482,9 +553,18 @@ export class Search extends Component<any, SearchState> {
   }
 
   comments() {
+    let comments: CommentView[] = [];
+
+    let resolveComment = this.state.resolveObjectResponse.comment;
+    if (resolveComment) {
+      comments.push(resolveComment);
+    }
+
+    comments.push(...this.state.searchResponse.comments);
+
     return (
       <CommentNodes
-        nodes={commentsToFlatNodes(this.state.searchResponse.comments)}
+        nodes={commentsToFlatNodes(comments)}
         locked
         noIndent
         enableDownvotes={this.state.site.enable_downvotes}
@@ -493,9 +573,18 @@ export class Search extends Component<any, SearchState> {
   }
 
   posts() {
+    let posts: PostView[] = [];
+
+    let resolvePost = this.state.resolveObjectResponse.post;
+    if (resolvePost) {
+      posts.push(resolvePost);
+    }
+
+    posts.push(...this.state.searchResponse.posts);
+
     return (
       <>
-        {this.state.searchResponse.posts.map(post => (
+        {posts.map(post => (
           <div class="row">
             <div class="col-12">
               <PostListing
@@ -512,9 +601,17 @@ export class Search extends Component<any, SearchState> {
   }
 
   communities() {
+    let communities: CommunityView[] = [];
+
+    let resolveCommunity = this.state.resolveObjectResponse.community;
+    if (resolveCommunity) {
+      communities.push(resolveCommunity);
+    }
+
+    communities.push(...this.state.searchResponse.communities);
     return (
       <>
-        {this.state.searchResponse.communities.map(community => (
+        {communities.map(community => (
           <div class="row">
             <div class="col-12">{this.communityListing(community)}</div>
           </div>
@@ -523,6 +620,26 @@ export class Search extends Component<any, SearchState> {
     );
   }
 
+  users() {
+    let users: PersonViewSafe[] = [];
+
+    let resolveUser = this.state.resolveObjectResponse.person;
+    if (resolveUser) {
+      users.push(resolveUser);
+    }
+
+    users.push(...this.state.searchResponse.users);
+    return (
+      <>
+        {users.map(user => (
+          <div class="row">
+            <div class="col-12">{this.userListing(user)}</div>
+          </div>
+        ))}
+      </>
+    );
+  }
+
   communityListing(community_view: CommunityView) {
     return (
       <>
@@ -549,18 +666,6 @@ export class Search extends Component<any, SearchState> {
     ];
   }
 
-  users() {
-    return (
-      <>
-        {this.state.searchResponse.users.map(user => (
-          <div class="row">
-            <div class="col-12">{this.userListing(user)}</div>
-          </div>
-        ))}
-      </>
-    );
-  }
-
   communityFilter() {
     return (
       <div class="form-group col-sm-6">
@@ -609,11 +714,17 @@ export class Search extends Component<any, SearchState> {
 
   resultsCount(): number {
     let res = this.state.searchResponse;
+    let resObj = this.state.resolveObjectResponse;
+    let resObjCount =
+      resObj.post || resObj.person || resObj.community || resObj.comment
+        ? 1
+        : 0;
     return (
       res.posts.length +
       res.comments.length +
       res.communities.length +
-      res.users.length
+      res.users.length +
+      resObjCount
     );
   }
 
@@ -638,8 +749,14 @@ export class Search extends Component<any, SearchState> {
       form.creator_id = this.state.creatorId;
     }
 
+    let resolveObjectForm: ResolveObject = {
+      q: this.state.q,
+      auth: authField(false),
+    };
+
     if (this.state.q != "") {
       WebSocketService.Instance.send(wsClient.search(form));
+      WebSocketService.Instance.send(wsClient.resolveObject(resolveObjectForm));
     }
   }
 
@@ -769,8 +886,19 @@ export class Search extends Component<any, SearchState> {
     console.log(msg);
     let op = wsUserOp(msg);
     if (msg.error) {
-      toast(i18n.t(msg.error), "danger");
-      return;
+      if (msg.error != "couldnt_find_object") {
+        toast(i18n.t(msg.error), "danger");
+        return;
+      } else {
+        this.setState({
+          resolveObjectResponse: {
+            comment: null,
+            community: null,
+            person: null,
+            post: null,
+          },
+        });
+      }
     } else if (op == UserOperation.Search) {
       let data = wsJsonToRes<SearchResponse>(msg).data;
       this.state.searchResponse = data;
@@ -794,6 +922,10 @@ export class Search extends Component<any, SearchState> {
       this.state.communities = data.communities;
       this.setState(this.state);
       this.setupCommunityFilter();
+    } else if (op == UserOperation.ResolveObject) {
+      let data = wsJsonToRes<ResolveObjectResponse>(msg).data;
+      this.state.resolveObjectResponse = data;
+      this.setState(this.state);
     }
   }
 }
index 92d963edb1f57b537286721d885b15d9e6d83803..d86a77e3f33c7f5f4ee50766cb99d4c63439b2c0 100644 (file)
--- a/yarn.lock
+++ b/yarn.lock
@@ -4664,10 +4664,10 @@ lcid@^1.0.0:
   dependencies:
     invert-kv "^1.0.0"
 
-lemmy-js-client@0.11.4-rc.14:
-  version "0.11.4-rc.14"
-  resolved "https://registry.yarnpkg.com/lemmy-js-client/-/lemmy-js-client-0.11.4-rc.14.tgz#dcac5b8dc78c3b04e6b3630ff9351a94aa73e109"
-  integrity sha512-R8M+myyriNQljQlTweVqtUKGBpgmaM7RI4ebYb7N7sYr5Bk5Ip6v2qTNvKAV6BlsDOCTWANOonfeoz/cIerLEg==
+lemmy-js-client@0.11.4-rc.16:
+  version "0.11.4-rc.16"
+  resolved "https://registry.yarnpkg.com/lemmy-js-client/-/lemmy-js-client-0.11.4-rc.16.tgz#bd8a4a714d5dcfbd9640bc419fd412443be6ab44"
+  integrity sha512-EQ2tB6AqSZG9UDcKf6bmCzNe92ZwTXhddJfCK2yGZ5PdHADkVrQf05yEuMZjYt3cooSHjupj6hWO9InnPMIUfA==
 
 levn@^0.4.1:
   version "0.4.1"