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

interface Props {}

const Search = (props: Props) => {
Toavina's avatar
Toavina committed
    const searchClient = typesenseAdapter.searchClient
    // @ts-ignore
    const [query, setQuery] = useState("")
    const [searchBarActive, setSearchBarActive] = useState(false)
    const [open, setOpen] = useState(false)
Toavina's avatar
Toavina committed
    return (
        <>
            <section className="my-4 flex w-full">
Toavina's avatar
Toavina committed
                    onClick={() => {
                        setOpen(!open)
                    }}
                    type="submit"
                    className="z-50 px-4 outline-none focus:outline-none active:outline-none"
Toavina's avatar
Toavina committed
                    <SearchIcon
                        className="h-6 w-6 dark:text-gray-200"
                        aria-hidden="true"
                    />
                </button>
            </section>
Toavina's avatar
Toavina committed
            <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>
        </>
    )
}
Toavina's avatar
Toavina committed
export default Search