import { useState, useEffect, useCallback, Fragment } from "react"; import { useTranslation } from "next-i18next"; import { FiSearch } from "react-icons/fi"; import { SiDuckduckgo, SiMicrosoftbing, SiGoogle, SiBaidu, SiBrave } from "react-icons/si"; import { Listbox, Transition } from "@headlessui/react"; import classNames from "classnames"; import ContainerForm from "../widget/container_form"; import Raw from "../widget/raw"; export const searchProviders = { google: { name: "Google", url: "https://www.google.com/search?q=", icon: SiGoogle, }, duckduckgo: { name: "DuckDuckGo", url: "https://duckduckgo.com/?q=", icon: SiDuckduckgo, }, bing: { name: "Bing", url: "https://www.bing.com/search?q=", icon: SiMicrosoftbing, }, baidu: { name: "Baidu", url: "https://www.baidu.com/s?wd=", icon: SiBaidu, }, brave: { name: "Brave", url: "https://search.brave.com/search?q=", icon: SiBrave, }, custom: { name: "Custom", url: false, icon: FiSearch, }, }; function getAvailableProviderIds(options) { if (options.provider && Array.isArray(options.provider)) { return Object.keys(searchProviders).filter((value) => options.provider.includes(value)); } if (options.provider && searchProviders[options.provider]) { return [options.provider]; } return null; } const localStorageKey = "search-name"; export function getStoredProvider() { if (typeof window !== 'undefined') { const storedName = localStorage.getItem(localStorageKey); if (storedName) { return Object.values(searchProviders).find((el) => el.name === storedName); } } return null; } export default function Search({ options }) { const { t } = useTranslation(); const availableProviderIds = getAvailableProviderIds(options); const [query, setQuery] = useState(""); const [selectedProvider, setSelectedProvider] = useState(searchProviders[availableProviderIds[0] ?? searchProviders.google]); useEffect(() => { const storedProvider = getStoredProvider(); let storedProviderKey = null; storedProviderKey = Object.keys(searchProviders).find((pkey) => searchProviders[pkey] === storedProvider); if (storedProvider && availableProviderIds.includes(storedProviderKey)) { setSelectedProvider(storedProvider); } }, [availableProviderIds]); const submitCallback = useCallback(event => { const q = encodeURIComponent(query); const { url } = selectedProvider; if (url) { window.open(`${url}${q}`, options.target || "_blank"); } else { window.open(`${options.url}${q}`, options.target || "_blank"); } event.preventDefault(); event.target.reset(); setQuery(""); }, [options.target, options.url, query, selectedProvider]); if (!availableProviderIds) { return null; } const onChangeProvider = (provider) => { setSelectedProvider(provider); localStorage.setItem(localStorageKey, provider.name); } return
setQuery(s.currentTarget.value)} required autoCapitalize="off" autoCorrect="off" autoComplete="off" // eslint-disable-next-line jsx-a11y/no-autofocus autoFocus={options.focus} />
{t("search.search")}
{availableProviderIds.map((providerId) => { const p = searchProviders[providerId]; return ( {({ active }) => (
  • )}
    ); })}
    ; }