import { zodResolver } from '@hookform/resolvers/zod' import { PermissionAction } from '@supabase/shared-types/out/constants' import { useForm } from 'react-hook-form' import { toast } from 'sonner' import { Button, Card, CardContent, CardFooter, Form, FormControl, FormField, Input } from 'ui' import { Admonition } from 'ui-patterns' import { Input as PasswordInput } from 'ui-patterns/DataInputs/Input' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import { PageSection, PageSectionContent, PageSectionMeta, PageSectionSummary, PageSectionTitle, } from 'ui-patterns/PageSection' import { GenericSkeletonLoader } from 'ui-patterns/ShimmeringLoader' import * as z from 'zod' import { AVAILABLE_REPLICA_REGIONS } from '../Infrastructure/InfrastructureConfiguration/InstanceConfiguration.constants' import { ProjectAccessSection } from './ProjectAccessSection' import { InlineLink } from '@/components/ui/InlineLink' import { useProjectUpdateMutation } from '@/data/projects/project-update-mutation' import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' export const General = () => { const { data: project } = useSelectedProjectQuery() const isBranch = Boolean(project?.parent_project_ref) const { can: canUpdateProject } = useAsyncCheckPermissions(PermissionAction.UPDATE, 'projects', { resource: { project_id: project?.id, }, }) const { mutate: updateProject, isPending: isUpdating } = useProjectUpdateMutation() const formSchema = z.object({ name: z.string().trim().min(3, 'Project name must be at least 3 characters long'), }) const defaultValues = { name: project?.name ?? '' } const form = useForm>({ resolver: zodResolver(formSchema as any), defaultValues, values: defaultValues, mode: 'onSubmit', reValidateMode: 'onBlur', }) const regionLabel = AVAILABLE_REPLICA_REGIONS.find((region) => project?.region?.includes(region.region) ) const onSubmit = async (values: z.infer) => { if (!project?.ref) return console.error('Ref is required') updateProject( { ref: project.ref, name: values.name.trim() }, { onSuccess: ({ name }) => { form.reset({ name }) toast.success('Successfully saved settings') }, } ) } return ( <> General settings {isBranch && ( Certain settings are not available while you're on a preview branch. To adjust your project settings, you may return to your{' '} main branch . )} {project === undefined ? ( ) : (
( )} /> {form.formState.isDirty && ( )}
)}
) }