From e1b1fb87754275c115f12bfd930324f8a345538b Mon Sep 17 00:00:00 2001
From: xaralis <filip.varecha@fragaria.cz>
Date: Sun, 27 Dec 2020 22:06:33 +0100
Subject: [PATCH] feat: do not allow jitsi popup to be fully dimissed

---
 src/containers/JitsiInviteCard.jsx | 62 ++++++++++++++++++++++++++----
 src/pages/Home.jsx                 |  7 +---
 src/ws/handlers/index.js           |  7 +++-
 src/ws/handlers/users.js           | 10 +++++
 typings/cf2021.d.ts                |  2 +-
 5 files changed, 72 insertions(+), 16 deletions(-)

diff --git a/src/containers/JitsiInviteCard.jsx b/src/containers/JitsiInviteCard.jsx
index 5f480dd..2261334 100644
--- a/src/containers/JitsiInviteCard.jsx
+++ b/src/containers/JitsiInviteCard.jsx
@@ -1,37 +1,83 @@
 import React from "react";
 
+import { loadMe } from "actions/users";
 import Button from "components/Button";
-import { Card, CardBody } from "components/cards";
+import { CardBody } from "components/cards";
+import ErrorMessage from "components/ErrorMessage";
+import { useActionState } from "hooks";
 import { AuthStore } from "stores";
 
 const JitsiInviteCard = () => {
-  const { showJitsiInvitePopup } = AuthStore.useState();
+  const { showJitsiInvitePopup, jitsiPopupDimissed } = AuthStore.useState();
+  const [loading, errorMessage] = useActionState(loadMe);
+
+  const openJitsiWindow = async () => {
+    const result = await loadMe.run();
+
+    if (!result.error) {
+      window.open(result.payload.jitsi_url);
+    }
+
+    AuthStore.update((state) => {
+      state.jitsiPopupDimissed = true;
+    });
+  };
+
+  const dismissPopup = () => {
+    AuthStore.update((state) => {
+      state.jitsiPopupDimissed = true;
+    });
+  };
 
   if (!showJitsiInvitePopup) {
     return null;
   }
 
+  if (jitsiPopupDimissed) {
+    return (
+      <Button
+        color="violet-500"
+        className="btn--fullwidth"
+        onClick={openJitsiWindow}
+        loading={loading}
+        icon="ico--jitsi"
+      >
+        Připojit se k Jitsi
+      </Button>
+    );
+  }
+
   return (
-    <Card className="lg:card bg-violet-300 relative" elevation={16}>
+    <div className="lg:card lg:elevation-16 bg-violet-300 relative container-padding--zero md:container-padding--auto">
       <i className="ico--jitsi text-9xl mr-2 text-violet-500 absolute right-0 top-0 opacity-25 z-0" />
-      <CardBody className="text-white relative z-10">
+      <CardBody className="p-4 lg:p-8 text-white relative z-10">
         <div className="flex items-center justify-between mb-4">
           <h2 className="head-heavy-xs">
             <span>Pozvánka do Jitsi</span>
           </h2>
-          <button type="button">
+          <button type="button" onClick={dismissPopup}>
             <i className="ico--cross"></i>
           </button>
         </div>
+        {errorMessage && (
+          <ErrorMessage>
+            Při načítání URL Jitsi kanálu došlo k problému: {errorMessage}.
+          </ErrorMessage>
+        )}
         <p className="leading-snug text-sm mb-4">
           Někdo tě pozval do <strong>chráněného Jitsi kanálu</strong>{" "}
           celeostátního fóra. Ke kanálu se připojíš kliknutím na tlačítko níže.
         </p>
-        <Button color="violet-500" className="btn--fullwidth">
-          Otevřít Jitsi kanál
+        <Button
+          color="violet-500"
+          className="btn--fullwidth"
+          onClick={openJitsiWindow}
+          loading={loading}
+        >
+          Připojit se k Jitsi
         </Button>
       </CardBody>
-    </Card>
+    </div>
   );
 };
 
diff --git a/src/pages/Home.jsx b/src/pages/Home.jsx
index 9c0607f..82e9af3 100644
--- a/src/pages/Home.jsx
+++ b/src/pages/Home.jsx
@@ -160,11 +160,7 @@ const Home = () => {
             Bod č. {programEntry.number}: {programEntry.title}
           </h1>
           {displayActions && (
-            <DropdownMenu
-              right
-              triggerSize="lg"
-              className="pl-4 pt-1 lg:pt-5"
-            >
+            <DropdownMenu right triggerSize="lg" className="pl-4 pt-1 lg:pt-5">
               <DropdownMenuItem
                 onClick={() => setShowProgramEditModal(true)}
                 icon="ico--pencil"
@@ -201,7 +197,6 @@ const Home = () => {
           )}
         </div>
         <section className="cf2021__video">
-
           <div className="container-padding--zero md:container-padding--auto">
             {streamUrl && (
               <div className="iframe-container">
diff --git a/src/ws/handlers/index.js b/src/ws/handlers/index.js
index fb68618..485b053 100644
--- a/src/ws/handlers/index.js
+++ b/src/ws/handlers/index.js
@@ -11,7 +11,11 @@ import {
   handlePostRanked,
 } from "./posts";
 import { handleProgramEntryChanged } from "./program";
-import { handleUserBanned, handleUserUnbanned } from "./users";
+import {
+  handleUserBanned,
+  handleUserStatus,
+  handleUserUnbanned,
+} from "./users";
 
 export const handlers = {
   announcement_changed: handleAnnouncementChanged,
@@ -24,5 +28,6 @@ export const handlers = {
   program_entry_changed: handleProgramEntryChanged,
   user_banned: handleUserBanned,
   user_unbanned: handleUserUnbanned,
+  user_status: handleUserStatus,
   online_users_updated: handleOnlineUsersUpdated,
 };
diff --git a/src/ws/handlers/users.js b/src/ws/handlers/users.js
index 85d8ca2..5864a73 100644
--- a/src/ws/handlers/users.js
+++ b/src/ws/handlers/users.js
@@ -1,3 +1,5 @@
+import has from "lodash/has";
+
 import { AuthStore, PostStore } from "stores";
 
 export const handleUserBanned = (payload) => {
@@ -31,3 +33,11 @@ export const handleUserUnbanned = (payload) => {
     });
   });
 };
+
+export const handleUserStatus = (payload) => {
+  AuthStore.update((state) => {
+    if (has(payload, "jitsi_allowed")) {
+      state.showJitsiInvitePopup = payload.jitsi_allowed;
+    }
+  });
+};
diff --git a/typings/cf2021.d.ts b/typings/cf2021.d.ts
index 4572332..135e0bc 100644
--- a/typings/cf2021.d.ts
+++ b/typings/cf2021.d.ts
@@ -50,7 +50,7 @@ declare namespace CF2021 {
       secret?: string;
     };
     showJitsiInvitePopup: boolean;
-    jitsiInviteToken?: string;
+    jitsiPopupDimissed: boolean;
   }
 
   export type AuthStorePayload =
-- 
GitLab