'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 (
{currPage.name}
) } 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 ( {trigger} isMobile && e.preventDefault()} onInteractOutside={() => setOpen(false)} onEscapeKeyDown={(e) => { e.preventDefault() return query ? setQuery('') : page ? popPage() : setOpen(false) }} size={size} className={cn( 'relative my-0 mx-auto rounded-t-lg overflow-y-scroll', 'h-[85dvh] mt-[15vh] md:max-h-[500px] md:mt-0 left-0 bottom-0 md:bottom-auto', 'place-self-end md:place-self-auto', open && '!animate-in !slide-in-from-bottom !duration-300', 'data-[state=closed]:!animate-out data-[state=closed]:!slide-out-to-bottom', 'md:data-[state=open]:!animate-in md:data-[state=closed]:!animate-out', 'md:data-[state=closed]:!zoom-out-95 md:data-[state=open]:!zoom-in-95', 'md:data-[state=closed]:!slide-out-to-left-[0%] md:data-[state=closed]:!slide-out-to-top-[0%]', 'md:data-[state=open]:!slide-in-from-left-[0%] md:data-[state=open]:!slide-in-from-top-[0%]' )} dialogOverlayProps={{ className: cn('overflow-hidden flex data-closed:delay-100'), }} > {children} ) } export { Breadcrumb, CommandMenu, CommandMenuTrigger, CommandWrapper }