Files
image-prompt-studio/components/navigation-shell.tsx
2026-04-25 11:26:33 +08:00

108 lines
2.8 KiB
TypeScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import type { ReactNode } from "react";
import Link from "next/link";
import LogoutButton from "@/components/logout-button";
import type { PublicUser } from "@/lib/types";
interface NavigationShellProps {
currentUser: PublicUser;
activePath: string;
title: string;
description: string;
children: ReactNode;
}
export default function NavigationShell({
currentUser,
activePath,
title,
description,
children,
}: NavigationShellProps) {
const navigationItems = [
{
href: "/studio",
label: "生成中心",
description: "输入 Prompt生成并下载图片",
},
{
href: "/history",
label: "历史记录",
description:
currentUser.role === "admin"
? "查看所有用户生成过的图片"
: "回看自己曾经生成的图片",
},
...(currentUser.role === "admin"
? [
{
href: "/admin",
label: "管理后台",
description: "用户、角色和额度配置",
},
]
: []),
];
return (
<div className="dashboard-shell">
<aside className="dashboard-sidebar">
<div className="brand-lockup">
<div className="brand-mark" />
<div>
<p className="eyebrow">Image Prompt Studio</p>
<h1>Apple-like Workspace</h1>
</div>
</div>
<div className="sidebar-card">
<span className="sidebar-label"></span>
<strong>{currentUser.username}</strong>
<p className="sidebar-copy">
{currentUser.role === "admin"
? "管理员,无限额"
: "普通用户,受额度限制"}
</p>
</div>
<nav className="sidebar-nav">
{navigationItems.map((item) => (
<Link
key={item.href}
href={item.href}
className={
item.href === activePath
? "sidebar-link sidebar-link-active"
: "sidebar-link"
}
>
<strong>{item.label}</strong>
<span>{item.description}</span>
</Link>
))}
</nav>
<div className="sidebar-actions">
<LogoutButton />
</div>
</aside>
<main className="dashboard-main">
<header className="page-hero">
<div>
<p className="eyebrow">Workspace</p>
<h2>{title}</h2>
<p className="hero-copy">{description}</p>
</div>
<div className="hero-orbs" aria-hidden="true">
<div className="hero-orb hero-orb-blue" />
<div className="hero-orb hero-orb-pink" />
<div className="hero-orb hero-orb-silver" />
</div>
</header>
<div className="page-content">{children}</div>
</main>
</div>
);
}