import { yupResolver } from '@hookform/resolvers/yup' import { PermissionAction } from '@supabase/shared-types/out/constants' import { useEffect } from 'react' import { useForm } from 'react-hook-form' import { toast } from 'sonner' import { boolean, object } from 'yup' import { useParams } from 'common' import { AlertError } from 'components/ui/AlertError' import { InlineLink } from 'components/ui/InlineLink' import { useAuthConfigQuery } from 'data/auth/auth-config-query' import { useAuthConfigUpdateMutation } from 'data/auth/auth-config-update-mutation' import { useTablesQuery } from 'data/tables/tables-query' import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import { Button, Card, CardContent, CardFooter, FormControl_Shadcn_, FormField_Shadcn_, Form_Shadcn_, Switch, } from 'ui' import { Admonition, GenericSkeletonLoader } from 'ui-patterns' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import { PageSection, PageSectionContent, PageSectionMeta, PageSectionSummary, PageSectionTitle, } from 'ui-patterns/PageSection' const schema = object({ AUDIT_LOG_DISABLE_POSTGRES: boolean().required(), }) const AUDIT_LOG_ENTRIES_TABLE = 'audit_log_entries' export const AuditLogsForm = () => { const { ref: projectRef } = useParams() const { data: project } = useSelectedProjectQuery() const { can: canUpdateConfig } = useAsyncCheckPermissions( PermissionAction.UPDATE, 'custom_config_gotrue' ) const { data: tables = [] } = useTablesQuery({ projectRef: project?.ref, connectionString: project?.connectionString, includeColumns: false, schema: 'auth', }) const auditLogTable = tables.find((x) => x.name === AUDIT_LOG_ENTRIES_TABLE) const { data: authConfig, error: authConfigError, isError, isPending: isLoading, } = useAuthConfigQuery({ projectRef }) const { mutate: updateAuthConfig, isPending: isUpdatingConfig } = useAuthConfigUpdateMutation({ onError: (error) => { toast.error(`Failed to update audit logs: ${error?.message}`) }, onSuccess: () => { toast.success('Successfully updated audit logs settings') }, }) const form = useForm({ resolver: yupResolver(schema), defaultValues: { AUDIT_LOG_DISABLE_POSTGRES: false }, }) const { AUDIT_LOG_DISABLE_POSTGRES: formValueDisablePostgres } = form.watch() const currentlyDisabled = authConfig?.AUDIT_LOG_DISABLE_POSTGRES ?? false const isDisabling = !currentlyDisabled && formValueDisablePostgres const onSubmitAuditLogs = (values: any) => { if (!projectRef) return console.error('Project ref is required') updateAuthConfig({ projectRef: projectRef, config: values }) } useEffect(() => { if (authConfig) { form.reset({ AUDIT_LOG_DISABLE_POSTGRES: authConfig?.AUDIT_LOG_DISABLE_POSTGRES ?? false }) } }, [authConfig]) if (isError) { return ( ) } if (isLoading) { return ( ) } return ( Settings
( When enabled, audit logs are written to the{' '} {AUDIT_LOG_ENTRIES_TABLE} {' '} table.
You can disable this to reduce disk usage while still accessing logs through the{' '} Auth logs .

} > field.onChange(!value)} disabled={!canUpdateConfig} />
)} /> {isDisabling && ( Future audit logs will only appear in the project’s{' '} auth logs . You are responsible for backing up, copying, or migrating existing data from the{' '} {AUDIT_LOG_ENTRIES_TABLE} {' '} table if needed.

} /> )}
{form.formState.isDirty && ( )}
) }