| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157 |
- import { UseFormReturn } from 'react-hook-form'
- import {
- Checkbox,
- cn,
- FormControl,
- FormDescription,
- FormField,
- FormItem,
- FormLabel,
- Tooltip,
- TooltipContent,
- TooltipTrigger,
- useWatch,
- } from 'ui'
- import { Admonition } from 'ui-patterns'
- import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout'
- import { CreateProjectForm } from './ProjectCreation.schema'
- import { InlineLink } from '@/components/ui/InlineLink'
- import Panel from '@/components/ui/Panel'
- import { useTrackDefaultPrivilegesExposure } from '@/hooks/misc/useDataApiRevokeOnCreateDefault'
- import { DOCS_URL } from '@/lib/constants'
- interface SecurityOptionsProps {
- form: UseFormReturn<CreateProjectForm>
- layout?: 'vertical' | 'horizontal'
- }
- export const SecurityOptions = ({ form, layout = 'horizontal' }: SecurityOptionsProps) => {
- const dataApi = useWatch({ control: form.control, name: 'dataApi' })
- const dataApiDefaultPrivileges = useWatch({
- control: form.control,
- name: 'dataApiDefaultPrivileges',
- })
- const hasUserModified = form.getFieldState('dataApiDefaultPrivileges', form.formState).isDirty
- useTrackDefaultPrivilegesExposure({
- surface: 'main',
- dataApiDefaultPrivileges: dataApiDefaultPrivileges ?? true,
- hasUserModified,
- })
- return (
- <Panel.Content className="pb-8">
- <FormItemLayout layout={layout} label="Security" isReactForm={false}>
- <div className="flex flex-col gap-4">
- <FormField
- name="dataApi"
- control={form.control}
- render={({ field }) => (
- <FormItem className="flex items-start gap-3">
- <FormControl>
- <Checkbox
- checked={field.value}
- disabled={field.disabled}
- onCheckedChange={(value) => field.onChange(value === true)}
- />
- </FormControl>
- <div className="space-y-1">
- <FormLabel className="text-sm text-foreground">Enable Data API</FormLabel>
- <FormDescription className="text-foreground-lighter">
- Autogenerate a RESTful API for your public schema. Recommended if using a client
- library like{' '}
- <InlineLink href={`${DOCS_URL}/reference/javascript/introduction`}>
- briven-js
- </InlineLink>
- .
- </FormDescription>
- </div>
- </FormItem>
- )}
- />
- <FormField
- name="dataApiDefaultPrivileges"
- control={form.control}
- render={({ field }) => (
- <FormItem
- className={cn(
- 'flex items-start gap-3',
- !dataApi && 'opacity-50 cursor-not-allowed'
- )}
- >
- <FormControl>
- {dataApi ? (
- <Checkbox
- checked={field.value}
- disabled={field.disabled}
- onCheckedChange={(value) => field.onChange(value === true)}
- />
- ) : (
- <Tooltip>
- <TooltipTrigger asChild>
- <span className="cursor-not-allowed">
- <Checkbox checked={field.value} disabled />
- </span>
- </TooltipTrigger>
- <TooltipContent side="top">
- Enable the Data API to configure default privileges.
- </TooltipContent>
- </Tooltip>
- )}
- </FormControl>
- <div className="space-y-1">
- <FormLabel
- className={cn('text-sm text-foreground', !dataApi && 'text-foreground-muted')}
- >
- Automatically expose new tables
- </FormLabel>
- <FormDescription className="text-foreground-lighter">
- Grants privileges to Data API roles by default, exposing new tables.
- <br />
- <strong className="font-medium text-foreground-light">
- We recommend disabling this to control access manually.
- </strong>
- </FormDescription>
- </div>
- </FormItem>
- )}
- />
- <FormField
- name="enableRlsEventTrigger"
- control={form.control}
- render={({ field }) => (
- <FormItem className="flex items-start gap-3">
- <FormControl>
- <Checkbox
- checked={field.value}
- disabled={field.disabled}
- onCheckedChange={(value) => field.onChange(value === true)}
- />
- </FormControl>
- <div className="space-y-1">
- <FormLabel className="text-sm text-foreground">Enable automatic RLS</FormLabel>
- <FormDescription className="text-foreground-lighter">
- Create an event trigger that automatically enables Row Level Security on all new
- tables in the public schema.
- </FormDescription>
- </div>
- </FormItem>
- )}
- />
- {!dataApi && (
- <Admonition
- type="warning"
- title="Client libraries need Data API to query your database"
- >
- Disabling it means briven-js and similar libraries can't query or mutate data.
- </Admonition>
- )}
- </div>
- </FormItemLayout>
- </Panel.Content>
- )
- }
|