import Link from 'next/link' import { useState } from 'react' import { useRouter } from 'next/router' import { Input, IconLoader, IconAlertCircle } from 'ui' import { JwtSecretUpdateStatus } from '@supabase/shared-types/out/events' import { PermissionAction } from '@supabase/shared-types/out/constants' import { checkPermissions, useJwtSecretUpdateStatus, useProjectSettings } from 'hooks' import { DEFAULT_PROJECT_API_SERVICE_ID } from 'lib/constants' import Snippets from 'components/to-be-cleaned/Docs/Snippets' import Panel from 'components/ui/Panel' import SimpleCodeBlock from 'components/to-be-cleaned/SimpleCodeBlock' const APIKeys = () => { const router = useRouter() const { ref } = router.query const availableLanguages = [ { name: 'Javascript', key: 'js' }, { name: 'Dart', key: 'dart' }, ] const [selectedLanguage, setSelectedLanguage] = useState(availableLanguages[0]) const { services, isError: isProjectSettingsError, isLoading: isProjectSettingsLoading, } = useProjectSettings(ref as string | undefined) const { jwtSecretUpdateStatus, isError: isJwtSecretUpdateStatusError, isLoading: isJwtSecretUpdateStatusLoading, }: any = useJwtSecretUpdateStatus(ref) const canReadAPIKeys = checkPermissions(PermissionAction.READ, 'service_api_keys') // Get the API service const apiService = (services ?? []).find((x: any) => x.app.id == DEFAULT_PROJECT_API_SERVICE_ID) const apiConfig = apiService?.app_config ?? {} const apiKeys = apiService?.service_api_keys ?? [] // API keys should not be empty. However it can be populated with a delay on project creation const isApiKeysEmpty = apiKeys.length === 0 const isNotUpdatingJwtSecret = jwtSecretUpdateStatus === undefined || jwtSecretUpdateStatus === JwtSecretUpdateStatus.Updated const apiUrl = `https://${apiConfig.endpoint}` const anonKey = apiKeys.find((key: any) => key.tags === 'anon') const clientInitSnippet: any = Snippets.init(apiUrl) const selectedLanguageSnippet = clientInitSnippet[selectedLanguage.key]?.code ?? 'No snippet available' return (
Project API

Your API is secured behind an API gateway which requires an API Key for every request.
You can use the parameters below to use Supabase client libraries.

} > {isProjectSettingsError || isJwtSecretUpdateStatusError ? (

{isProjectSettingsError ? 'Failed to retrieve API keys' : 'Failed to update JWT secret'}

) : isApiKeysEmpty || isProjectSettingsLoading || isJwtSecretUpdateStatusLoading ? (

{isProjectSettingsLoading || isApiKeysEmpty ? 'Retrieving API keys' : 'JWT secret is being updated'}

) : ( <>

API Key

{anonKey.tags?.split(',').map((x: any, i: number) => ( {x} ))} {'public'}
} copy={canReadAPIKeys && isNotUpdatingJwtSecret} reveal={anonKey.tags !== 'anon' && canReadAPIKeys && isNotUpdatingJwtSecret} value={ !canReadAPIKeys ? 'You need additional permissions to view API keys' : jwtSecretUpdateStatus === JwtSecretUpdateStatus.Failed ? 'JWT secret update failed, new API key may have issues' : jwtSecretUpdateStatus === JwtSecretUpdateStatus.Updating ? 'Updating JWT secret...' : anonKey.api_key } onChange={() => {}} descriptionText={

This key is safe to use in a browser if you have enabled Row Level Security (RLS) for your tables and configured policies. You may also use the service key which can be found{' '} here {' '} to bypass RLS.

} />
{availableLanguages.map((language) => { const isSelected = selectedLanguage.key === language.key return (
setSelectedLanguage(language)} > {language.name}
) })}
{selectedLanguageSnippet}
)}
) } export default APIKeys