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 && (
)}
>
)
}