Header.tsx 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. "use client";
  2. import Image from "next/image";
  3. import { Home, LogIn, UserPlus, LogOut, User } from "lucide-react";
  4. import { useI18n } from "locales/client";
  5. import Logo from "@public/logo.png";
  6. import { LanguageSelector } from "@/widgets/language-selector/language-selector";
  7. import { ThemeToggle } from "@/features/theme/ThemeToggle";
  8. import { ReleaseNotesDialog } from "@/features/release-notes";
  9. import { useLogout } from "@/features/auth/model/useLogout";
  10. import { useSession } from "@/features/auth/lib/auth-client";
  11. import { Link } from "@/components/ui/link";
  12. export const Header = () => {
  13. const session = useSession();
  14. const logout = useLogout();
  15. const t = useI18n();
  16. // Get user initials for avatar
  17. const userAvatar = session.data?.user?.email?.substring(0, 2).toUpperCase() || "";
  18. const handleSignOut = () => {
  19. logout.mutate();
  20. };
  21. return (
  22. <div className="navbar bg-base-100 dark:bg-black dark:text-gray-200 px-4 rounded-tl-lg rounded-tr-lg">
  23. {/* Logo and Title */}
  24. <div className="navbar-start flex items-center gap-2">
  25. <Link
  26. className="group flex items-center space-x-3 rounded-xl bg-gradient-to-r px-2 sm:px-4 py-2 transition-all duration-200 dark:text-gray-200 dark:bg-gray-800"
  27. href="/"
  28. >
  29. <div className="relative flex-none">
  30. <Image
  31. alt="workout cool logo"
  32. className="h-10 w-10 sm:h-8 sm:w-8 transition-transform duration-200 group-hover:rotate-[20deg] group-hover:scale-110"
  33. height={32}
  34. src={Logo}
  35. width={32}
  36. />
  37. <div className="absolute -top-1 -right-1 h-3 w-3 rounded-full bg-emerald-400 opacity-0 transition-opacity duration-200 group-hover:opacity-100"></div>
  38. </div>
  39. <div className="flex-col hidden sm:flex">
  40. <span className="font-bold transition-colors duration-200 group-hover:text-blue-400">Workout.cool</span>
  41. </div>
  42. </Link>
  43. </div>
  44. {/* User Menu */}
  45. <div className="navbar-end">
  46. <div className="tooltip tooltip-bottom" data-tip={t("commons.home")}>
  47. <Link
  48. aria-label={t("commons.home")}
  49. className="hover:bg-slate-200 dark:hover:bg-gray-800 rounded-full p-2 transition flex"
  50. href="/"
  51. >
  52. <Home className="w-6 h-6 text-blue-500 dark:text-blue-400" />
  53. </Link>
  54. </div>
  55. <ReleaseNotesDialog />
  56. <ThemeToggle />
  57. <LanguageSelector />
  58. <div className="dropdown dropdown-end ml-1">
  59. <div className="btn btn-ghost btn-circle avatar" role="button" tabIndex={0}>
  60. <div className="w-8 rounded-full bg-primary text-primary-content !flex items-center justify-center text-sm font-medium">
  61. {userAvatar || <User className="w-4 h-4" />}
  62. </div>
  63. </div>
  64. <ul
  65. className="mt-3 z-[1] p-2 shadow menu menu-sm dropdown-content bg-base-100 dark:bg-black dark:text-gray-200 rounded-box w-52 border border-slate-200 dark:border-gray-800"
  66. tabIndex={0}
  67. >
  68. <li>
  69. <Link className="!no-underline" href="/profile" size="base" variant="nav">
  70. {t("commons.profile")}
  71. </Link>
  72. </li>
  73. <hr className="my-1 border-slate-200 dark:border-gray-800" />
  74. {!session.data ? (
  75. <>
  76. <li>
  77. <Link className="!no-underline" href="/auth/signin" size="base" variant="nav">
  78. <LogIn className="w-4 h-4 text-gray-700 dark:text-gray-300" />
  79. {t("commons.login")}
  80. </Link>
  81. </li>
  82. <li>
  83. <Link className="!no-underline" href="/auth/signup" size="base" variant="nav">
  84. <UserPlus className="w-4 h-4 text-gray-700 dark:text-gray-300" />
  85. {t("commons.register")}
  86. </Link>
  87. </li>
  88. </>
  89. ) : (
  90. <li>
  91. <button
  92. className="flex items-center gap-2 text-base text-gray-700 dark:text-gray-300 hover:bg-slate-200 dark:hover:bg-gray-800 rounded-lg px-3 py-2 transition-colors"
  93. onClick={handleSignOut}
  94. >
  95. <LogOut className="w-4 h-4" />
  96. {t("commons.logout")}
  97. </button>
  98. </li>
  99. )}
  100. </ul>
  101. </div>
  102. </div>
  103. </div>
  104. );
  105. };