mirror of
https://github.com/supabase/supabase.git
synced 2026-10-11 04:15:04 +03:00
## Problem Now that we migrated old components to their new shadcn alternatives, we don't need the `_Shadcn_` suffix anymore. ## Solution Remove it <img width="659" height="609" alt="image" src="https://github.com/user-attachments/assets/2d7271a9-066a-4dcc-92fe-729b106d2c2f" />
144 lines
4.4 KiB
TypeScript
144 lines
4.4 KiB
TypeScript
import { zodResolver } from '@hookform/resolvers/zod'
|
|
import { parseAsBoolean, useQueryState } from 'nuqs'
|
|
import { SubmitHandler, useForm } from 'react-hook-form'
|
|
import { toast } from 'sonner'
|
|
import {
|
|
Button,
|
|
Dialog,
|
|
DialogContent,
|
|
DialogFooter,
|
|
DialogHeader,
|
|
DialogSection,
|
|
DialogSectionSeparator,
|
|
DialogTitle,
|
|
Form,
|
|
FormControl,
|
|
FormField,
|
|
Input,
|
|
} from 'ui'
|
|
import { Input as PasswordInput } from 'ui-patterns/DataInputs/Input'
|
|
import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout'
|
|
import * as z from 'zod'
|
|
|
|
import { useVaultSecretCreateMutation } from '@/data/vault/vault-secret-create-mutation'
|
|
import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject'
|
|
|
|
const formSchema = z.object({
|
|
name: z.string().min(1, 'Please provide a name for your secret'),
|
|
description: z.string().optional(),
|
|
secret: z.string().min(1, 'Please enter your secret value'),
|
|
})
|
|
|
|
type FormSchema = z.infer<typeof formSchema>
|
|
|
|
const formId = 'add-new-secret-form'
|
|
export const AddNewSecretModal = () => {
|
|
const { data: project } = useSelectedProjectQuery()
|
|
|
|
const { mutateAsync: addSecret } = useVaultSecretCreateMutation()
|
|
|
|
const [showAddSecretModal, setShowAddSecretModal] = useQueryState(
|
|
'new',
|
|
parseAsBoolean.withDefault(false)
|
|
)
|
|
|
|
const handleClose = () => {
|
|
setShowAddSecretModal(null)
|
|
form.reset()
|
|
}
|
|
|
|
const onAddNewSecret: SubmitHandler<FormSchema> = async (values) => {
|
|
if (!project) return console.error('Project is required')
|
|
|
|
try {
|
|
await addSecret({
|
|
projectRef: project.ref,
|
|
connectionString: project?.connectionString,
|
|
name: values.name,
|
|
description: values.description,
|
|
secret: values.secret,
|
|
})
|
|
toast.success(`Successfully added new secret ${values.name}`)
|
|
handleClose()
|
|
} catch (error: any) {
|
|
// [Joshen] No error handler required as they are all handled within the mutations already
|
|
} finally {
|
|
}
|
|
}
|
|
|
|
const form = useForm<FormSchema>({
|
|
resolver: zodResolver(formSchema),
|
|
defaultValues: { name: '', description: '', secret: '' },
|
|
})
|
|
|
|
const { isDirty, isSubmitting } = form.formState
|
|
|
|
return (
|
|
<Dialog open={showAddSecretModal} onOpenChange={handleClose}>
|
|
<DialogContent className="sm:max-w-[425px]">
|
|
<DialogHeader>
|
|
<DialogTitle>Add new secret</DialogTitle>
|
|
</DialogHeader>
|
|
<DialogSectionSeparator />
|
|
<DialogSection className="space-y-4">
|
|
<Form {...form}>
|
|
<form
|
|
id={formId}
|
|
noValidate
|
|
onSubmit={form.handleSubmit(onAddNewSecret)}
|
|
className="space-y-4"
|
|
>
|
|
<FormField
|
|
control={form.control}
|
|
name="name"
|
|
render={({ field }) => (
|
|
<FormItemLayout layout="vertical" label="Name">
|
|
<FormControl className="col-span-6">
|
|
<Input {...field} />
|
|
</FormControl>
|
|
</FormItemLayout>
|
|
)}
|
|
/>
|
|
<FormField
|
|
control={form.control}
|
|
name="description"
|
|
render={({ field }) => (
|
|
<FormItemLayout layout="vertical" label="Description" labelOptional="Optional">
|
|
<FormControl className="col-span-6">
|
|
<Input {...field} />
|
|
</FormControl>
|
|
</FormItemLayout>
|
|
)}
|
|
/>
|
|
<FormField
|
|
control={form.control}
|
|
name="secret"
|
|
render={({ field }) => (
|
|
<FormItemLayout layout="vertical" label="Secret value">
|
|
<FormControl className="col-span-6">
|
|
<PasswordInput reveal copy {...field} />
|
|
</FormControl>
|
|
</FormItemLayout>
|
|
)}
|
|
/>
|
|
</form>
|
|
</Form>
|
|
</DialogSection>
|
|
<DialogFooter>
|
|
<Button type="default" disabled={isSubmitting} onClick={handleClose}>
|
|
Cancel
|
|
</Button>
|
|
<Button
|
|
form={formId}
|
|
htmlType="submit"
|
|
disabled={!isDirty || isSubmitting}
|
|
loading={isSubmitting}
|
|
>
|
|
Add secret
|
|
</Button>
|
|
</DialogFooter>
|
|
</DialogContent>
|
|
</Dialog>
|
|
)
|
|
}
|