2025-07-22 17:45:48 +07:00
|
|
|
import { useEffect, useState } from "react";
|
|
|
|
import { NavLink } from "react-router-dom";
|
|
|
|
import homeIcon from "../assets/icons/home.svg";
|
|
|
|
import cacheIcon from "../assets/icons/cache.svg";
|
|
|
|
import apiIcon from "../assets/icons/api.svg";
|
|
|
|
import testPlayerIcon from "../assets/icons/testplayer.svg";
|
|
|
|
import accountIcon from "../assets/icons/account.svg";
|
|
|
|
import discordIcon from "../assets/icons/discord.svg";
|
|
|
|
import telegramIcon from "../assets/icons/telegram.svg";
|
|
|
|
import giteaIcon from "../assets/icons/gitea.svg";
|
2025-04-27 17:55:11 -04:00
|
|
|
|
|
|
|
function NavBar() {
|
2025-04-28 18:06:52 -04:00
|
|
|
const [externalLinks, setExternalLinks] = useState({
|
2025-07-22 17:45:48 +07:00
|
|
|
discord: "#",
|
|
|
|
telegram: "#",
|
|
|
|
gitea: "#",
|
2025-04-28 18:06:52 -04:00
|
|
|
});
|
|
|
|
|
|
|
|
useEffect(() => {
|
2025-07-22 17:45:48 +07:00
|
|
|
fetch("/api/links")
|
|
|
|
.then((response) => response.json())
|
|
|
|
.then((data) => setExternalLinks(data))
|
|
|
|
.catch((error) => console.error("Error fetching links:", error));
|
2025-04-28 18:06:52 -04:00
|
|
|
}, []);
|
|
|
|
|
2025-04-27 17:55:11 -04:00
|
|
|
return (
|
|
|
|
<div className="flex flex-col w-full h-full bg-white/1">
|
2025-04-30 03:42:38 -04:00
|
|
|
{/* Header */}
|
2025-04-27 17:55:11 -04:00
|
|
|
<div>
|
2025-04-30 03:42:38 -04:00
|
|
|
<p className="text-white text-2xl font-bold p-3 text-center mb-5">
|
|
|
|
<a href="/">CDRM-Project</a>
|
2025-04-27 17:55:11 -04:00
|
|
|
</p>
|
|
|
|
</div>
|
2025-04-28 18:06:52 -04:00
|
|
|
|
2025-04-30 03:42:38 -04:00
|
|
|
{/* Scrollable navigation area */}
|
|
|
|
<div className="overflow-y-auto grow flex flex-col">
|
|
|
|
{/* Main NavLinks */}
|
|
|
|
<NavLink
|
|
|
|
to="/"
|
|
|
|
className={({ isActive }) =>
|
|
|
|
`flex flex-row p-3 border-l-3 ${
|
|
|
|
isActive
|
2025-07-22 17:45:48 +07:00
|
|
|
? "border-l-sky-500/50 bg-black/50"
|
|
|
|
: "hover:border-l-sky-500/50 hover:bg-white/5"
|
2025-04-30 03:42:38 -04:00
|
|
|
}`
|
|
|
|
}
|
|
|
|
>
|
|
|
|
<button className="w-1/3 p-3 flex flex-col items-center justify-center cursor-pointer">
|
|
|
|
<img src={homeIcon} alt="Home" className="w-1/2 cursor-pointer" />
|
|
|
|
</button>
|
|
|
|
<p className="grow text-white md:text-2xl font-bold flex items-center justify-start">
|
|
|
|
Home
|
|
|
|
</p>
|
|
|
|
</NavLink>
|
|
|
|
|
|
|
|
<NavLink
|
|
|
|
to="/cache"
|
|
|
|
className={({ isActive }) =>
|
|
|
|
`flex flex-row p-3 border-l-3 ${
|
|
|
|
isActive
|
2025-07-22 17:45:48 +07:00
|
|
|
? "border-l-emerald-500/50 bg-black/50"
|
|
|
|
: "hover:border-l-emerald-500/50 hover:bg-white/5"
|
2025-04-30 03:42:38 -04:00
|
|
|
}`
|
|
|
|
}
|
|
|
|
>
|
|
|
|
<button className="w-1/3 p-3 flex flex-col items-center justify-center cursor-pointer">
|
|
|
|
<img src={cacheIcon} alt="Cache" className="w-1/2 cursor-pointer" />
|
|
|
|
</button>
|
|
|
|
<p className="grow text-white md:text-2xl font-bold flex items-center justify-start">
|
|
|
|
Cache
|
|
|
|
</p>
|
|
|
|
</NavLink>
|
|
|
|
|
|
|
|
<NavLink
|
|
|
|
to="/api"
|
|
|
|
className={({ isActive }) =>
|
|
|
|
`flex flex-row p-3 border-l-3 ${
|
|
|
|
isActive
|
2025-07-22 17:45:48 +07:00
|
|
|
? "border-l-indigo-500/50 bg-black/50"
|
|
|
|
: "hover:border-l-indigo-500/50 hover:bg-white/5"
|
2025-04-30 03:42:38 -04:00
|
|
|
}`
|
|
|
|
}
|
|
|
|
>
|
|
|
|
<button className="w-1/3 p-3 flex flex-col items-center justify-center cursor-pointer">
|
|
|
|
<img src={apiIcon} alt="API" className="w-1/2 cursor-pointer" />
|
|
|
|
</button>
|
|
|
|
<p className="grow text-white md:text-2xl font-bold flex items-center justify-start">
|
|
|
|
API
|
|
|
|
</p>
|
|
|
|
</NavLink>
|
|
|
|
|
|
|
|
<NavLink
|
|
|
|
to="/testplayer"
|
|
|
|
className={({ isActive }) =>
|
|
|
|
`flex flex-row p-3 border-l-3 ${
|
|
|
|
isActive
|
2025-07-22 17:45:48 +07:00
|
|
|
? "border-l-rose-500/50 bg-black/50"
|
|
|
|
: "hover:border-l-rose-500/50 hover:bg-white/5"
|
2025-04-30 03:42:38 -04:00
|
|
|
}`
|
|
|
|
}
|
|
|
|
>
|
|
|
|
<button className="w-1/3 p-3 flex flex-col items-center justify-center cursor-pointer">
|
2025-07-22 17:45:48 +07:00
|
|
|
<img
|
|
|
|
src={testPlayerIcon}
|
|
|
|
alt="Test Player"
|
|
|
|
className="w-1/2 cursor-pointer"
|
|
|
|
/>
|
2025-04-30 03:42:38 -04:00
|
|
|
</button>
|
|
|
|
<p className="grow text-white md:text-2xl font-bold flex items-center justify-start">
|
|
|
|
Test Player
|
|
|
|
</p>
|
|
|
|
</NavLink>
|
|
|
|
|
|
|
|
{/* Account link at bottom of scrollable area */}
|
|
|
|
<div className="mt-auto">
|
2025-04-28 18:06:52 -04:00
|
|
|
<NavLink
|
2025-04-30 03:42:38 -04:00
|
|
|
to="/account"
|
2025-04-28 18:06:52 -04:00
|
|
|
className={({ isActive }) =>
|
|
|
|
`flex flex-row p-3 border-l-3 ${
|
|
|
|
isActive
|
2025-07-22 17:45:48 +07:00
|
|
|
? "border-l-yellow-500/50 bg-black/50"
|
|
|
|
: "hover:border-l-yellow-500/50 hover:bg-white/5"
|
2025-04-28 18:06:52 -04:00
|
|
|
}`
|
|
|
|
}
|
|
|
|
>
|
2025-04-30 03:42:38 -04:00
|
|
|
<button className="w-1/3 p-3 flex flex-col items-center justify-center cursor-pointer">
|
|
|
|
<img src={accountIcon} alt="Account" className="w-1/2 cursor-pointer" />
|
2025-04-28 18:06:52 -04:00
|
|
|
</button>
|
2025-04-30 03:42:38 -04:00
|
|
|
<p className="grow text-white md:text-2xl font-bold flex items-center justify-start">
|
|
|
|
My Account
|
2025-04-28 18:06:52 -04:00
|
|
|
</p>
|
|
|
|
</NavLink>
|
2025-04-30 03:42:38 -04:00
|
|
|
</div>
|
2025-04-27 17:55:11 -04:00
|
|
|
</div>
|
2025-04-28 18:06:52 -04:00
|
|
|
|
2025-04-30 03:42:38 -04:00
|
|
|
{/* External links at very bottom */}
|
|
|
|
<div className="flex flex-row w-full h-16 bg-black/25">
|
2025-04-27 17:55:11 -04:00
|
|
|
<a
|
2025-04-28 18:06:52 -04:00
|
|
|
href={externalLinks.discord}
|
2025-04-30 03:42:38 -04:00
|
|
|
target="_blank"
|
|
|
|
rel="noopener noreferrer"
|
|
|
|
className="w-1/3 p-3 flex flex-col items-center justify-center cursor-pointer hover:bg-blue-950 group"
|
2025-04-27 17:55:11 -04:00
|
|
|
>
|
2025-07-22 17:45:48 +07:00
|
|
|
<img
|
|
|
|
src={discordIcon}
|
|
|
|
alt="Discord"
|
|
|
|
className="w-1/2 group-hover:animate-bounce"
|
|
|
|
/>
|
2025-04-27 17:55:11 -04:00
|
|
|
</a>
|
|
|
|
<a
|
2025-04-28 18:06:52 -04:00
|
|
|
href={externalLinks.telegram}
|
2025-04-30 03:42:38 -04:00
|
|
|
target="_blank"
|
|
|
|
rel="noopener noreferrer"
|
|
|
|
className="w-1/3 p-3 flex flex-col items-center justify-center cursor-pointer hover:bg-blue-400 group"
|
2025-04-27 17:55:11 -04:00
|
|
|
>
|
2025-07-22 17:45:48 +07:00
|
|
|
<img
|
|
|
|
src={telegramIcon}
|
|
|
|
alt="Telegram"
|
|
|
|
className="w-1/2 group-hover:animate-bounce"
|
|
|
|
/>
|
2025-04-27 17:55:11 -04:00
|
|
|
</a>
|
|
|
|
<a
|
2025-04-28 18:06:52 -04:00
|
|
|
href={externalLinks.gitea}
|
2025-04-30 03:42:38 -04:00
|
|
|
target="_blank"
|
|
|
|
rel="noopener noreferrer"
|
|
|
|
className="w-1/3 p-3 flex flex-col items-center justify-center cursor-pointer hover:bg-green-700 group"
|
2025-04-27 17:55:11 -04:00
|
|
|
>
|
2025-04-30 03:42:38 -04:00
|
|
|
<img src={giteaIcon} alt="Gitea" className="w-1/2 group-hover:animate-bounce" />
|
2025-04-27 17:55:11 -04:00
|
|
|
</a>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
export default NavBar;
|