index.tsx 1.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. import { useRouter } from "next/router";
  2. import { ChangeEvent, FormEvent, useEffect, useMemo, useState } from "react";
  3. export default function SearchForm() {
  4. const { asPath, query, push } = useRouter();
  5. const inSearchPage = useMemo(() => {
  6. return !/\/novels/.test(asPath);
  7. }, [asPath]);
  8. const [value, setValue] = useState("");
  9. const handleSubmit = (e: FormEvent<HTMLFormElement>) => {
  10. e.preventDefault();
  11. push(`${asPath.split("?")[0]}${value ? `?q=${value}` : ""}`);
  12. };
  13. const handleChange = (e: ChangeEvent<HTMLInputElement>) => {
  14. setValue(e.target.value);
  15. };
  16. useEffect(() => {
  17. setValue((query.q as string) || "");
  18. }, [query.q]);
  19. return (
  20. <form
  21. action={inSearchPage ? asPath : "/novels"}
  22. className="search-input"
  23. onSubmit={handleSubmit}
  24. >
  25. <svg className="icon-search">
  26. <use xlinkHref="/icons.svg#search"></use>
  27. </svg>
  28. <input
  29. type="search"
  30. name="q"
  31. placeholder="Search"
  32. value={value}
  33. onChange={handleChange}
  34. />
  35. </form>
  36. );
  37. }