import React, { useRef, useCallback, useState } from "react"; import classnames from "classnames"; import { useHistory } from "@docusaurus/router"; import useDocusaurusContext from "@docusaurus/useDocusaurusContext"; import { usePluginData } from '@docusaurus/useGlobalData'; import useIsBrowser from "@docusaurus/useIsBrowser"; const Search = props => { const initialized = useRef(false); const searchBarRef = useRef(null); const [indexReady, setIndexReady] = useState(false); const history = useHistory(); const { siteConfig = {} } = useDocusaurusContext(); const isBrowser = useIsBrowser(); const { baseUrl } = siteConfig; const initAlgolia = (searchDocs, searchIndex, DocSearch) => { new DocSearch({ searchDocs, searchIndex, baseUrl, inputSelector: "#search_input_react", // Override algolia's default selection event, allowing us to do client-side // navigation and avoiding a full page refresh. handleSelected: (_input, _event, suggestion) => { const url = suggestion.url || "/"; // Use an anchor tag to parse the absolute url into a relative url // Alternatively, we can use new URL(suggestion.url) but its not supported in IE const a = document.createElement("a"); a.href = url; // Algolia use closest parent element id #__docusaurus when a h1 page title does not have an id // So, we can safely remove it. See https://github.com/facebook/docusaurus/issues/1828 for more details. history.push(url); } }); }; const pluginData = usePluginData('docusaurus-lunr-search'); const getSearchDoc = () => process.env.NODE_ENV === "production" ? fetch(`${baseUrl}${pluginData.fileNames.searchDoc}`).then((content) => content.json()) : Promise.resolve([]); const getLunrIndex = () => process.env.NODE_ENV === "production" ? fetch(`${baseUrl}${pluginData.fileNames.lunrIndex}`).then((content) => content.json()) : Promise.resolve([]); const loadAlgolia = () => { if (!initialized.current) { Promise.all([ getSearchDoc(), getLunrIndex(), import("./DocSearch"), import("./algolia.css") ]).then(([searchDocs, searchIndex, { default: DocSearch }]) => { if (searchDocs.length === 0) { return; } initAlgolia(searchDocs, searchIndex, DocSearch); setIndexReady(true); }); initialized.current = true; } }; const toggleSearchIconClick = useCallback( e => { if (!searchBarRef.current.contains(e.target)) { searchBarRef.current.focus(); } props.handleSearchBarToggle && props.handleSearchBarToggle(!props.isSearchBarExpanded); }, [props.isSearchBarExpanded] ); if (isBrowser) { loadAlgolia(); } return (
); }; export default Search;