collect-system/apps/web/src/components/models/course/detail/CourseDetailHeader/CourseDetailHeader.tsx

93 lines
3.0 KiB
TypeScript
Raw Normal View History

2025-02-24 08:51:44 +08:00
import { useContext, useState } from "react";
import { Input, Layout, Avatar, Button, Dropdown } from "antd";
import {
EditFilled,
HomeOutlined,
SearchOutlined,
UserOutlined,
} from "@ant-design/icons";
import { useAuth } from "@web/src/providers/auth-provider";
2025-02-26 10:19:29 +08:00
import { useNavigate, useParams } from "react-router-dom";
2025-02-25 08:25:54 +08:00
import { UserMenu } from "@web/src/app/main/layout/UserMenu/UserMenu";
2025-01-08 20:29:07 +08:00
import { CourseDetailContext } from "../CourseDetailContext";
2025-02-24 08:51:44 +08:00
const { Header } = Layout;
2025-01-08 20:29:07 +08:00
2025-02-24 08:51:44 +08:00
export function CourseDetailHeader() {
const [searchValue, setSearchValue] = useState("");
2025-02-26 10:19:29 +08:00
const { id } = useParams();
const { isAuthenticated, user, hasSomePermissions } = useAuth();
2025-02-24 08:51:44 +08:00
const navigate = useNavigate();
const { course } = useContext(CourseDetailContext);
2025-02-24 09:33:06 +08:00
2025-01-08 20:29:07 +08:00
return (
2025-02-24 08:51:44 +08:00
<Header className="select-none flex items-center justify-center bg-white shadow-md border-b border-gray-100 fixed w-full z-30">
2025-02-25 09:11:15 +08:00
<div className="w-full flex items-center justify-between h-full">
2025-02-24 08:51:44 +08:00
<div className="flex items-center space-x-2">
<HomeOutlined
onClick={() => {
navigate("/");
}}
className="text-2xl text-primary-500 hover:scale-105 cursor-pointer"
/>
2025-02-23 21:41:33 +08:00
2025-02-24 08:51:44 +08:00
<div className="text-2xl font-bold bg-gradient-to-r from-primary-600 via-primary-500 to-primary-400 bg-clip-text text-transparent transition-transform ">
{course?.title}
</div>
{/* <NavigationMenu /> */}
</div>
<div className="flex items-center space-x-6">
<div className="group relative">
<Input
size="large"
prefix={
<SearchOutlined className="text-gray-400 group-hover:text-blue-500 transition-colors" />
}
placeholder="搜索课程"
className="w-72 rounded-full"
value={searchValue}
onChange={(e) => setSearchValue(e.target.value)}
/>
</div>
{isAuthenticated && (
<>
<Button
2025-02-26 10:19:29 +08:00
onClick={() => {
const url = id
? `/course/${id}/editor`
: "/course/editor";
navigate(url);
}}
2025-02-24 08:51:44 +08:00
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={<EditFilled />}>
2025-02-26 10:19:29 +08:00
{"编辑课程"}
2025-02-24 08:51:44 +08:00
</Button>
</>
)}
{isAuthenticated ? (
<Dropdown
overlay={<UserMenu />}
trigger={["click"]}
placement="bottomRight">
<Avatar
size="large"
className="cursor-pointer hover:scale-105 transition-all bg-gradient-to-r from-blue-500 to-blue-600 text-white font-semibold">
{(user?.showname ||
user?.username ||
"")[0]?.toUpperCase()}
</Avatar>
</Dropdown>
) : (
<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>
2025-01-08 20:29:07 +08:00
</div>
2025-02-24 08:51:44 +08:00
</Header>
2025-01-08 20:29:07 +08:00
);
2025-02-24 08:51:44 +08:00
}