Skip to content
Snippets Groups Projects
Search.tsx 2.91 KiB
Newer Older
import React, { Fragment, useState } from "react";
import { InstantSearch, Configure } from "react-instantsearch-dom";
import Autocomplete from "./search/autocomplete";
import { Dialog, Transition } from "@headlessui/react";
import { SearchIcon } from "@heroicons/react/outline";
// @ts-ignore
import typesenseAdapter from "../../typesense";

interface Props {}

const Search = (props: Props) => {
  const searchClient = typesenseAdapter.searchClient;
  // @ts-ignore
  const [query, setQuery] = useState("");
  const [searchBarActive, setSearchBarActive] = useState(false);
  const [open, setOpen] = useState(false);

  return (
    <>
      <section className="my-4 flex w-full">
        <button
          onClick={() => {
            setOpen(!open);
          }}
          type="submit"
          className="z-50 px-4 outline-none focus:outline-none active:outline-none"
        >
          <SearchIcon
            className="h-6 w-6 dark:text-gray-200"
            aria-hidden="true"
          />
        </button>
      </section>
      <Transition.Root
        show={open}
        as={Fragment}
        afterLeave={() => setQuery("")}
      >
        <Dialog
          as="div"
          className="fixed inset-0 z-10 overflow-y-auto p-4 sm:p-6 md:p-20"
          onClose={setOpen}
        >
          <Transition.Child
            as={Fragment}
            enter="ease-out duration-300"
            enterFrom="opacity-0"
            enterTo="opacity-100"
            leave="ease-in duration-300"
            leaveFrom="opacity-100"
            leaveTo="opacity-0"
          >
            <Dialog.Overlay className="fixed inset-0 bg-gray-500 bg-opacity-25 transition-opacity blur" />
          </Transition.Child>

          <Transition.Child
            as={Fragment}
            enter="ease-out duration-300"
            enterFrom="opacity-0 scale-95"
            enterTo="opacity-100 scale-100"
            leave="ease-in duration-200"
            leaveFrom="opacity-100 scale-100"
            leaveTo="opacity-0 scale-95"
          >
            <section className="my-4 flex justify-center">
              <InstantSearch searchClient={searchClient} indexName="pages_v1">
                <Configure hitsPerPage={5} />
                <Autocomplete
                  // @ts-ignore
                  onSuggestionSelected={setQuery}
                  onSuggestionCleared={setQuery}
                />
                <button
                  type="submit"
                  className="-mx-10 z-50 outline-none focus:outline-none active:outline-none dark:color-gray-100 dark:border-gray-100"
                >
                  <SearchIcon
                    className="h-6 w-6 dark:color-gray-100 dark:border-gray-100"
                    aria-hidden="true"
                  />
                </button>
              </InstantSearch>
            </section>
          </Transition.Child>
        </Dialog>
      </Transition.Root>
    </>
export default Search;