SecretAPIKeys() — supabase Function Reference
Architecture documentation for the SecretAPIKeys() function in SecretAPIKeys.tsx from the supabase codebase.
Entity Profile
Dependency Diagram
graph TD 28b334af_f88e_3fd3_031e_15a8b25c0d56["SecretAPIKeys()"] ddb88113_7c4c_40ce_8374_1b9d5665ccad["useLastSeen()"] 28b334af_f88e_3fd3_031e_15a8b25c0d56 -->|calls| ddb88113_7c4c_40ce_8374_1b9d5665ccad style 28b334af_f88e_3fd3_031e_15a8b25c0d56 fill:#6366f1,stroke:#818cf8,color:#fff
Relationship Graph
Source Code
apps/studio/components/interfaces/APIKeys/SecretAPIKeys.tsx lines 70–184
export const SecretAPIKeys = () => {
const { ref: projectRef } = useParams()
const { can: canReadAPIKeys, isLoading: isLoadingPermissions } = useAsyncCheckPermissions(
PermissionAction.SECRETS_READ,
'*'
)
const {
data: apiKeysData,
error,
isSuccess: isSuccessApiKeys,
isPending: isLoadingApiKeys,
isError: isErrorApiKeys,
} = useAPIKeysQuery({ projectRef, reveal: false }, { enabled: canReadAPIKeys })
const showApiKeysLastUsed = useFlag('showApiKeysLastUsed')
const { data: lastSeen, isLoading: isLoadingLastSeen } = useLastSeen({
projectRef: projectRef ?? '',
enabled: showApiKeysLastUsed,
})
const secretApiKeys = useMemo(
() =>
apiKeysData?.filter(
(key): key is Extract<APIKeysData[number], { type: 'secret' }> => key.type === 'secret'
) ?? [],
[apiKeysData]
)
const empty = secretApiKeys?.length === 0 && !isLoadingApiKeys && !isLoadingPermissions
const [deleteId, setDeleteId] = useQueryState('deleteSecretKey', parseAsString)
const apiKeyToDelete = secretApiKeys?.find((key) => key.id === deleteId)
const {
mutate: deleteAPIKey,
isPending: isDeletingAPIKey,
isSuccess: isDeleteSuccess,
} = useAPIKeyDeleteMutation({
onSuccess: () => {
toast.success('Successfully deleted secret key')
setDeleteId(null)
},
})
const onDeleteAPIKey = (apiKey: Extract<APIKeysData[number], { type: 'secret' }>) => {
if (!projectRef) return console.error('Project ref is required')
if (!apiKey.id) return console.error('API key ID is required')
deleteAPIKey({ projectRef, id: apiKey.id })
}
useEffect(() => {
if (isSuccessApiKeys && !!deleteId && !apiKeyToDelete && !isDeleteSuccess) {
toast('Unable to find secret key')
setDeleteId(null)
}
}, [apiKeyToDelete, deleteId, isDeleteSuccess, isSuccessApiKeys, setDeleteId])
return (
<div className="pb-30">
<FormHeader
title="Secret keys"
description="These API keys allow privileged access to your project's APIs. Use in servers, functions, workers or other backend components of your application."
actions={<CreateSecretAPIKeyDialog />}
/>
{!canReadAPIKeys && !isLoadingPermissions ? (
<NoPermission resourceText="view API keys" />
) : isLoadingApiKeys || isLoadingPermissions ? (
<GenericSkeletonLoader />
) : isErrorApiKeys ? (
<AlertError error={error} subject="Failed to load secret API keys" />
) : empty ? (
<Card>
<div className="!rounded-b-md overflow-hidden py-12 flex flex-col gap-1 items-center justify-center">
<p className="text-sm text-foreground">No secret API keys found</p>
<p className="text-sm text-foreground-light">
Your project is not accessible via secret keys—there are no active secret keys
created.
</p>
</div>
</Card>
) : (
<Card className="bg-surface-100">
<Table>
<TableHeader>
<TableRow className="bg-200">
<TableHead>Name</TableHead>
<TableHead>API Key</TableHead>
{showApiKeysLastUsed && (
<TableHead className="hidden lg:table-cell">Last Used</TableHead>
)}
<TableHead />
</TableRow>
</TableHeader>
<TableBody>
{secretApiKeys.map((apiKey) => (
<APIKeyRow
key={apiKey.id}
apiKey={apiKey}
lastSeen={lastSeen?.[apiKey.hash]}
isLoadingLastSeen={isLoadingLastSeen}
isDeleting={apiKeyToDelete?.id === apiKey.id && isDeletingAPIKey}
onDelete={() => onDeleteAPIKey(apiKey)}
setKeyToDelete={setDeleteId}
isDeleteModalOpen={apiKeyToDelete?.id === apiKey.id}
/>
))}
</TableBody>
</Table>
</Card>
)}
</div>
)
}
Domain
Subdomains
Calls
Source
Frequently Asked Questions
What does SecretAPIKeys() do?
SecretAPIKeys() is a function in the supabase codebase.
What does SecretAPIKeys() call?
SecretAPIKeys() calls 1 function(s): useLastSeen.
Analyze Your Own Codebase
Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.
Try Supermodel Free