Add info about github action. Make a search placeholder waiting for access to algolia docsearch.
		
			
				
	
	
		
			121 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			121 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
/**
 | 
						|
 * Copyright (c) Facebook, Inc. and its affiliates.
 | 
						|
 *
 | 
						|
 * This source code is licensed under the MIT license found in the
 | 
						|
 * LICENSE file in the root directory of this source tree.
 | 
						|
 */
 | 
						|
 | 
						|
import React, { useState, useRef, useCallback } from "react";
 | 
						|
import classnames from "classnames";
 | 
						|
 | 
						|
import { useHistory } from "react-router-dom";
 | 
						|
 | 
						|
import "./styles.css";
 | 
						|
 | 
						|
const algolia = {
 | 
						|
  // TODO
 | 
						|
};
 | 
						|
 | 
						|
const Search = (props) => {
 | 
						|
  const [algoliaLoaded, setAlgoliaLoaded] = useState(false);
 | 
						|
  const searchBarRef = useRef(null);
 | 
						|
  const history = useHistory();
 | 
						|
 | 
						|
  function initAlgolia(focus) {
 | 
						|
    window.docsearch({
 | 
						|
      appId: algolia.appId,
 | 
						|
      apiKey: algolia.apiKey,
 | 
						|
      indexName: algolia.indexName,
 | 
						|
      inputSelector: "#search_input_react",
 | 
						|
      algoliaOptions: algolia.algoliaOptions,
 | 
						|
      // Override algolia's default selection event, allowing us to do client-side
 | 
						|
      // navigation and avoiding a full page refresh.
 | 
						|
      handleSelected: (_input, _event, suggestion) => {
 | 
						|
        // Use an anchor tag to parse the absolute url into a relative url
 | 
						|
        // Alternatively, we can use new URL(suggestion.url) but it's not supported in IE.
 | 
						|
        const a = document.createElement("a");
 | 
						|
        a.href = suggestion.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.
 | 
						|
        const routePath =
 | 
						|
          `#__docusaurus` === a.hash
 | 
						|
            ? `${a.pathname}`
 | 
						|
            : `${a.pathname}${a.hash}`;
 | 
						|
        history.push(routePath);
 | 
						|
      },
 | 
						|
    });
 | 
						|
 | 
						|
    if (focus) {
 | 
						|
      searchBarRef.current.focus();
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  const loadAlgolia = (focus = true) => {
 | 
						|
    if (algoliaLoaded) {
 | 
						|
      return;
 | 
						|
    }
 | 
						|
 | 
						|
    Promise.all([import("docsearch.js"), import("./algolia.css")]).then(
 | 
						|
      ([{ default: docsearch }]) => {
 | 
						|
        setAlgoliaLoaded(true);
 | 
						|
        window.docsearch = docsearch;
 | 
						|
        initAlgolia(focus);
 | 
						|
      }
 | 
						|
    );
 | 
						|
  };
 | 
						|
 | 
						|
  const handleSearchIcon = useCallback(() => {
 | 
						|
    loadAlgolia();
 | 
						|
 | 
						|
    if (algoliaLoaded) {
 | 
						|
      searchBarRef.current.focus();
 | 
						|
    }
 | 
						|
 | 
						|
    props.handleSearchBarToggle(!props.isSearchBarExpanded);
 | 
						|
  }, [props.isSearchBarExpanded]);
 | 
						|
 | 
						|
  const handleSearchInputBlur = useCallback(() => {
 | 
						|
    props.handleSearchBarToggle(!props.isSearchBarExpanded);
 | 
						|
  }, [props.isSearchBarExpanded]);
 | 
						|
 | 
						|
  const handleSearchInput = useCallback((e) => {
 | 
						|
    const needFocus = e.type !== "mouseover";
 | 
						|
 | 
						|
    loadAlgolia(needFocus);
 | 
						|
  });
 | 
						|
 | 
						|
  return (
 | 
						|
    <div className="navbar__search" key="search-box">
 | 
						|
      <span
 | 
						|
        aria-label="expand searchbar"
 | 
						|
        role="button"
 | 
						|
        className={classnames("search-icon", {
 | 
						|
          "search-icon-hidden": props.isSearchBarExpanded,
 | 
						|
        })}
 | 
						|
        onClick={handleSearchIcon}
 | 
						|
        onKeyDown={handleSearchIcon}
 | 
						|
        tabIndex={0}
 | 
						|
      />
 | 
						|
      <input
 | 
						|
        id="search_input_react"
 | 
						|
        type="search"
 | 
						|
        placeholder="Search"
 | 
						|
        aria-label="Search"
 | 
						|
        className={classnames(
 | 
						|
          "navbar__search-input",
 | 
						|
          { "search-bar-expanded": props.isSearchBarExpanded },
 | 
						|
          { "search-bar": !props.isSearchBarExpanded }
 | 
						|
        )}
 | 
						|
        onMouseOver={handleSearchInput}
 | 
						|
        onFocus={handleSearchInput}
 | 
						|
        onBlur={handleSearchInputBlur}
 | 
						|
        ref={searchBarRef}
 | 
						|
      />
 | 
						|
    </div>
 | 
						|
  );
 | 
						|
};
 | 
						|
 | 
						|
export default Search;
 |