mhsf-dev/src/components/FavoritesView.tsx

117 lines
3.6 KiB
TypeScript
Raw Normal View History

2024-07-23 18:49:21 -05:00
"use client";
import { useState } from "react";
2024-07-23 18:49:21 -05:00
import { Spinner } from "./ui/spinner";
import { Card, CardHeader, CardTitle } from "./ui/card";
import { ServerResponse } from "@/lib/types/mh-server";
2024-07-23 18:49:21 -05:00
import { useEffectOnce } from "@/lib/useEffectOnce";
import { Button } from "./ui/button";
2024-08-03 09:51:45 -05:00
import { Copy, Layers, XIcon } from "lucide-react";
2024-07-23 18:49:21 -05:00
import toast from "react-hot-toast";
import { Tooltip, TooltipContent, TooltipTrigger } from "./ui/tooltip";
2024-08-03 09:51:45 -05:00
import { getAccountFavorites } from "@/lib/api";
import { useRouter } from "@/lib/useRouter";
2024-07-23 18:49:21 -05:00
export default function FavoritesView() {
const [apiFavorites, setApiFavorites] = useState<any>([]);
const [loading, setLoading] = useState(true);
const router = useRouter();
2024-07-23 18:49:21 -05:00
useEffectOnce(() => {
2024-08-03 09:51:45 -05:00
getAccountFavorites().then((d) => {
let num = 0;
d.forEach((a: any, i: number) => {
fetch("https://api.minehut.com/server/" + a + "?byName=true").then(
(b) =>
b.json().then((c) => {
num++;
var apiClone = apiFavorites;
apiClone.push(c.server);
setApiFavorites(apiClone);
if (num == d.length) {
setLoading(false);
}
})
);
2024-07-23 18:49:21 -05:00
});
2024-08-03 09:51:45 -05:00
if (d.length == 0) setLoading(false);
2024-07-23 18:49:21 -05:00
});
});
if (loading) {
return (
<>
2024-08-08 18:02:46 -05:00
<Spinner className="flex items-center" />
2024-07-23 18:49:21 -05:00
<br />
</>
);
}
return (
<>
2024-07-26 00:46:53 -05:00
{apiFavorites.length == 0 && (
<div className="flex items-center justify-center">
<XIcon />
Your favorites are empty. Maybe favorite a server!
</div>
)}
2024-08-08 18:02:46 -05:00
<div className="grid sm:grid-cols-4 gap-4">
2024-07-23 18:49:21 -05:00
{apiFavorites.map((server: ServerResponse) => (
<Card key={server.name}>
<CardHeader>
<CardTitle>{server.name}</CardTitle>
<div>
<Button
size="icon"
variant="secondary"
2024-08-08 18:02:46 -05:00
className="min-w-[128px] max-w-[328px] mb-2 h-[32px] max-md:hidden"
2024-07-23 18:49:21 -05:00
onClick={() => {
2024-07-23 22:07:54 -05:00
navigator.clipboard.writeText(
2024-07-26 15:40:13 -05:00
server.name + ".mshf.minehut.gg"
2024-07-23 22:07:54 -05:00
);
2024-07-23 18:49:21 -05:00
toast.success("Copied IP to clipboard");
}}
>
<Copy size={18} />
<code className="ml-2">{server.name}</code>
</Button>
<Tooltip>
<TooltipTrigger>
<Button
size="icon"
variant="secondary"
2024-08-08 18:02:46 -05:00
className="w-[32px] h-[32px] mb-2 ml-2 max-md:hidden"
2024-07-23 18:49:21 -05:00
onClick={() => {
2024-08-03 09:51:45 -05:00
router.push("/server/" + server.name);
2024-07-23 18:49:21 -05:00
}}
>
<Layers size={18} />
</Button>
</TooltipTrigger>
<TooltipContent>
Open up the server page to see more information about the
server
</TooltipContent>
</Tooltip>
</div>
<code className="text-[14px]">
{convert(server.joins)} total joins {" "}
{server.online ? "Online" : "Offline"}
</code>
</CardHeader>
</Card>
))}
</div>
</>
);
}
function convert(value: number) {
2024-07-26 15:40:13 -05:00
var result: string = value.toString();
2024-07-23 18:49:21 -05:00
if (value >= 1000000) {
result = Math.floor(value / 1000000) + "m";
} else if (value >= 1000) {
result = Math.floor(value / 1000) + "k";
}
return result;
}