import * as React from 'react' import { useHotkeys } from 'react-hotkeys-hook' import { getPageBreadcrumbs } from 'notion-utils' import * as types from 'notion-types' import { useNotionContext } from '../context' import { PageIcon } from './page-icon' import { SearchIcon } from '../icons/search-icon' import { cs } from '../utils' import { SearchDialog } from './search-dialog' import { SearchNotionFn } from '../types' export const Header: React.FC<{ block: types.CollectionViewPageBlock | types.PageBlock }> = ({ block }) => { return (
) } export const Breadcrumbs: React.FC<{ block: types.Block rootOnly?: boolean }> = ({ block, rootOnly = false }) => { const { recordMap, mapPageUrl, components } = useNotionContext() const breadcrumbs = React.useMemo(() => { const breadcrumbs = getPageBreadcrumbs(recordMap, block.id) if (rootOnly) { return [breadcrumbs[0]].filter(Boolean) } return breadcrumbs }, [recordMap, block.id, rootOnly]) return (
{breadcrumbs.map((breadcrumb, index: number) => { if (!breadcrumb) { return null } const pageLinkProps: any = {} const componentMap = { pageLink: components.PageLink } if (breadcrumb.active) { componentMap.pageLink = (props) =>
} else { pageLinkProps.href = mapPageUrl(breadcrumb.pageId) } return ( {breadcrumb.icon && ( )} {breadcrumb.title && ( {breadcrumb.title} )} {index < breadcrumbs.length - 1 && ( / )} ) })}
) } export const Search: React.FC<{ block: types.Block search?: SearchNotionFn title?: React.ReactNode }> = ({ block, search, title = 'Search' }) => { const { searchNotion, rootPageId } = useNotionContext() const onSearchNotion = search || searchNotion const [isSearchOpen, setIsSearchOpen] = React.useState(false) const onOpenSearch = React.useCallback(() => { setIsSearchOpen(true) }, []) const onCloseSearch = React.useCallback(() => { setIsSearchOpen(false) }, []) useHotkeys('cmd+p', (event) => { onOpenSearch() event.preventDefault() event.stopPropagation() }) useHotkeys('cmd+k', (event) => { onOpenSearch() event.preventDefault() event.stopPropagation() }) const hasSearch = !!onSearchNotion return ( <> {hasSearch && (
{title && {title}}
)} {isSearchOpen && hasSearch && ( )} ) }