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