import React, { useEffect, useRef, useState } from 'react';
import {
Box,
Flex,
Portal,
space,
Fade,
themeColor,
color,
BoxProps,
Grid,
Stack,
} from '@stacks/ui';
import { useDocSearchKeyboardEvents } from '@docsearch/react';
import { Text } from '@components/typography';
import { SearchIcon } from '@components/icons/search';
import Router from 'next/router';
import Link from 'next/link';
import { getCapsizeStyles } from '@components/mdx/typography';
import { useAppState } from '@common/hooks/use-app-state';
import { css, Theme } from '@stacks/ui-core';
import { SEARCH_DOCS } from '@common/constants_that_require_translations';
const getLocalUrl = href => {
const _url = new URL(href);
const url = href
.replace(_url.origin, '')
.replace('#__next', '')
.replace('.html', '')
.replace('storage/clidocs', 'core/cmdLineRef');
return url;
};
function Hit({ hit, children }: any) {
const url = getLocalUrl(hit.url);
return (
{children}
);
}
const navigator = {
navigate: async ({ suggestionUrl }: any) => {
const url = getLocalUrl(suggestionUrl);
return Router.push(url, url);
},
};
const Key: React.FC = React.memo(({ children, ...rest }) => (
{children}
));
const searchOptions = {
apiKey: '9040ba6d60f5ecb36eafc26396288875',
indexName: 'blockstack',
navigator,
};
let DocSearchModal: any = null;
export const SearchBox: React.FC = React.memo(props => {
const { setState, searchModal } = useAppState();
const importDocSearchModalIfNeeded = React.useCallback(function importDocSearchModalIfNeeded() {
if (DocSearchModal) {
return Promise.resolve();
}
return Promise.all([import('@docsearch/react/modal')]).then(([{ DocSearchModal: Modal }]) => {
DocSearchModal = Modal;
});
}, []);
const onOpen = React.useCallback(
function onOpen() {
void importDocSearchModalIfNeeded().then(() => {
console.log('reopening');
setState(state => ({ ...state, searchModal: 'open' }));
});
},
[importDocSearchModalIfNeeded]
);
const onClose = React.useCallback(
function onClose() {
setState(state => ({ ...state, searchModal: 'closed' }));
},
[setState]
);
useEffect(() => {
if (searchModal === 'open') onOpen();
}, [searchModal]);
const searchButtonRef = React.useRef(null);
const isOpen = Boolean(searchModal === 'open' && DocSearchModal);
useDocSearchKeyboardEvents({ isOpen, onOpen, onClose, searchButtonRef });
return (
<>
{styles => (
css({
'.DocSearch.DocSearch-Container': {
position: 'fixed',
},
})(theme)
}
>
)}
{SEARCH_DOCS}
⌘
K
>
);
});
export default SearchBox;