import { useParams } from 'common' import { useRouter } from 'next/router' import * as React from 'react' import { AiIconAnimation } from 'ui/src/layout/ai-icon-animation/ai-icon-animation' import { IconHome } from 'ui/src/components/Icon/icons/IconHome' import { IconArrowRight } from 'ui/src/components/Icon/icons/IconArrowRight' import { IconBook } from 'ui/src/components/Icon/icons/IconBook' import { IconColumns } from 'ui/src/components/Icon/icons/IconColumns' import { IconInbox } from 'ui/src/components/Icon/icons/IconInbox' import { IconKey } from 'ui/src/components/Icon/icons/IconKey' import { IconLifeBuoy } from 'ui/src/components/Icon/icons/IconLifeBuoy' import { IconLink } from 'ui/src/components/Icon/icons/IconLink' import { IconMonitor } from 'ui/src/components/Icon/icons/IconMonitor' import { IconPhone } from 'ui/src/components/Icon/icons/IconPhone' import { IconUser } from 'ui/src/components/Icon/icons/IconUser' import APIKeys from './APIKeys' import AiCommand from './AiCommand' import ChildItem from './ChildItem' import { BadgeExperimental } from './Command.Badges' import { COMMAND_ROUTES } from './Command.constants' import { AiIcon } from './Command.icons' import { CommandDialog, CommandGroup, CommandInput, CommandItem, CommandLabel, CommandList, copyToClipboard, } from './Command.utils' import { useCommandMenu } from './CommandMenuProvider' import CommandMenuShortcuts from './CommandMenuShortcuts' import DocsSearch from './DocsSearch' import GenerateSQL from './GenerateSQL' import SearchableStudioItems from './SearchableStudioItems' import ThemeOptions from './ThemeOptions' import sharedItems from './utils/shared-nav-items.json' 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: , } const CommandMenu = () => { const router = useRouter() const { ref: projectRef } = useParams() const { isOpen, setIsOpen, search, setSearch, pages, setPages, currentPage, site, project, inputRef: commandInputRef, } = useCommandMenu() const showCommandInput = !currentPage || !CHAT_ROUTES.includes(currentPage) // This function has been added to prevent the use of double quotes in the search docs input due to an issue with the cmdk-supabase module. This function can be removed when we transition to using cmdk. const handleInputChange = (value: string) => { const newValue = value.replace(/"/g, '') // Remove double quotes setSearch(newValue) } const commandListMaxHeight = currentPage === COMMAND_ROUTES.DOCS_SEARCH || currentPage === COMMAND_ROUTES.AI || currentPage === COMMAND_ROUTES.GENERATE_SQL ? 'min(600px, 50vh)' : '300px' return ( <> { setIsOpen(!isOpen) }} > {pages.length > 0 && } {showCommandInput && ( )} {!currentPage && ( <> setPages([...pages, COMMAND_ROUTES.DOCS_SEARCH])} forceMount={true} > Search the docs {search ? ( <> {': '} {search} ) : ( '...' )} { setPages([...pages, COMMAND_ROUTES.AI]) }} forceMount={true} > Ask Supabase AI {search ? ( <> {': '} {search} ) : ( '...' )} {site === 'docs' && ( {sharedItems.quickstarts.map((item) => ( router.push(item.url)}> Start with {item.label} ))} )} {site === 'docs' && ( {sharedItems.projectTools.map((item) => ( window.open(`https://supabase.com/dashboard${item.url}`, '_blank') } > {item.label} ))} )} {site === 'docs' && ( {sharedItems.tools.map((item) => ( window.open(`https://supabase.com/dashboard${item.url}`, '_blank') } > Go to {item.label} ))} )} {site === 'studio' && ( } onSelect={() => setPages([...pages, COMMAND_ROUTES.GENERATE_SQL])} > Generate SQL with Supabase AI )} {site === 'studio' && projectRef !== undefined && ( { setSearch('') setPages([...pages, COMMAND_ROUTES.API_KEYS]) }} > Get API keys {project?.apiUrl !== undefined && ( { copyToClipboard(project?.apiUrl ?? '') setIsOpen(false) }} className="space-x-2" > Copy API URL )} )} {site === 'studio' && ( {sharedItems.tools.map((item) => { const itemUrl = projectRef ? item.url.replace('_', projectRef) : item.url return ( { router.push(itemUrl) 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} ))} )} { setSearch('') 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