Files
delta-force-guide-web/src/layout/hero-layout/index.tsx
T

106 lines
3.4 KiB
TypeScript
Raw Normal View History

2026-04-02 09:23:57 +08:00
import { Outlet, Link } from "react-router-dom"
import { useMemo } from "react"
import dayjs from "dayjs"
import { Dropdown } from "antd"
import { AuthApi } from "@/api"
import { useAppDispatch, useAppSelector } from "@/store"
import { clearCurrentUser } from "@/store/auth-slice"
2026-04-02 09:23:57 +08:00
/**
* Main application component that serves as the root layout.
* Uses React Router's Outlet to render child routes.
*/
export default function HeroLayout() {
const today = useMemo(() => dayjs(), [])
const user = useAppSelector((state) => state.auth.user)
const dispatch = useAppDispatch()
async function handleLogout() {
try {
await AuthApi.logout()
} finally {
dispatch(clearCurrentUser())
}
}
2026-04-02 09:23:57 +08:00
return (
<div className="bg-gray-50">
2026-04-02 09:23:57 +08:00
{/* Navigation Header */}
<header className="bg-white shadow-sm border-b">
<div className="max-w-screen-2xl mx-auto px-4 sm:px-6 lg:px-10">
2026-04-02 09:23:57 +08:00
<div className="flex justify-between items-center h-16">
<div className="flex items-center">
<h1 className="text-xl font-semibold text-gray-900">
2026-04-02 09:23:57 +08:00
</h1>
</div>
<nav className="flex space-x-8">
2026-04-06 17:57:25 +08:00
<Link
to="/firearms"
className="text-gray-500 hover:text-gray-900 px-3 py-2 rounded-md text-sm font-medium"
>
</Link>
2026-04-02 09:23:57 +08:00
<Link
to="/mod-codes"
2026-04-02 09:23:57 +08:00
className="text-gray-500 hover:text-gray-900 px-3 py-2 rounded-md text-sm font-medium"
>
2026-04-02 09:23:57 +08:00
</Link>
{user ? (
<Dropdown
trigger={["hover"]}
menu={{
items: [
{
key: "logout",
label: "退出登录",
danger: true,
onClick: handleLogout,
},
],
}}
>
<span className="cursor-pointer text-gray-700 px-3 py-2 rounded-md text-sm font-medium">
{user.username}
</span>
</Dropdown>
) : (
<Link
to="/login"
className="text-gray-500 hover:text-gray-900 px-3 py-2 rounded-md text-sm font-medium"
>
</Link>
)}
<a
href="https://github.com/zihluwang/delta-force-firearm-modification-codes"
target="_blank"
rel="noopener noreferrer"
2026-04-02 09:23:57 +08:00
className="text-gray-500 hover:text-gray-900 px-3 py-2 rounded-md text-sm font-medium"
>
GitHub
</a>
2026-04-02 09:23:57 +08:00
</nav>
</div>
</div>
</header>
{/* Main Content Area */}
<main className="max-w-screen-2xl mx-auto py-6 sm:px-6 lg:px-10">
2026-04-02 09:23:57 +08:00
<div className="px-4 py-6 sm:px-0">
<Outlet />
</div>
</main>
{/* Footer */}
<footer className="bg-white border-t">
<div className="max-w-screen-2xl mx-auto py-4 px-4 sm:px-6 lg:px-10">
2026-04-02 09:23:57 +08:00
<p className="text-center text-sm text-gray-500">
© 2024-{today.year()} Zihlu Wang OnixByte使 React TypeScript
2026-04-02 09:23:57 +08:00
</p>
</div>
</footer>
</div>
)
}