import {SearchIcon} from '@sanity/icons' import {APISymbol, SanitySlugValue} from '@sanity/tsdoc' import {TSDocAppParams} from '@sanity/tsdoc/store' import { Autocomplete, BaseAutocompleteOption, Box, Card, Flex, Popover, Stack, Text, } from '@sanity/ui' import {ForwardedRef, forwardRef, useCallback, useMemo, useRef, useState} from 'react' import {UnformattedCode} from '../../components/UnformattedCode' import {useMemberLink} from '../useMemberLink' import {useSymbolSearch} from '../useSymbolSearch' interface TSDocSearchOption extends BaseAutocompleteOption { symbol: APISymbol & {_id: string; members: {exportPath: string; releaseVersion: string}[]} } /** @beta */ export function TSDocSearch(): React.ReactNode { const [query, setQuery] = useState(null) const {data, loading} = useSymbolSearch({query}) const [value, setValue] = useState() const autocompletePopoverReferenceElementRef = useRef(null) const options: TSDocSearchOption[] = useMemo( () => data.map((result) => ({value: result._id, symbol: result})), [data], ) const filterOption = useCallback(() => true, []) const handleSelect = useCallback((value: string) => { setValue(value) setTimeout(() => setValue(''), 0) }, []) const renderOption = useCallback((option: TSDocSearchOption) => { // @ts-expect-error - find a way to fix this return }, []) const renderValue = useCallback(() => '', []) const renderPopover = useCallback( ({content, hidden}: {content: React.ReactNode | null; hidden: boolean}) => { return query ? ( No results for “{query}” ) } referenceElement={autocompletePopoverReferenceElementRef.current} /> ) : null }, [loading, query], ) return (
) } const SearchOption = forwardRef(function SearchOption( props: { symbol: APISymbol & { members: {slug: SanitySlugValue; exportPath: string; releaseVersion: string}[] } }, ref: ForwardedRef, ) { const {symbol, ...restProps} = props const latestMember = symbol.members[0] const params: TSDocAppParams = useMemo( () => ({ exportPath: latestMember ? latestMember.exportPath : '.', packageName: symbol.package.name, packageScope: symbol.package.scope || null, memberName: symbol.name, releaseVersion: latestMember ? latestMember.releaseVersion : '0.0.0', memberSlug: latestMember ? latestMember.slug.current : '', }), [latestMember, symbol], ) const link = useMemberLink({params}) return ( {symbol.name} {[ [ symbol.package.scope, symbol.package.name, latestMember?.exportPath === '.' ? undefined : latestMember?.exportPath.replace('./', '/'), ].filter(Boolean), ]} ) })