From 7af9d9c37c97bf2552e1837f6d5e0f00bbcbb9a1 Mon Sep 17 00:00:00 2001
From: Dima Rifai <dima.rifai@gmail.com>
Date: Thu, 28 Nov 2024 14:58:28 +0200
Subject: [PATCH] Issue #382 - Add rank, URL, and show if witness is
 deactivated

---
 components/account/AccountMainCard.tsx | 115 ++++++++++++++++++++-----
 1 file changed, 93 insertions(+), 22 deletions(-)

diff --git a/components/account/AccountMainCard.tsx b/components/account/AccountMainCard.tsx
index 0dbd9b4f..60ca4e34 100644
--- a/components/account/AccountMainCard.tsx
+++ b/components/account/AccountMainCard.tsx
@@ -1,6 +1,7 @@
 import { Loader2 } from "lucide-react";
 import Image from "next/image";
-
+import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
+import { faLink, faStar } from "@fortawesome/free-solid-svg-icons";
 import Explorer from "@/types/Explorer";
 import { formatAndDelocalizeTime } from "@/utils/TimeUtils";
 import { getHiveAvatarUrl } from "@/utils/HiveBlogUtils";
@@ -8,6 +9,15 @@ import useManabars from "@/hooks/api/accountPage/useManabars";
 import { Card, CardContent, CardFooter, CardHeader } from "../ui/card";
 import { Toggle } from "../ui/toggle";
 import { Progress } from "@/components/ui/progress";
+import useWitnessDetails from "@/hooks/api/common/useWitnessDetails";
+import { config } from "@/Config";
+import { cn } from "@/lib/utils";
+import {
+  TooltipProvider,
+  Tooltip,
+  TooltipTrigger,
+  TooltipContent,
+} from "../ui/tooltip";
 
 interface AccountMainCardProps {
   accountDetails: Explorer.FormattedAccountDetails;
@@ -31,35 +41,96 @@ const AccountMainCard: React.FC<AccountMainCardProps> = ({
   changeLiveRefresh,
 }) => {
   const { manabarsData } = useManabars(accountName, liveDataEnabled);
+  const { witnessDetails } = useWitnessDetails(
+    accountName,
+    accountDetails.is_witness
+  );
+  const isWitnessActive =
+    witnessDetails?.witness.signing_key !== config.inactiveWitnessKey;
 
   return (
     <Card data-testid="account-details">
       <CardHeader>
-        <div className="flex justify-between bg-theme dark:bg-theme text-explorer-orange text-2xl my-4">
-          {accountDetails.is_witness ? (
-            <div data-testid="account-name">
-              {accountDetails.name} <span className="text-sm">(witness)</span>
-            </div>
-          ) : (
-            <div>{accountDetails.name}</div>
-          )}
-          <span>
+        <div className="flex flex-wrap items-center justify-between gap-4 bg-theme dark:bg-theme">
+          {/* Avatar and Name */}
+          <div className="flex items-center gap-4">
             <Image
               className="rounded-full border-2 border-explorer-orange"
               src={getHiveAvatarUrl(accountName)}
               alt="avatar"
-              width={50}
-              height={50}
+              width={60}
+              height={60}
               data-testid="user-avatar"
             />
-          </span>
+            <div>
+              <h2 className="text-lg font-semibold text-gray-800 dark:text-white">
+                {accountDetails.name}
+              </h2>
+              {accountDetails.is_witness && (
+                <div className="flex items-center gap-2 text-sm text-gray-500 dark:text-gray-400">
+                  <span
+                    className={cn({
+                      "line-through text-red-500": !isWitnessActive,
+                    })}
+                  >
+                    Witness
+                  </span>
+                  {witnessDetails?.witness.rank && isWitnessActive && (
+                    <TooltipProvider>
+                      <Tooltip>
+                        <TooltipTrigger asChild>
+                          <span className="flex items-center gap-1">
+                            <FontAwesomeIcon
+                              icon={faStar}
+                              data-testid="witness-rank-icon"
+                            />
+                            <span>{witnessDetails.witness.rank}</span>
+                          </span>
+                        </TooltipTrigger>
+                        <TooltipContent>
+                          <span className="text-xs">
+                            Witness Rank: {witnessDetails.witness.rank}
+                          </span>
+                        </TooltipContent>
+                      </Tooltip>
+                    </TooltipProvider>
+                  )}
+                  {witnessDetails?.witness.url && isWitnessActive && (
+                    <TooltipProvider>
+                      <Tooltip>
+                        <TooltipTrigger asChild>
+                          <a
+                            href={witnessDetails.witness.url}
+                            target="_blank"
+                            rel="noopener noreferrer"
+                          >
+                            <FontAwesomeIcon
+                              icon={faLink}
+                              data-testid="witness-url-icon"
+                            />
+                          </a>
+                        </TooltipTrigger>
+                        <TooltipContent>
+                          <span className="text-xs">Witness Link</span>
+                        </TooltipContent>
+                      </Tooltip>
+                    </TooltipProvider>
+                  )}
+                </div>
+              )}
+            </div>
+          </div>
+
+          {/* Live Data Toggle */}
+          <div className="w-full sm:w-auto mt-4 sm:mt-0 top-0">
+            <Toggle
+              checked={liveDataEnabled}
+              onClick={changeLiveRefresh}
+              className="text-base"
+              leftLabel="Live Data"
+            />
+          </div>
         </div>
-        <Toggle
-          checked={liveDataEnabled}
-          onClick={changeLiveRefresh}
-          className="text-base"
-          leftLabel="Live Data"
-        />
       </CardHeader>
       <CardContent>
         {!!manabarsData ? (
@@ -114,14 +185,14 @@ const AccountMainCard: React.FC<AccountMainCardProps> = ({
           </>
         ) : (
           <div className="flex justify-center text-center items-center">
-            <Loader2 className="animate-spin mt-1h-12 w-12 ml-3 ..." />
+            <Loader2 className="animate-spin mt-1 h-12 w-12 ml-3 ..." />
           </div>
         )}
         <div className="flex justify-between p-4">
           <div className="text-center flex flex-col justify-space-between w-full gap-2">
             <span className="text">Creation Date:</span>
             <span
-              className="text"
+              className="text" 
               data-testid="creation-date"
             >
               {formatAndDelocalizeTime(accountDetails.created)}
@@ -130,7 +201,7 @@ const AccountMainCard: React.FC<AccountMainCardProps> = ({
           <div className="text-center flex flex-col justify-space-between w-full gap-2">
             <span className="text">Reputation:</span>
             <span
-              className="text"
+              className="text" 
               data-testid="creation-date"
             >
               {accountDetails.reputation}
-- 
GitLab