diff --git a/src/app/page.tsx b/src/app/page.tsx index 255e994..6b7bf2d 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -3,7 +3,10 @@ import { Metadata } from "next"; export const metadata: Metadata = { title: "the MHSF project by dvelo", - description: `currently running in ${process.env.NEXT_PUBLIC_VERCEL_ENV} | commit (${process.env.NEXT_PUBLIC_VERCEL_GIT_COMMIT_SHA}) ${process.env.NEXT_PUBLIC_VERCEL_GIT_COMMIT_MESSAGE} by ${process.env.NEXT_PUBLIC_VERCEL_GIT_COMMIT_AUTHOR_NAME}`, + description: + process.env.NEXT_PUBLIC_VERCEL_ENV != undefined + ? `currently running in ${process.env.NEXT_PUBLIC_VERCEL_ENV} | commit (${(process.env.NEXT_PUBLIC_VERCEL_GIT_COMMIT_SHA as string).substring(0, 7)}}) "${process.env.NEXT_PUBLIC_VERCEL_GIT_COMMIT_MESSAGE}" by ${process.env.NEXT_PUBLIC_VERCEL_GIT_COMMIT_AUTHOR_NAME}` + : "currently running in dev", }; export default function Home() { diff --git a/src/app/sort/favorites/page.tsx b/src/app/sort/favorites/page.tsx new file mode 100644 index 0000000..4e1ad6d --- /dev/null +++ b/src/app/sort/favorites/page.tsx @@ -0,0 +1,11 @@ +import FavoriteSortView from "@/components/FavoritesSortView"; + +export default function FavoritesSort() { + return ( +
+
+ +
+
+ ); +} diff --git a/src/components/CommandBar.tsx b/src/components/CommandBar.tsx index cfb21d5..7f7bbe4 100644 --- a/src/components/CommandBar.tsx +++ b/src/components/CommandBar.tsx @@ -167,6 +167,7 @@ export function OfflineServerCB() { const [customized, setCustomized] = useState(false); const [obj, setObj] = useState({}); const [vb, setVB] = useState(false); + const { isSignedIn } = useUser(); const router = useRouter(); const [starred, setStarred] = useState(false); const { resolvedTheme } = useTheme(); @@ -257,9 +258,10 @@ export function OfflineServerCB() { )} - router.push("/server/" + (obj as ServerResponse).name + "/") - } + onSelect={() => { + router.push("/server/" + (obj as ServerResponse).name + "/"); + setOpen(false); + }} > Open Server Page @@ -271,6 +273,7 @@ export function OfflineServerCB() { toast.success("Done!"); }); }} + disabled={!isSignedIn} > + onSelect={() => { router.push( "/server/" + (obj as ServerResponse).name + "/statistics" - ) - } + ); + setOpen(false); + }} > See Statistics @@ -330,6 +334,7 @@ export function ServerCommandBar() { const [vb, setVB] = useState(false); const router = useRouter(); const { resolvedTheme } = useTheme(); + const { isSignedIn } = useUser(); const [owned, setOwned] = useState(false); const [starred, setStarred] = useState(false); const [serverSingle, setSingle] = useState( @@ -406,7 +411,10 @@ export function ServerCommandBar() { router.push("/server/" + serverName + "/")} + onSelect={() => { + router.push("/server/" + serverName + "/"); + setOpen(false); + }} > Open Server Page @@ -418,6 +426,7 @@ export function ServerCommandBar() { toast.success("Done!"); }); }} + disabled={!isSignedIn} > - router.push("/server/" + serverName + "/statistics") - } + onSelect={() => { + router.push("/server/" + serverName + "/statistics"); + setOpen(false); + }} > See Statistics @@ -509,11 +519,14 @@ export function CommandBar() { +Shift+K - + { + events.emit("cmd-event-sort"); + setOpen(false); + }} + > - - Sort Servers - coming soon - + Sort Servers { @@ -672,6 +685,49 @@ export function RandomServerDialog() { ); } +export function SubSortCommandBar() { + const [open, setOpen] = useState(false); + const router = useRouter(); + + useEffectOnce(() => { + events.on("cmd-event-sort", () => { + setOpen(true); + }); + }); + + return ( + + + + No results found. + + + { + router.push("/sort/favorites"); + setOpen(false); + }} + > + + Favorites + + + + { + setOpen(false); + events.emit("cmd-event"); + }} + > + + Go back + + + + + ); +} + export function SubLinkCommandBar() { const [open, setOpen] = useState(false); const { resolvedTheme } = useTheme(); @@ -771,6 +827,7 @@ export function FavoriteBar() { key={c} onSelect={() => { router.push("/server/" + c); + setOpen(false); }} > {c} @@ -802,6 +859,7 @@ export function CommandBarer() { + diff --git a/src/components/FavoritesSortView.tsx b/src/components/FavoritesSortView.tsx new file mode 100644 index 0000000..a43469e --- /dev/null +++ b/src/components/FavoritesSortView.tsx @@ -0,0 +1,267 @@ +"use client"; +import { useEffect, useState } from "react"; +import { Spinner } from "./ui/spinner"; +import { sortedFavorites } from "@/lib/api"; +import InfiniteScroll from "react-infinite-scroll-component"; +import { Button } from "./ui/button"; +import { Popover, PopoverContent, PopoverTrigger } from "./ui/popover"; +import { RadioGroup, RadioGroupItem } from "./ui/radio-group"; +import { Label } from "./ui/label"; +import { useRouter } from "@/lib/useRouter"; +import { OnlineServer } from "@/lib/types/mh-server"; +import ServerCard from "./ServerCard"; +import { CircleUser, Copy, Info, Layers, Network } from "lucide-react"; +import { Tooltip, TooltipContent, TooltipTrigger } from "./ui/tooltip"; +import { BorderBeam } from "./effects/border-beam"; +import Stat from "./Stat"; +import { Separator } from "./ui/separator"; +import { Card, CardDescription, CardHeader, CardTitle } from "./ui/card"; +import Link from "next/link"; +import toast from "react-hot-toast"; + +export default function FavoriteSortView() { + const [loading, setLoading] = useState(true); + const [list, setList] = useState<{ server: string; favorites: number }[]>([]); + const [allItems, setAllItems] = useState< + Array<{ server: string; favorites: number }> + >([]); + const [upNumber, setUpNumber] = useState(0); + const [hasMore, setHasMore] = useState(true); + const [totalServers, setTotalServers] = useState(0); + const [totalPlayers, setTotalPlayers] = useState(0); + const [online, setOnline] = useState({}); + const router = useRouter(); + + useEffect(() => { + sortedFavorites().then((c) => { + if (typeof c !== "boolean") { + const slicedArray = c.slice(0, 20); + setAllItems(slicedArray); + setList(c); + fetch("https://api.minehut.com/servers").then((b) => + b.json().then((c) => { + c.servers.forEach((v: OnlineServer) => + setOnline(setManipulate(online, v.name, v)) + ); + setLoading(false); + setTotalPlayers(c.total_players); + setTotalServers(c.total_servers); + }) + ); + + console.log(list); + } + }); + }, []); + + if (loading) { + return ; + } + + return ( +
+
+ + = 3200 + ? "bg-clip-text text-transparent bg-gradient-to-r from-cyan-500 to-blue-500" + : "" + } + > + Servers online{" "} +
+ } + className="relative z-0" + desc={ +
+
= 3200 + ? "bg-clip-text text-transparent bg-gradient-to-r from-cyan-500 to-blue-500 " + : "" + } + > + {totalServers.toString()} +
+ {totalServers >= 3200 && ( + + + + + + The server amount is over 3.2k, meaning that new servers + have to go into a queue before being able to be online.{" "} +
+ (the server count isn't entirely accurate, so sometimes you + might not go into a queue even when the server count is at + 3.2k) +
+
+ )} +
+ } + icon={Network} + > + {totalServers >= 3200 && ( + + )} + +
+
+ +
+ + + + + + router.push("/")} + > +
+ + +
+
+ + +
+
+
+
+ +
+
+ + { + const newUpNumber = upNumber + 1; + const slicedArray = list.slice( + newUpNumber * 20, + newUpNumber * 20 + 20 + ); + console.log(slicedArray.length); + + setAllItems((prev) => [...prev, ...slicedArray]); + if (slicedArray.length !== 20) setHasMore(false); + setUpNumber(newUpNumber); + }} + loader={
} + endMessage={ +

+
+ You've seen it all +

+ } + style={{ overflow: "hidden", paddingLeft: 6 }} + > +
+ {allItems.map((v) => { + if (v.favorites == 0) { + return <>; + } + + if (online[v.server] != undefined) + return ( + + ); + else + return ( + + + {v.server} + + {v.favorites} favorited +
+ + + + + + + + + Open up the server page to see more information about + the server + + +
+
+
+ ); + })} +
+
+ + ); +} + +function setManipulate(object: any, change: string, value: any) { + let newObject = object; + newObject[change] = value; + return newObject; +} diff --git a/src/components/ServerCard.tsx b/src/components/ServerCard.tsx index 76c22eb..7f044da 100644 --- a/src/components/ServerCard.tsx +++ b/src/components/ServerCard.tsx @@ -5,7 +5,7 @@ import { ContextMenuContent, ContextMenuSeparator, } from "@/components/ui/context-menu"; -import toast from "react-hot-toast"; +import toast, { LoaderIcon } from "react-hot-toast"; import { CardHeader, CardTitle, @@ -15,7 +15,7 @@ import { } from "./ui/card"; import IconDisplay from "./IconDisplay"; import { TagShower } from "./ServerList"; -import { Copy, EllipsisVertical, Layers } from "lucide-react"; +import { Copy, EllipsisVertical, Layers, Star } from "lucide-react"; import { Button } from "./ui/button"; import { Drawer, @@ -29,15 +29,35 @@ import { Tooltip } from "@radix-ui/react-tooltip"; import { TooltipContent, TooltipTrigger } from "./ui/tooltip"; import { useRouter } from "@/lib/useRouter"; import Link from "next/link"; +import { useState } from "react"; +import { favoriteServer, isFavorited } from "@/lib/api"; +import { useUser } from "@clerk/nextjs"; +import { useTheme } from "next-themes"; -export default function ServerCard({ b, motd }: any) { +export default function ServerCard({ b, motd, mini, favs }: any) { const router = useRouter(); + const [favoriteStar, setFavoriteStar] = useState(false); + const [favoriteLoading, setFavoriteLoading] = useState(true); + const { isSignedIn } = useUser(); + const { resolvedTheme } = useTheme(); + return ( - + { + if (open && isSignedIn) + isFavorited(b.name).then((c) => { + setFavoriteStar(c); + setFavoriteLoading(false); + }); + }} + > @@ -115,7 +135,7 @@ export default function ServerCard({ b, motd }: any) { {b.playerData.playerCount}{" "} {b.playerData.playerCount == 1 ? "player" : "players"}{" "} - currently online + currently online {favs && <>• {favs} favorited} @@ -177,10 +197,12 @@ export default function ServerCard({ b, motd }: any) { - + {motd && ( + + )} @@ -193,9 +215,6 @@ export default function ServerCard({ b, motd }: any) { }} > Copy server IP -
- -
Open server page + { + router.push("/server/" + b.name + "/statistics"); + }} + > + Open statistics page + + + { + setFavoriteLoading(true); + favoriteServer(b.name).then(() => { + setFavoriteLoading(false); + setFavoriteStar(!favoriteStar); + }); + }} + disabled={!isSignedIn || favoriteLoading} + > + {!favoriteLoading && ( + + )}{" "} + {favoriteLoading && } + {favoriteStar && isSignedIn ? "Unf" : "F"}avorite Server +
); diff --git a/src/components/ServerList.tsx b/src/components/ServerList.tsx index 38eafb7..a8dabc9 100644 --- a/src/components/ServerList.tsx +++ b/src/components/ServerList.tsx @@ -37,6 +37,8 @@ import { useEffectOnce } from "@/lib/useEffectOnce"; import ServerCard from "./ServerCard"; import events from "@/lib/commandEvent"; import { BorderBeam } from "@/components/effects/border-beam"; +import { Label } from "./ui/label"; +import { useRouter } from "@/lib/useRouter"; export default function ServerList() { const [loading, setLoading]: any = useState(true); @@ -59,6 +61,7 @@ export default function ServerList() { const [nameFilters, setNameFilters] = useState({}); const [inErrState, setErrState] = useState(false); const [servers, setServers] = useState>([]); + const router = useRouter(); const [filters, setFilters] = useState< Array<(server: OnlineServer) => Promise> >([]); @@ -125,7 +128,7 @@ export default function ServerList() { title="Players online" desc={serverList.getExtraData().total_players.toString()} icon={CircleUser} - > + /> + + + + + + router.push("/sort/favorites")} + > +
+ + +
+
+ + +
+
+
+