Header.tsx 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. "use client";
  2. import Image from "next/image";
  3. import { LogIn, UserPlus, LogOut, User } from "lucide-react";
  4. import { useI18n } from "locales/client";
  5. import Logo from "@public/logo.png";
  6. import { useLogout } from "@/features/auth/model/useLogout";
  7. import { useSession } from "@/features/auth/lib/auth-client";
  8. import { Link } from "@/components/ui/link";
  9. import { ReleaseNotesDialog } from "@/features/release-notes";
  10. export const Header = () => {
  11. const session = useSession();
  12. const logout = useLogout();
  13. const t = useI18n();
  14. // Get user initials for avatar
  15. const userAvatar = session.data?.user?.email?.substring(0, 2).toUpperCase() || "";
  16. const handleSignOut = () => {
  17. logout.mutate();
  18. };
  19. return (
  20. <div className="navbar bg-base-100 px-0">
  21. {/* Logo and Title */}
  22. <div className="navbar-start">
  23. <Link className="btn btn-ghost text-xl" href="/">
  24. <Image alt="workout cool logo" className="w-8" height={32} src={Logo} width={32} />
  25. <span className="font-semibold hidden sm:inline">Workout.cool</span>
  26. </Link>
  27. <div className="badge badge-secondary badge-sm ml-2">Beta</div>
  28. </div>
  29. {/* User Menu */}
  30. <div className="navbar-end">
  31. <ReleaseNotesDialog />
  32. <div className="dropdown dropdown-end">
  33. <div className="btn btn-ghost btn-circle avatar" role="button" tabIndex={0}>
  34. <div className="w-8 rounded-full bg-primary text-primary-content flex items-center justify-center text-sm font-medium">
  35. {userAvatar || <User className="w-4 h-4" />}
  36. </div>
  37. </div>
  38. <ul className="mt-3 z-[1] p-2 shadow menu menu-sm dropdown-content bg-base-100 rounded-box w-52" tabIndex={0}>
  39. <li>
  40. <Link href="/profile" size="base" variant="nav">
  41. {t("commons.profile")}
  42. </Link>
  43. </li>
  44. <li>
  45. <hr className="my-1" />
  46. </li>
  47. {!session.data ? (
  48. <>
  49. <li>
  50. <Link href="/auth/signin" size="base" variant="nav">
  51. <LogIn className="w-4 h-4" />
  52. {t("commons.login")}
  53. </Link>
  54. </li>
  55. <li>
  56. <Link href="/auth/signup" size="base" variant="nav">
  57. <UserPlus className="w-4 h-4" />
  58. {t("commons.register")}
  59. </Link>
  60. </li>
  61. </>
  62. ) : (
  63. <li>
  64. <button className="flex items-center gap-2 text-base" onClick={handleSignOut}>
  65. <LogOut className="w-4 h-4" />
  66. {t("commons.logout")}
  67. </button>
  68. </li>
  69. )}
  70. </ul>
  71. </div>
  72. </div>
  73. </div>
  74. );
  75. };