diff options
author | polwex <polwex@sortug.com> | 2025-05-29 15:49:50 +0700 |
---|---|---|
committer | polwex <polwex@sortug.com> | 2025-05-29 15:49:50 +0700 |
commit | 84c5b778039102a77b7fda2ddcab2bbf70085bdc (patch) | |
tree | cd9458f2efe5c890dde2a9bb0b2ae6353dbad068 /src/components/Navbar.tsx | |
parent | f23f7d2f0106882183929c740e4862a1939900d0 (diff) |
good progress good progrss
Diffstat (limited to 'src/components/Navbar.tsx')
-rw-r--r-- | src/components/Navbar.tsx | 202 |
1 files changed, 202 insertions, 0 deletions
diff --git a/src/components/Navbar.tsx b/src/components/Navbar.tsx new file mode 100644 index 0000000..68375ae --- /dev/null +++ b/src/components/Navbar.tsx @@ -0,0 +1,202 @@ +"use client"; + +import { useState } from "react"; +import { Link } from "waku"; +import { Button } from "@/components/ui/button"; +import { Avatar, AvatarFallback } from "@/components/ui/avatar"; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuLabel, + DropdownMenuSeparator, + DropdownMenuTrigger, +} from "@/components/ui/dropdown-menu"; +import { Menu, X, BookOpen, BarChart2, Settings } from "lucide-react"; + +interface NavbarProps { + user?: { id: number; name: string } | null; +} + +export default function Navbar({ user }: NavbarProps) { + const [isMenuOpen, setIsMenuOpen] = useState(false); + + const toggleMenu = () => setIsMenuOpen(!isMenuOpen); + + // Get initials for avatar + const getInitials = (name: string) => { + return name + .split(" ") + .map(n => n[0]) + .join("") + .toUpperCase(); + }; + + return ( + <nav className="bg-white border-b border-gray-200 sticky top-0 z-50"> + <div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8"> + <div className="flex justify-between h-16"> + <div className="flex"> + <div className="flex-shrink-0 flex items-center"> + <Link to="/"> + <span className="text-2xl font-bold text-indigo-600">Sorlang</span> + </Link> + </div> + <div className="hidden sm:ml-6 sm:flex sm:space-x-8"> + <Link to="/"> + <span className="inline-flex items-center px-1 pt-1 border-b-2 border-indigo-500 text-sm font-medium text-gray-900"> + Home + </span> + </Link> + <Link to="/study"> + <span className="inline-flex items-center px-1 pt-1 border-b-2 border-transparent text-sm font-medium text-gray-500 hover:text-gray-700 hover:border-gray-300"> + Study + </span> + </Link> + <Link to="/parse"> + <span className="inline-flex items-center px-1 pt-1 border-b-2 border-transparent text-sm font-medium text-gray-500 hover:text-gray-700 hover:border-gray-300"> + Parse Text + </span> + </Link> + <Link to="/zoom"> + <span className="inline-flex items-center px-1 pt-1 border-b-2 border-transparent text-sm font-medium text-gray-500 hover:text-gray-700 hover:border-gray-300"> + Text Explorer + </span> + </Link> + </div> + </div> + + <div className="hidden sm:ml-6 sm:flex sm:items-center"> + {user ? ( + <DropdownMenu> + <DropdownMenuTrigger asChild> + <Button variant="ghost" className="relative h-10 w-10 rounded-full"> + <Avatar className="h-10 w-10 bg-indigo-100 text-indigo-800"> + <AvatarFallback>{getInitials(user.name)}</AvatarFallback> + </Avatar> + </Button> + </DropdownMenuTrigger> + <DropdownMenuContent align="end"> + <DropdownMenuLabel>My Account</DropdownMenuLabel> + <DropdownMenuLabel className="text-xs text-gray-500"> + Signed in as {user.name} + </DropdownMenuLabel> + <DropdownMenuSeparator /> + <Link to="/profile"> + <DropdownMenuItem>Profile</DropdownMenuItem> + </Link> + <Link to="/study"> + <DropdownMenuItem>My Cards</DropdownMenuItem> + </Link> + <Link to="/settings"> + <DropdownMenuItem>Settings</DropdownMenuItem> + </Link> + <DropdownMenuSeparator /> + <DropdownMenuItem> + <Link to="/logout">Sign out</Link> + </DropdownMenuItem> + </DropdownMenuContent> + </DropdownMenu> + ) : ( + <div className="flex items-center space-x-2"> + <Link to="/login"> + <Button variant="ghost">Login</Button> + </Link> + <Link to="/login?register=true"> + <Button>Sign Up</Button> + </Link> + </div> + )} + </div> + + <div className="-mr-2 flex items-center sm:hidden"> + <button + onClick={toggleMenu} + className="inline-flex items-center justify-center p-2 rounded-md text-gray-400 hover:text-gray-500 hover:bg-gray-100 focus:outline-none focus:ring-2 focus:ring-inset focus:ring-indigo-500" + > + <span className="sr-only">Open main menu</span> + {isMenuOpen ? ( + <X className="block h-6 w-6" aria-hidden="true" /> + ) : ( + <Menu className="block h-6 w-6" aria-hidden="true" /> + )} + </button> + </div> + </div> + </div> + + {/* Mobile menu */} + <div className={`${isMenuOpen ? 'block' : 'hidden'} sm:hidden`}> + <div className="pt-2 pb-3 space-y-1"> + <Link to="/"> + <span className="bg-indigo-50 border-indigo-500 text-indigo-700 block pl-3 pr-4 py-2 border-l-4 text-base font-medium"> + Home + </span> + </Link> + <Link to="/study"> + <span className="border-transparent text-gray-500 hover:bg-gray-50 hover:border-gray-300 hover:text-gray-700 block pl-3 pr-4 py-2 border-l-4 text-base font-medium"> + Study + </span> + </Link> + <Link to="/parse"> + <span className="border-transparent text-gray-500 hover:bg-gray-50 hover:border-gray-300 hover:text-gray-700 block pl-3 pr-4 py-2 border-l-4 text-base font-medium"> + Parse Text + </span> + </Link> + <Link to="/zoom"> + <span className="border-transparent text-gray-500 hover:bg-gray-50 hover:border-gray-300 hover:text-gray-700 block pl-3 pr-4 py-2 border-l-4 text-base font-medium"> + Text Explorer + </span> + </Link> + </div> + <div className="pt-4 pb-3 border-t border-gray-200"> + {user ? ( + <> + <div className="flex items-center px-4"> + <div className="flex-shrink-0"> + <Avatar className="h-10 w-10 bg-indigo-100 text-indigo-800"> + <AvatarFallback>{getInitials(user.name)}</AvatarFallback> + </Avatar> + </div> + <div className="ml-3"> + <div className="text-base font-medium text-gray-800">{user.name}</div> + </div> + </div> + <div className="mt-3 space-y-1"> + <Link to="/profile"> + <span className="block px-4 py-2 text-base font-medium text-gray-500 hover:text-gray-800 hover:bg-gray-100"> + Profile + </span> + </Link> + <Link to="/study"> + <span className="block px-4 py-2 text-base font-medium text-gray-500 hover:text-gray-800 hover:bg-gray-100"> + My Cards + </span> + </Link> + <Link to="/settings"> + <span className="block px-4 py-2 text-base font-medium text-gray-500 hover:text-gray-800 hover:bg-gray-100"> + Settings + </span> + </Link> + <Link to="/logout"> + <span className="block px-4 py-2 text-base font-medium text-gray-500 hover:text-gray-800 hover:bg-gray-100"> + Sign out + </span> + </Link> + </div> + </> + ) : ( + <div className="mt-3 space-y-1 px-4"> + <Link to="/login"> + <Button className="w-full mb-2">Login</Button> + </Link> + <Link to="/login?register=true"> + <Button variant="outline" className="w-full">Sign Up</Button> + </Link> + </div> + )} + </div> + </div> + </nav> + ); +}
\ No newline at end of file |