108 lines
3.2 KiB
TypeScript
Executable File
108 lines
3.2 KiB
TypeScript
Executable File
|
|
import { Input, Layout, Avatar, Button, Dropdown } from "antd";
|
|
import {
|
|
EditFilled,
|
|
PlusOutlined,
|
|
SearchOutlined,
|
|
UserOutlined,
|
|
} from "@ant-design/icons";
|
|
import { useAuth } from "@web/src/providers/auth-provider";
|
|
import { useNavigate, useParams, useSearchParams } from "react-router-dom";
|
|
import { UserMenu } from "./UserMenu/UserMenu";
|
|
import { NavigationMenu } from "./NavigationMenu";
|
|
import { useMainContext } from "./MainProvider";
|
|
export function MainHeader() {
|
|
const { isAuthenticated, user } = useAuth();
|
|
const { id } = useParams();
|
|
const navigate = useNavigate();
|
|
const { searchValue, setSearchValue } = useMainContext();
|
|
|
|
return (
|
|
<div className="select-none w-full flex items-center justify-between bg-white shadow-md border-b border-gray-100 fixed z-30 py-2 px-4 md:px-6">
|
|
{/* 左侧区域 - 设置为不收缩 */}
|
|
<div className="flex items-center justify-start space-x-4 flex-shrink-0">
|
|
<img src="/logo.svg" className="h-12 w-12" />
|
|
<div
|
|
onClick={() => navigate("/")}
|
|
className="text-2xl font-bold bg-gradient-to-r from-primary-600 via-primary-500 to-primary-400 bg-clip-text text-transparent hover:scale-105 transition-transform cursor-pointer whitespace-nowrap">
|
|
烽火慕课
|
|
</div>
|
|
<NavigationMenu />
|
|
</div>
|
|
|
|
{/* 中间搜索区域 - 允许适当收缩但保持可用性 */}
|
|
<div className="mx-4 flex-shrink md:flex-shrink-0 md:w-auto w-auto">
|
|
<Input
|
|
size="large"
|
|
prefix={
|
|
<SearchOutlined className="text-gray-400 group-hover:text-blue-500 transition-colors" />
|
|
}
|
|
placeholder="搜索课程"
|
|
className="w-full md:w-96 rounded-full"
|
|
value={searchValue}
|
|
onClick={(e) => {
|
|
if (!window.location.pathname.startsWith("/search")) {
|
|
navigate(`/search`);
|
|
window.scrollTo({
|
|
top: 0,
|
|
behavior: "smooth",
|
|
});
|
|
}
|
|
}}
|
|
onChange={(e) => setSearchValue(e.target.value)}
|
|
onPressEnter={(e) => {
|
|
if (!window.location.pathname.startsWith("/search")) {
|
|
navigate(`/search`);
|
|
window.scrollTo({
|
|
top: 0,
|
|
behavior: "smooth",
|
|
});
|
|
}
|
|
}}
|
|
/>
|
|
</div>
|
|
|
|
{/* 右侧区域 - 可以灵活收缩 */}
|
|
<div className="flex justify-end gap-2 md:gap-4 flex-shrink">
|
|
<div className="flex items-center gap-2 md:gap-4">
|
|
{isAuthenticated && (
|
|
<>
|
|
<Button
|
|
onClick={() => {
|
|
const url = id
|
|
? `/course/${id}/editor`
|
|
: "/course/editor";
|
|
navigate(url);
|
|
}}
|
|
type="primary"
|
|
>
|
|
{id ? "编辑课程" : "创建课程"}
|
|
</Button>
|
|
</>
|
|
)}
|
|
{isAuthenticated && (
|
|
<Button
|
|
onClick={() => {
|
|
window.location.href = "/path/editor";
|
|
}}
|
|
icon={<PlusOutlined></PlusOutlined>}>
|
|
创建学习路径
|
|
</Button>
|
|
)}
|
|
{isAuthenticated ? (
|
|
<UserMenu />
|
|
) : (
|
|
<Button
|
|
onClick={() => navigate("/login")}
|
|
className="flex items-center space-x-1 bg-gradient-to-r from-blue-500 to-blue-600 text-white hover:from-blue-600 hover:to-blue-700 border-none shadow-md hover:shadow-lg transition-all"
|
|
icon={<UserOutlined />}>
|
|
登录
|
|
</Button>
|
|
)}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
);
|
|
}
|
|
|