Skip to content

Commit

Permalink
feat(docsearch): add DocSearch component
Browse files Browse the repository at this point in the history
  • Loading branch information
francoischalifour committed May 14, 2020
1 parent adadacd commit 65a98b0
Show file tree
Hide file tree
Showing 3 changed files with 59 additions and 15 deletions.
54 changes: 54 additions & 0 deletions src/DocSearch.tsx
@@ -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
)}
</>
);
}
17 changes: 3 additions & 14 deletions src/DocSearchModal.tsx
Expand Up @@ -2,7 +2,6 @@ import React from 'react';
import {
createAutocomplete,
AutocompleteState,
PublicAutocompleteOptions,
} from '@francoischalifour/autocomplete-core';
import { getAlgoliaHits } from '@francoischalifour/autocomplete-preset-algolia';

Expand All @@ -17,24 +16,14 @@ import { createStoredSearches } from './stored-searches';
import { useSearchClient } from './useSearchClient';
import { useTrapFocus } from './useTrapFocus';
import { useTouchEvents } from './useTouchEvents';
import { DocSearchProps } from './DocSearch';
import { Hit } from './Hit';
import { SearchBox } from './SearchBox';
import { ScreenState } from './ScreenState';
import { Footer } from './Footer';

interface DocSearchProps
extends Pick<PublicAutocompleteOptions<InternalDocSearchHit>, 'navigator'> {
appId?: string;
apiKey: string;
indexName: string;
placeholder?: string;
searchParameters?: any;
interface DocSearchModalProps extends DocSearchProps {
onClose?(): void;
transformItems?(items: DocSearchHit[]): DocSearchHit[];
hitComponent?(props: {
hit: DocSearchHit;
children: React.ReactNode;
}): JSX.Element;
}

export function DocSearchModal({
Expand All @@ -47,7 +36,7 @@ export function DocSearchModal({
transformItems = (x) => x,
hitComponent = Hit,
navigator,
}: DocSearchProps) {
}: DocSearchModalProps) {
const [state, setState] = React.useState<
AutocompleteState<InternalDocSearchHit>
>({
Expand Down
3 changes: 2 additions & 1 deletion src/index.ts
@@ -1,3 +1,4 @@
export * from './DocSearchModal';
export * from './DocSearch';
export * from './DocSearchButton';
export * from './DocSearchModal';
export * from './useDocSearchKeyboardEvents';

0 comments on commit 65a98b0

Please sign in to comment.