From e68babe38bb1face0ea8866972eb550d769bc3f7 Mon Sep 17 00:00:00 2001
From: Dessalines <dessalines@users.noreply.github.com>
Date: Fri, 29 Jul 2022 23:38:37 -0400
Subject: [PATCH] Adding block from community sidebar. Fixes #690 (#716)

* Adding block from community sidebar. Fixes #690

* Fixing lint
---
 src/shared/components/community/community.tsx | 13 ++++
 src/shared/components/community/sidebar.tsx   | 62 +++++++++++++++----
 2 files changed, 62 insertions(+), 13 deletions(-)

diff --git a/src/shared/components/community/community.tsx b/src/shared/components/community/community.tsx
index 7272811..c5afe0e 100644
--- a/src/shared/components/community/community.tsx
+++ b/src/shared/components/community/community.tsx
@@ -3,6 +3,7 @@ import { Component, linkEvent } from "inferno";
 import {
   AddModToCommunityResponse,
   BanFromCommunityResponse,
+  BlockCommunityResponse,
   BlockPersonResponse,
   CommentReportResponse,
   CommentResponse,
@@ -53,6 +54,7 @@ import {
   setupTippy,
   showLocal,
   toast,
+  updateCommunityBlock,
   updatePersonBlock,
   wsClient,
   wsSubscribe,
@@ -663,6 +665,17 @@ export class Community extends Component<any, State> {
         toast(i18n.t("purge_success"));
         this.context.router.history.push(`/`);
       }
+    } else if (op == UserOperation.BlockCommunity) {
+      let data = wsJsonToRes<BlockCommunityResponse>(
+        msg,
+        BlockCommunityResponse
+      );
+      this.state.communityRes.match({
+        some: res => (res.community_view.blocked = data.blocked),
+        none: void 0,
+      });
+      updateCommunityBlock(data);
+      this.setState(this.state);
     }
   }
 }
diff --git a/src/shared/components/community/sidebar.tsx b/src/shared/components/community/sidebar.tsx
index 109b629..775fd63 100644
--- a/src/shared/components/community/sidebar.tsx
+++ b/src/shared/components/community/sidebar.tsx
@@ -3,6 +3,7 @@ import { Component, linkEvent } from "inferno";
 import { Link } from "inferno-router";
 import {
   AddModToCommunity,
+  BlockCommunity,
   CommunityModeratorView,
   CommunityView,
   DeleteCommunity,
@@ -120,23 +121,21 @@ export class Sidebar extends Component<SidebarProps, SidebarState> {
           )}
           <span class="mr-2">{community.title}</span>
           {subscribed == SubscribedType.Subscribed && (
-            <a
+            <button
               class="btn btn-secondary btn-sm mr-2"
-              href="#"
               onClick={linkEvent(this, this.handleUnsubscribe)}
             >
               <Icon icon="check" classes="icon-inline text-success mr-1" />
               {i18n.t("joined")}
-            </a>
+            </button>
           )}
           {subscribed == SubscribedType.Pending && (
-            <a
+            <button
               class="btn btn-warning mr-2"
-              href="#"
               onClick={linkEvent(this, this.handleUnsubscribe)}
             >
               {i18n.t("subscribe_pending")}
-            </a>
+            </button>
           )}
           {community.removed && (
             <small className="mr-2 text-muted font-italic">
@@ -289,16 +288,33 @@ export class Sidebar extends Component<SidebarProps, SidebarState> {
 
   subscribe() {
     let community_view = this.props.community_view;
+    let blocked = this.props.community_view.blocked;
     return (
       <div class="mb-2">
         {community_view.subscribed == SubscribedType.NotSubscribed && (
-          <a
-            class="btn btn-secondary btn-block"
-            href="#"
-            onClick={linkEvent(this, this.handleSubscribe)}
-          >
-            {i18n.t("subscribe")}
-          </a>
+          <>
+            <button
+              class="btn btn-secondary btn-block"
+              onClick={linkEvent(this, this.handleSubscribe)}
+            >
+              {i18n.t("subscribe")}
+            </button>
+            {blocked ? (
+              <button
+                class="btn btn-danger btn-block"
+                onClick={linkEvent(this, this.handleUnblock)}
+              >
+                {i18n.t("unblock_community")}
+              </button>
+            ) : (
+              <button
+                class="btn btn-danger btn-block"
+                onClick={linkEvent(this, this.handleBlock)}
+              >
+                {i18n.t("block_community")}
+              </button>
+            )}
+          </>
         )}
       </div>
     );
@@ -641,4 +657,24 @@ export class Sidebar extends Component<SidebarProps, SidebarState> {
     i.state.purgeLoading = true;
     i.setState(i.state);
   }
+
+  handleBlock(i: Sidebar, event: any) {
+    event.preventDefault();
+    let blockCommunityForm = new BlockCommunity({
+      community_id: i.props.community_view.community.id,
+      block: true,
+      auth: auth().unwrap(),
+    });
+    WebSocketService.Instance.send(wsClient.blockCommunity(blockCommunityForm));
+  }
+
+  handleUnblock(i: Sidebar, event: any) {
+    event.preventDefault();
+    let blockCommunityForm = new BlockCommunity({
+      community_id: i.props.community_view.community.id,
+      block: false,
+      auth: auth().unwrap(),
+    });
+    WebSocketService.Instance.send(wsClient.blockCommunity(blockCommunityForm));
+  }
 }
-- 
2.44.1