import { zodResolver } from '@hookform/resolvers/zod' import { PermissionAction } from '@supabase/shared-types/out/constants' import { useParams } from 'common' import { Plus } from 'lucide-react' import { useState } from 'react' import { useForm } from 'react-hook-form' import { Button, Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogSection, DialogSectionSeparator, DialogTitle, DialogTrigger, Form, FormControl, FormField, Tooltip, TooltipContent, TooltipTrigger, } from 'ui' import { Input } from 'ui-patterns/DataInputs/Input' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import { z } from 'zod' import { useProjectStorageConfigQuery } from '@/data/config/project-storage-config-query' import { useS3AccessKeyCreateMutation } from '@/data/storage/s3-access-key-create-mutation' import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' import { useIsProjectActive } from '@/hooks/misc/useSelectedProject' interface CreateCredentialModalProps { visible: boolean onOpenChange: (value: boolean) => void } export const CreateCredentialModal = ({ visible, onOpenChange }: CreateCredentialModalProps) => { const { ref: projectRef } = useParams() const isProjectActive = useIsProjectActive() const [showSuccess, setShowSuccess] = useState(false) const { can: canCreateCredentials } = useAsyncCheckPermissions( PermissionAction.STORAGE_ADMIN_WRITE, '*' ) const { data: config } = useProjectStorageConfigQuery({ projectRef }) const isS3ConnectionEnabled = config?.features.s3Protocol.enabled const disableCreation = !isProjectActive || !canCreateCredentials || !isS3ConnectionEnabled const FormSchema = z.object({ description: z.string().min(3, { message: 'Name must be at least 3 characters long', }), }) const form = useForm>({ resolver: zodResolver(FormSchema), defaultValues: { description: '', }, }) const { data: createS3KeyData, mutate: createS3AccessKey, isPending: isCreating, } = useS3AccessKeyCreateMutation({ onSuccess: () => { setShowSuccess(true) form.reset() }, }) async function onSubmit(data: z.infer) { createS3AccessKey({ projectRef, ...data }) } return ( { onOpenChange(open) if (!open) setShowSuccess(false) }} > {disableCreation && ( {!isProjectActive ? 'Restore your project to create new access keys' : !isS3ConnectionEnabled ? 'Connection via S3 protocol is currently disabled' : !canCreateCredentials ? 'You need additional permissions to create new access keys' : ''} )} { if (showSuccess) e.preventDefault() }} > {showSuccess ? ( <> Save your new access key Copy the access key ID and secret now. The secret won't be shown again. If you lose it, create a new access key. ) : ( <> Create new access key This access key grants full access to every bucket and bypasses RLS policies.
( )} />
)}
) }