import { useRouter } from 'next/router' import * as React from 'react' import { ElementRef, useRef } from 'react' import { IconHome } from '../Icon/icons/IconHome' import { IconArrowRight } from './../Icon/icons/IconArrowRight' import { IconBook } from './../Icon/icons/IconBook' import { IconColumns } from './../Icon/icons/IconColumns' import { IconInbox } from './../Icon/icons/IconInbox' import { IconLifeBuoy } from './../Icon/icons/IconLifeBuoy' import { IconMonitor } from './../Icon/icons/IconMonitor' import { IconPhone } from './../Icon/icons/IconPhone' import { IconUser } from './../Icon/icons/IconUser' import { IconKey } from './../Icon/icons/IconKey' import AiCommand from './AiCommand' import sharedItems from './utils/shared-nav-items.json' import { AiIcon } from './Command.icons' import { CommandDialog, CommandGroup, CommandInput, CommandItem, CommandLabel, CommandList, } from './Command.utils' import { COMMAND_ROUTES } from './Command.constants' import { useCommandMenu } from './CommandMenuProvider' import DocsSearch from './DocsSearch' import GenerateSQL from './GenerateSQL' import ThemeOptions from './ThemeOptions' import APIKeys from './APIKeys' import SearchableStudioItems from './SearchableStudioItems' import CommandMenuShortcuts from './CommandMenuShortcuts' export const CHAT_ROUTES = [ COMMAND_ROUTES.AI, // this one is temporary COMMAND_ROUTES.AI_ASK_ANYTHING, COMMAND_ROUTES.AI_RLS_POLICY, COMMAND_ROUTES.GENERATE_SQL, ] const iconPicker: { [key: string]: React.ReactNode } = { arrowRight: , book: , inbox: , mobile: , person: , services: , contact: , icon: , products: , } interface CommandMenuProps { projectRef?: string } const CommandMenu = ({ projectRef }: CommandMenuProps) => { const router = useRouter() const commandInputRef = useRef>(null) const { isOpen, setIsOpen, search, setSearch, pages, setPages, currentPage, site } = useCommandMenu() const showCommandInput = !currentPage || !CHAT_ROUTES.includes(currentPage) return ( <> { setIsOpen(!open) }} size={'xlarge'} className={'max-h-[70vh] lg:max-h-[50vh] overflow-hidden overflow-y-auto'} > {pages.length > 0 && } {showCommandInput && ( )} {!currentPage && ( <> { setPages([...pages, COMMAND_ROUTES.AI]) }} forceMount > Ask Supabase AI {search ? ( <> {': '} {search} ) : ( '...' )} setPages([...pages, COMMAND_ROUTES.DOCS_SEARCH])} forceMount > Search the docs {search ? ( <> {': '} {search} ) : ( '...' )} {site === 'docs' && ( {sharedItems.quickstarts.map((item) => ( router.push(item.url)}> Start with {item.label} ))} )} {site === 'docs' && ( {sharedItems.projectTools.map((item) => ( router.push(item.url)}> {item.label} ))} )} {site === 'docs' && ( {sharedItems.tools.map((item) => ( router.push(item.url)}> Go to {item.label} ))} )} {site === 'studio' && ( setPages([...pages, COMMAND_ROUTES.GENERATE_SQL])} > Generate SQL with Supabase AI )} {site === 'studio' && projectRef !== undefined && ( setPages([...pages, COMMAND_ROUTES.API_KEYS])} > Get API keys )} {site === 'studio' && ( {sharedItems.tools.map((item) => { const itemUrl = ( projectRef ? item.url.replace('_', projectRef) : item.url ).split('https://app.supabase.com')[1] return ( { router.push(item.url) setIsOpen(false) }} > Go to {item.label} ) })} )} {/* */} {sharedItems.support.map((item) => ( router.push(item.url)}> Go to {item.label} ))} {site === 'docs' && ( {sharedItems.docsGeneral.map((item) => ( router.push(item.url)}> {item?.icon && iconPicker[item.icon]} {item.label} ))} )} setPages([...pages, 'Theme'])}> Change theme {site === 'studio' && search && } )} {currentPage === COMMAND_ROUTES.AI && } {currentPage === COMMAND_ROUTES.DOCS_SEARCH && } {currentPage === COMMAND_ROUTES.GENERATE_SQL && } {currentPage === COMMAND_ROUTES.THEME && } {currentPage === COMMAND_ROUTES.API_KEYS && } ) } export default CommandMenu