import { ChevronLeft, Code } from 'lucide-react'
import { useMemo, useState, type PropsWithChildren, type ReactNode } from 'react'
import {
Alert,
AlertDescription,
AlertTitle,
Button,
cn,
Popover,
PopoverContent,
PopoverTrigger,
} from 'ui'
import { navigateToSection } from './Content/Content.utils'
import { DOCS_RESOURCE_CONTENT } from './ProjectAPIDocs.constants'
import { DocsButton } from '@/components/ui/DocsButton'
import { useAppStateSnapshot } from '@/state/app-state'
type DocsResourceContentItem = (typeof DOCS_RESOURCE_CONTENT)[keyof typeof DOCS_RESOURCE_CONTENT]
export type MenuItemFilter = (item: DocsResourceContentItem) => boolean
export type ResourcePickerRenderProps = {
selectedResource?: string
onSelect: (value: string) => void
closePopover: () => void
}
type SecondLevelNavLayoutProps = {
category: string
title: string
docsUrl: string
menuItemFilter?: MenuItemFilter
renderResourceList: (props: ResourcePickerRenderProps) => ReactNode
}
export const SecondLevelNavLayout = ({
category,
title,
docsUrl,
menuItemFilter,
renderResourceList,
}: SecondLevelNavLayoutProps) => {
const snap = useAppStateSnapshot()
const [, resource] = snap.activeDocsSection
return (
)
}
const SecondLevelNavOuterContainer = ({ children }: PropsWithChildren) => {
return
{children}
}
type SecondLevelLevelNavInnerContainerProps = PropsWithChildren<{
className?: string
}>
const SecondLevelNavInnerContainer = ({
children,
className,
}: SecondLevelLevelNavInnerContainerProps) => {
return {children}
}
type ResourcePickerProps = {
category: string
resource?: string
renderResourceList: (props: ResourcePickerRenderProps) => ReactNode
}
type NavTitleProps = {
title: string
category: string
}
const NavTitle = ({ title, category }: NavTitleProps) => {
const snap = useAppStateSnapshot()
const handleBack = () => {
snap.setActiveDocsSection([category])
}
return (
} className="px-1" onClick={handleBack} />
{title}
)
}
const ResourcePicker = ({ category, resource, renderResourceList }: ResourcePickerProps) => {
const snap = useAppStateSnapshot()
const [open, setOpen] = useState(false)
const handleSelect = (value: string) => {
snap.setActiveDocsSection([category, value])
setOpen(false)
}
return (
}
>
{resource ?? 'Select a resource'}
{renderResourceList({
selectedResource: resource,
onSelect: handleSelect,
closePopover: () => setOpen(false),
})}
)
}
type MenuItemsProps = {
category: string
menuItemFilter?: MenuItemFilter
}
const MenuItems = ({ category, menuItemFilter }: MenuItemsProps) => {
const menuItems = useMemo(() => {
const items = Object.values(DOCS_RESOURCE_CONTENT).filter(
(content) => content.category === category
)
return menuItemFilter ? items.filter(menuItemFilter) : items
}, [category, menuItemFilter])
return (
{menuItems.map((item) => (
))}
)
}
type MoreInformationProps = {
docsUrl: string
}
const MoreInformation = ({ docsUrl }: MoreInformationProps) => {
return (
Unable to find what you're looking for?
The API methods shown here are only the commonly used ones to get you started building
quickly.
Head over to our docs site for the full API documentation.
)
}