2019-11-08 03:40:20 +01:00
|
|
|
import React from 'react'
|
2019-12-18 23:54:23 +01:00
|
|
|
import { StatelessComponent, ReactElement, useEffect, useState } from 'react';
|
2019-11-08 03:40:20 +01:00
|
|
|
import { navigateTo } from "gatsby-link"
|
2019-12-18 23:54:23 +01:00
|
|
|
import useHierarchy from '../hooks/useHierarchy';
|
|
|
|
import useDocContext from '../hooks/useDocContext';
|
|
|
|
import { useStaticQuery, graphql } from 'gatsby';
|
2019-11-08 03:40:20 +01:00
|
|
|
|
|
|
|
interface SearchBoxProps {
|
|
|
|
identifier: string;
|
|
|
|
}
|
|
|
|
|
|
|
|
const autocompleteSelected = (e) => {
|
|
|
|
e.stopPropagation()
|
|
|
|
// Use an anchor tag to parse the absolute url (from autocomplete.js) into a relative url
|
|
|
|
// eslint-disable-next-line no-undef
|
|
|
|
const a = document.createElement(`a`)
|
|
|
|
a.href = e._args[0].url
|
|
|
|
navigateTo(`${a.pathname}${a.hash}`)
|
|
|
|
};
|
|
|
|
|
|
|
|
const SearchBox: StatelessComponent<SearchBoxProps> = ({ identifier }): ReactElement|null => {
|
2019-12-18 23:54:23 +01:00
|
|
|
const { getCurrentVersion } = useHierarchy();
|
|
|
|
const [ isFocused, setFocus ] = useState(false);
|
|
|
|
const context = useDocContext();
|
|
|
|
|
2019-11-08 03:40:20 +01:00
|
|
|
useEffect(() => {
|
|
|
|
if (typeof window === 'undefined') return;
|
2019-12-17 02:04:09 +01:00
|
|
|
if (!process.env.GATSBY_DOCSEARCH_API_KEY) {
|
|
|
|
return;
|
|
|
|
}
|
2019-11-08 03:40:20 +01:00
|
|
|
window.addEventListener(
|
|
|
|
`autocomplete:selected`,
|
|
|
|
autocompleteSelected,
|
|
|
|
true
|
|
|
|
);
|
|
|
|
if(window.docsearch){
|
|
|
|
window.docsearch({
|
2019-11-13 00:43:22 +01:00
|
|
|
algoliaOptions: {
|
2019-12-18 23:54:23 +01:00
|
|
|
facetFilters: [
|
|
|
|
`version:${getCurrentVersion()}`,
|
|
|
|
//`context:${context}`,
|
|
|
|
],
|
2019-11-13 00:43:22 +01:00
|
|
|
hitsPerPage: 5,
|
|
|
|
},
|
2019-11-08 03:40:20 +01:00
|
|
|
apiKey: process.env.GATSBY_DOCSEARCH_API_KEY,
|
2019-11-13 00:43:22 +01:00
|
|
|
debug: true,
|
2019-11-08 03:40:20 +01:00
|
|
|
indexName: process.env.GATSBY_DOCSEARCH_INDEX,
|
|
|
|
inputSelector: `#${identifier}`,
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
}, []);
|
|
|
|
|
2019-12-18 23:54:23 +01:00
|
|
|
const handleFocus = () => setFocus(true);
|
|
|
|
const handleBlur = (e) => {
|
|
|
|
if (!e.target.value.trim()) {
|
|
|
|
setFocus(false);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2019-11-08 03:40:20 +01:00
|
|
|
return (
|
2019-12-18 23:54:23 +01:00
|
|
|
<>
|
|
|
|
<label className={ isFocused ? `hide` : `show` } htmlFor={identifier}>Search...</label>
|
2019-11-08 03:40:20 +01:00
|
|
|
<input
|
|
|
|
id={identifier}
|
|
|
|
type="search"
|
|
|
|
className="form-control search-input"
|
2019-12-18 23:54:23 +01:00
|
|
|
onFocus={handleFocus}
|
|
|
|
onBlur={handleBlur}
|
2019-11-08 03:40:20 +01:00
|
|
|
/>
|
2019-12-18 23:54:23 +01:00
|
|
|
</>
|
2019-11-08 03:40:20 +01:00
|
|
|
)
|
|
|
|
};
|
|
|
|
|
|
|
|
export default SearchBox;
|