import { Key } from 'lucide-react' import { useMemo } from 'react' import { getKeys, useAPIKeysQuery } from 'data/api-keys/api-keys-query' import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import { Badge, copyToClipboard } from 'ui' import type { ICommand } from 'ui-patterns/CommandMenu' import { PageType, useRegisterCommands, useRegisterPage, useSetCommandMenuOpen, useSetPage, } from 'ui-patterns/CommandMenu' import { COMMAND_MENU_SECTIONS } from './CommandMenu.utils' import { orderCommandSectionsByPriority } from './ordering' const API_KEYS_PAGE_NAME = 'API Keys' export function useApiKeysCommands() { const setIsOpen = useSetCommandMenuOpen() const setPage = useSetPage() const { data: project } = useSelectedProjectQuery() const ref = project?.ref || '_' const { data: apiKeys } = useAPIKeysQuery({ projectRef: project?.ref, reveal: true }) const { anonKey, serviceKey, publishableKey, allSecretKeys } = getKeys(apiKeys) const commands = useMemo( () => [ project && anonKey && { id: 'anon-key', name: `Copy anonymous API key`, action: () => { copyToClipboard(anonKey.api_key ?? '') setIsOpen(false) }, badge: () => ( Project: {project?.name} Public {anonKey.type} ), icon: () => , }, project && serviceKey && { id: 'service-key', name: `Copy service API key`, action: () => { copyToClipboard(serviceKey.api_key ?? '') setIsOpen(false) }, badge: () => ( Project: {project?.name} Secret {serviceKey.type} ), icon: () => , }, project && publishableKey && { id: 'publishable-key', name: `Copy publishable key`, action: () => { copyToClipboard(publishableKey.api_key ?? '') setIsOpen(false) }, badge: () => ( Project: {project?.name} {publishableKey.type} ), icon: () => , }, ...(project && allSecretKeys ? allSecretKeys.map((key) => ({ id: key.id, name: `Copy secret key (${key.name})`, action: () => { copyToClipboard(key.api_key ?? '') setIsOpen(false) }, badge: () => ( Project: {project?.name} {key.type} ), icon: () => , })) : []), !(anonKey || serviceKey) && { id: 'api-keys-project-settings', name: 'See API keys in Project Settings', route: `/project/${ref}/settings/api`, icon: () => , }, ].filter(Boolean) as ICommand[], [anonKey, serviceKey, project, setIsOpen] ) useRegisterPage( API_KEYS_PAGE_NAME, { type: PageType.Commands, sections: [ { id: 'api-keys', name: 'API keys', commands, }, ], }, { deps: [commands], enabled: !!project } ) useRegisterCommands( COMMAND_MENU_SECTIONS.ACTIONS, [ { id: 'api-keys', name: 'Get API keys', action: () => setPage(API_KEYS_PAGE_NAME), icon: () => , }, ], { enabled: !!project, orderSection: orderCommandSectionsByPriority, sectionMeta: { priority: 3 }, } ) }