feat(docsearch): add DocSearch component
This commit is contained in:
parent
adadacd531
commit
65a98b07ed
3 changed files with 59 additions and 15 deletions
54
src/DocSearch.tsx
Normal file
54
src/DocSearch.tsx
Normal file
|
|
@ -0,0 +1,54 @@
|
||||||
|
import React from 'react';
|
||||||
|
import { createPortal } from 'react-dom';
|
||||||
|
import { PublicAutocompleteOptions } from '@francoischalifour/autocomplete-core';
|
||||||
|
|
||||||
|
import { DocSearchHit, InternalDocSearchHit } from './types';
|
||||||
|
import { DocSearchButton } from './DocSearchButton';
|
||||||
|
import { DocSearchModal } from './DocSearchModal';
|
||||||
|
import { useDocSearchKeyboardEvents } from './useDocSearchKeyboardEvents';
|
||||||
|
|
||||||
|
export interface DocSearchProps
|
||||||
|
extends Pick<PublicAutocompleteOptions<InternalDocSearchHit>, 'navigator'> {
|
||||||
|
appId?: string;
|
||||||
|
apiKey: string;
|
||||||
|
indexName: string;
|
||||||
|
placeholder?: string;
|
||||||
|
searchParameters?: any;
|
||||||
|
transformItems?(items: DocSearchHit[]): DocSearchHit[];
|
||||||
|
hitComponent?(props: {
|
||||||
|
hit: DocSearchHit;
|
||||||
|
children: React.ReactNode;
|
||||||
|
}): JSX.Element;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function DocSearch(props: DocSearchProps) {
|
||||||
|
const [isOpen, setIsOpen] = React.useState(false);
|
||||||
|
|
||||||
|
const onOpen = React.useCallback(
|
||||||
|
function onOpen() {
|
||||||
|
setIsOpen(true);
|
||||||
|
},
|
||||||
|
[setIsOpen]
|
||||||
|
);
|
||||||
|
|
||||||
|
const onClose = React.useCallback(
|
||||||
|
function onClose() {
|
||||||
|
setIsOpen(false);
|
||||||
|
},
|
||||||
|
[setIsOpen]
|
||||||
|
);
|
||||||
|
|
||||||
|
useDocSearchKeyboardEvents({ isOpen, onOpen, onClose });
|
||||||
|
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<DocSearchButton onClick={onOpen} />
|
||||||
|
|
||||||
|
{isOpen &&
|
||||||
|
createPortal(
|
||||||
|
<DocSearchModal {...props} onClose={onClose} />,
|
||||||
|
document.body
|
||||||
|
)}
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
@ -2,7 +2,6 @@ import React from 'react';
|
||||||
import {
|
import {
|
||||||
createAutocomplete,
|
createAutocomplete,
|
||||||
AutocompleteState,
|
AutocompleteState,
|
||||||
PublicAutocompleteOptions,
|
|
||||||
} from '@francoischalifour/autocomplete-core';
|
} from '@francoischalifour/autocomplete-core';
|
||||||
import { getAlgoliaHits } from '@francoischalifour/autocomplete-preset-algolia';
|
import { getAlgoliaHits } from '@francoischalifour/autocomplete-preset-algolia';
|
||||||
|
|
||||||
|
|
@ -17,24 +16,14 @@ import { createStoredSearches } from './stored-searches';
|
||||||
import { useSearchClient } from './useSearchClient';
|
import { useSearchClient } from './useSearchClient';
|
||||||
import { useTrapFocus } from './useTrapFocus';
|
import { useTrapFocus } from './useTrapFocus';
|
||||||
import { useTouchEvents } from './useTouchEvents';
|
import { useTouchEvents } from './useTouchEvents';
|
||||||
|
import { DocSearchProps } from './DocSearch';
|
||||||
import { Hit } from './Hit';
|
import { Hit } from './Hit';
|
||||||
import { SearchBox } from './SearchBox';
|
import { SearchBox } from './SearchBox';
|
||||||
import { ScreenState } from './ScreenState';
|
import { ScreenState } from './ScreenState';
|
||||||
import { Footer } from './Footer';
|
import { Footer } from './Footer';
|
||||||
|
|
||||||
interface DocSearchProps
|
interface DocSearchModalProps extends DocSearchProps {
|
||||||
extends Pick<PublicAutocompleteOptions<InternalDocSearchHit>, 'navigator'> {
|
|
||||||
appId?: string;
|
|
||||||
apiKey: string;
|
|
||||||
indexName: string;
|
|
||||||
placeholder?: string;
|
|
||||||
searchParameters?: any;
|
|
||||||
onClose?(): void;
|
onClose?(): void;
|
||||||
transformItems?(items: DocSearchHit[]): DocSearchHit[];
|
|
||||||
hitComponent?(props: {
|
|
||||||
hit: DocSearchHit;
|
|
||||||
children: React.ReactNode;
|
|
||||||
}): JSX.Element;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export function DocSearchModal({
|
export function DocSearchModal({
|
||||||
|
|
@ -47,7 +36,7 @@ export function DocSearchModal({
|
||||||
transformItems = (x) => x,
|
transformItems = (x) => x,
|
||||||
hitComponent = Hit,
|
hitComponent = Hit,
|
||||||
navigator,
|
navigator,
|
||||||
}: DocSearchProps) {
|
}: DocSearchModalProps) {
|
||||||
const [state, setState] = React.useState<
|
const [state, setState] = React.useState<
|
||||||
AutocompleteState<InternalDocSearchHit>
|
AutocompleteState<InternalDocSearchHit>
|
||||||
>({
|
>({
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,4 @@
|
||||||
export * from './DocSearchModal';
|
export * from './DocSearch';
|
||||||
export * from './DocSearchButton';
|
export * from './DocSearchButton';
|
||||||
|
export * from './DocSearchModal';
|
||||||
export * from './useDocSearchKeyboardEvents';
|
export * from './useDocSearchKeyboardEvents';
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue