index.tsx 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. import { useCallback, useContext, useState } from "react";
  2. import clsx from "clsx";
  3. import Link from "next/link";
  4. import ClickAwayListener from "@mui/base/ClickAwayListener";
  5. import { Context } from "../../../libs/context";
  6. import toggleTheme from "../../../libs/toggleTheme";
  7. export default function Header() {
  8. const store = useContext(Context);
  9. const [open, setOpen] = useState(false);
  10. const toggleMenu = useCallback(() => {
  11. setOpen((o) => !o);
  12. }, [setOpen]);
  13. const closeMenu = useCallback(() => {
  14. setOpen(false);
  15. }, [setOpen]);
  16. return (
  17. <header className={clsx("header", { open })}>
  18. <ClickAwayListener onClickAway={closeMenu}>
  19. <div className="container">
  20. <Link href="/" className="logo mr-5" title="NovelDit" onClick={closeMenu}>
  21. {/* eslint-disable-next-line @next/next/no-img-element */}
  22. <img src="/logo.svg" alt="NovelDit" />
  23. <span>NovelDit</span>
  24. </Link>
  25. <div className="menu">
  26. <nav>
  27. <ul>
  28. <li>
  29. <Link className="menu-item" href="/novels" title="Genre" onClick={closeMenu}>
  30. <svg width="24" height="24">
  31. <use href="/icons.svg#browse"></use>
  32. </svg>
  33. <strong>Genre</strong>
  34. </Link>
  35. <div className="sub-menu">
  36. <ul className="sub-menu-items">
  37. {store.genre.map((item) => (
  38. <li key={item.uri}>
  39. <Link href={`/novels/${item.uri}`} title={item.name}>
  40. {item.name}
  41. </Link>
  42. </li>
  43. ))}
  44. </ul>
  45. </div>
  46. </li>
  47. </ul>
  48. </nav>
  49. {/* <form action="./search" className="search-input">
  50. <svg className="icon-search">
  51. <use href="/icons.svg#search"></use>
  52. </svg>
  53. <input type="search" name="q" placeholder="Search" />
  54. </form> */}
  55. </div>
  56. <div className="buttons">
  57. <button className="btn" onClick={() => toggleTheme()}>
  58. <svg className="icon-sun" viewBox="0 0 16 16">
  59. <use href="/icons.svg#sun"></use>
  60. </svg>
  61. <svg className="icon-moon" viewBox="0 0 16 16">
  62. <use href="/icons.svg#moon"></use>
  63. </svg>
  64. </button>
  65. <button className="btn menu-btn" onClick={toggleMenu}>
  66. <svg
  67. className="icon-menu"
  68. xmlns="http://www.w3.org/2000/svg"
  69. viewBox="0 0 16 16"
  70. >
  71. <rect
  72. x="1"
  73. y="4"
  74. width="14"
  75. height="1.5"
  76. rx="1"
  77. className="r-1"
  78. ></rect>
  79. <rect
  80. x="1"
  81. y="7.25"
  82. width="14"
  83. height="1.5"
  84. rx="1"
  85. className="r-2"
  86. ></rect>
  87. <rect
  88. x="1"
  89. y="10.5"
  90. width="14"
  91. height="1.5"
  92. rx="1"
  93. className="r-3"
  94. ></rect>
  95. </svg>
  96. </button>
  97. </div>
  98. </div>
  99. </ClickAwayListener>
  100. </header>
  101. );
  102. }