import { zodResolver } from '@hookform/resolvers/zod' import { PermissionAction } from '@supabase/shared-types/out/constants' import { useParams } from 'common' import { useEffect } from 'react' import { useForm } from 'react-hook-form' import { toast } from 'sonner' import { Button, Card, CardContent, CardFooter, Form, FormControl, FormField, 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' import * as z from 'zod' 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' const schema = z.object({ AUDIT_LOG_DISABLE_POSTGRES: z.boolean(), }) 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: zodResolver(schema), defaultValues: { AUDIT_LOG_DISABLE_POSTGRES: false }, }) const { isDirty } = form.formState 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.

} /> )}
{isDirty && ( )}
) }