الملفات
dashboard/src/components/shared/Header.tsx

245 أسطر
9.4 KiB
TypeScript

import { useLocation } from "react-router-dom";
import {
// LayoutDashboard,
// BookOpen,
// CalendarDays,
Plus,
User,
Settings,
CreditCard,
HelpCircle,
MessageCircle,
LogOut,
ChevronDown,
Menu,
X,
} from 'lucide-react';
import logo from "../../assets/logo.png";
import { useEffect, useState } from "react";
import { Link } from "react-router-dom";
import Logo from "./Logo";
import Vector from "../../assets/icons/Vector.svg";
import Vector2 from "../../assets/icons/Vector2.svg";
import { LayoutDashboard, LayoutDashboardLight, BookOpen, BookOpenLight, CalendarDays, CalendarDaysLight, KeywordsIcon, KeywordsIconLight, AnalysisIcon, AnalysisIconLight } from '../icons/icons-header.tsx';
// const CalendarDays = () => {
// return (
// )}
const Header = () => {
const location = useLocation();
const [isMenuOpen, setIsMenuOpen] = useState(false);
const [isMobileNavOpen, setIsMobileNavOpen] = useState(false);
const toggleMenu = () => setIsMenuOpen(!isMenuOpen);
const toggleMobileNav = () => setIsMobileNavOpen(!isMobileNavOpen);
const navLinks = [
{ name: 'Dashboard', to: '/', icon: LayoutDashboard, iconLight: LayoutDashboardLight },
{ name: 'Portfolio', to: '/portfolio', icon: BookOpen, iconLight: BookOpenLight },
{ name: 'Strategy', to: '/strategy', icon: CalendarDays, iconLight: CalendarDaysLight },
{ name: 'Analysis', to: '/analysis', icon: AnalysisIcon, iconLight: AnalysisIconLight },
{ name: 'Keywords', to: '/keywords', icon: KeywordsIcon, iconLight: KeywordsIconLight },
];
const menuItems = [
{ name: 'Edit Profile', icon: User, to: '/profile' },
{ name: 'Settings', icon: Settings, to: '/settings' },
{ name: 'Billing', icon: CreditCard, to: '/billing' },
{ name: 'Help Desk', icon: HelpCircle, to: '/help-desk' },
{ name: 'Feature Request', icon: MessageCircle, to: '/feature-request' },
];
useEffect(() => {
setIsMenuOpen(false)
}, [location.pathname]);
return (
<header className="pb-20">
<nav className="bg-[#E6ECFB] backdrop-blur-md shadow-sm fixed top-0 left-0 right-0 z-50">
<div className="container mx-auto px-4 py-3 flex justify-between items-center">
{/* Left: Logo */}
<div className="flex items-center justify-between w-full md:w-auto">
<Link to="/" className="flex items-center space-x-2">
{/* <img
src={logo}
alt="logo"
className="w-auto h-8 sm:h-10 hover:scale-105 transition-all duration-300"
/> */}
<Logo />
</Link>
{/* Mobile menu toggle */}
<div className="md:hidden">
<button onClick={toggleMobileNav}>
{isMobileNavOpen ? <X size={24} /> : <Menu size={24} />}
</button>
</div>
</div>
{/* Center Nav Links - Hidden on Mobile */}
<div className="hidden md:flex md:justify-center md:items-center md:flex-grow">
<div className="p-1 rounded-full bg-blue-100/70 shadow-inner flex">
{navLinks.map((link, index) => (
<Link
key={index}
to={link.to}
className={`px-4 py-2 flex items-center space-x-2 rounded-full font-medium transition-colors duration-200 ${location.pathname === link.to
? 'bg-white blue-500/80 text-[#4C60E5] shadow-md'
: 'text-black/80 hover:bg-blue-200/50'
}`}
>
{
location.pathname === link.to ?
<link.iconLight />
:
<link.icon />
}
<span>{link.name}</span>
</Link>
))}
</div>
</div>
{/* Right Side - Desktop Only */}
<div className="hidden md:flex items-center space-x-4 relative">
{/* Add Keyword Button */}
<button className="flex items-center space-x-2 px-4 py-2 bg-blue-600 text-white rounded-xl font-medium shadow-md hover:bg-blue-700 transition-colors duration-200 ">
<Plus size={18} />
<span>Add Keywords</span>
</button>
<div className="w-0 h-6 outline outline-1 outline-offset-[-0.50px] outline-indigo-200"></div>
{/* Profile Dropdown */}
<div className="relative">
<button
onClick={toggleMenu}
className="flex items-center space-x-2 rounded-full focus:outline-none"
>
<img
src="https://placehold.co/40x40/94a3b8/ffffff?text=U"
alt="User avatar"
className="w-10 h-10 rounded-full "
/>
<ChevronDown
size={16}
className={`text-gray-500 transition-transform duration-200 ${isMenuOpen ? 'rotate-180' : 'rotate-0'
}`}
/>
</button>
{/* Dropdown Menu */}
{isMenuOpen && (
<div className="absolute right-0 mt-3 w-64 bg-white rounded-xl shadow-2xl overflow-hidden py-2 text-gray-700 z-50">
<div className="px-4 py-3 flex items-center space-x-3 border-b border-gray-200">
<img
src="https://placehold.co/40x40/94a3b8/ffffff?text=U"
alt="User avatar"
className="w-10 h-10 rounded-full"
/>
<div>
<p className="font-semibold text-sm text-gray-800">Mohammed Said</p>
<p className="text-xs text-gray-500">mohammedsaidaker@gmail.com</p>
</div>
</div>
<div className="py-2">
{menuItems.map((item, index) => (
<Link
key={index}
to={item.to}
className="w-full flex items-center space-x-4 px-4 py-2 text-gray-700 hover:bg-gray-100 transition-colors duration-200"
>
<item.icon size={20} className="text-gray-500" />
<span>{item.name}</span>
</Link>
))}
</div>
<div className="border-t border-gray-200 pt-2">
<button className="w-full flex items-center space-x-4 px-4 py-2 text-gray-700 hover:bg-gray-100 transition-colors duration-200">
<LogOut size={20} className="text-gray-500" />
<span>Log Out</span>
</button>
</div>
</div>
)}
</div>
</div>
</div>
{/* Mobile nav - visible when toggled */}
{isMobileNavOpen && (
<div className="md:hidden px-4 pb-4">
{/* Nav links */}
<div className="flex flex-col gap-2 rounded-xl bg-blue-100/30 p-3 mt-2">
{navLinks.map((link, index) => (
<Link
key={index}
to={link.to}
className={`flex items-center px-3 py-2 rounded-lg transition-colors duration-200 ${location.pathname === link.to
? 'bg-blue-500/80 text-white shadow-md'
: 'text-black/80 hover:bg-blue-200/50'
}`}
>
<link.icon size={18} className="mr-2" />
<span>{link.name}</span>
</Link>
))}
</div>
{/* Add Keyword Button */}
{/* <button className="mt-4 w-full flex items-center justify-center space-x-2 px-4 py-2 bg-blue-600 text-white rounded-full font-medium shadow-md hover:bg-blue-700 transition-colors duration-200">
<Plus size={18} />
<span>Add Keyword</span>
</button> */}
<div className="w-0 h-6 outline outline-1 outline-offset-[-0.50px] outline-indigo-200"></div>
{/* Profile menu */}
<div className="mt-4 p-3 bg-white rounded-xl shadow-md">
<div className="flex items-center space-x-3 border-b pb-3 mb-2">
<img
src="https://placehold.co/40x40/94a3b8/ffffff?text=U"
alt="User avatar"
className="w-10 h-10 rounded-full"
/>
<div>
<p className="font-semibold text-sm text-gray-800">Mohammed Sukkar</p>
<p className="text-xs text-gray-500">mohammedsaidaker@gmail.com</p>
</div>
</div>
<div className="flex flex-col space-y-2">
{menuItems.map((item, index) => (
<Link
key={index}
to={item.to}
className="flex items-center space-x-3 px-4 py-2 rounded-md text-gray-700 hover:bg-gray-100"
>
<item.icon size={18} />
<span>{item.name}</span>
</Link>
))}
<button className="flex items-center space-x-3 px-4 py-2 rounded-md text-gray-700 hover:bg-gray-100">
<LogOut size={18} />
<span>Log Out</span>
</button>
</div>
</div>
</div>
)}
</nav>
</header>
);
};
export default Header;