'use client'
import { AlertTriangle, ArrowLeft } from 'lucide-react'
import { type PropsWithChildren, type ReactNode, forwardRef, memo, useEffect, useMemo } from 'react'
import { ErrorBoundary } from 'react-error-boundary'
import { useBreakpoint } from 'common'
import useDragToClose from 'common/hooks/useDragToClose'
import { Button, Command_Shadcn_, Dialog, DialogContent, DialogTrigger, cn } from 'ui'
import { useCurrentPage, usePageComponent, usePopPage } from './hooks/pagesHooks'
import { useQuery, useSetQuery } from './hooks/queryHooks'
import {
useCommandMenuSize,
useCommandMenuOpen,
useSetCommandMenuOpen,
useSetupCommandMenuTouchEvents,
} from './hooks/viewHooks'
import { PageType } from './utils'
function Breadcrumb({ className }: { className?: string }) {
const currPage = useCurrentPage()
const popPage = usePopPage()
if (!currPage) return
return (
)
}
const CommandWrapper = forwardRef<
React.ElementRef,
React.ComponentPropsWithoutRef
>(({ children, className, ...props }, ref) => {
const currPage = useCurrentPage()
return (
{currPage?.type === PageType.Commands && }
{children}
)
})
CommandWrapper.displayName = Command_Shadcn_.displayName
function CommandError({ resetErrorBoundary }: { resetErrorBoundary: () => void }) {
return (
Sorry, looks like we're having some issues with the command menu!
Please try again in a bit.
)
}
function PageSwitch({ children }: PropsWithChildren) {
const PageComponent = usePageComponent()
return PageComponent ? : {children}
}
function useTouchGestures({ toggleOpen }: { toggleOpen: () => void }) {
const { ref, handleTouchStart, handleTouchMove, handleTouchEnd } = useDragToClose({
onClose: toggleOpen,
})
const setupTouchHandlers = useSetupCommandMenuTouchEvents()
const touchHandlers = useMemo(
() => ({ handleTouchStart, handleTouchMove, handleTouchEnd }),
[handleTouchStart, handleTouchMove, handleTouchEnd]
)
useEffect(() => {
setupTouchHandlers(touchHandlers)
}, [touchHandlers])
return { ref }
}
const CommandMenuTrigger = memo(DialogTrigger)
interface CommandMenuProps extends PropsWithChildren {
trigger?: ReactNode
}
function CommandMenu({ children, trigger }: CommandMenuProps) {
const open = useCommandMenuOpen()
const setOpen = useSetCommandMenuOpen()
const isMobile = useBreakpoint()
const size = useCommandMenuSize()
const page = useCurrentPage()
const popPage = usePopPage()
const query = useQuery()
const setQuery = useSetQuery()
const { ref: contentRef } = useTouchGestures({ toggleOpen: () => setOpen(!open) })
return (
)
}
export { Breadcrumb, CommandMenu, CommandMenuTrigger, CommandWrapper }