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;