import { PermissionAction } from '@supabase/shared-types/out/constants' import { useParams } from 'common' import { Loader2 } from 'lucide-react' import { useEffect, useState } from 'react' import { toast } from 'sonner' import { Card, CardContent, Switch, Tooltip, TooltipContent, TooltipTrigger } from 'ui' import { PageSection, PageSectionContent, PageSectionDescription, PageSectionMeta, PageSectionSummary, PageSectionTitle, } from 'ui-patterns/PageSection' import AlertError from '@/components/ui/AlertError' import { DocsButton } from '@/components/ui/DocsButton' import { InlineLink } from '@/components/ui/InlineLink' import { useComplianceConfigUpdateMutation } from '@/data/config/project-compliance-config-mutation' import { useProjectSettingsV2Query } from '@/data/config/project-settings-v2-query' import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' import { DOCS_URL } from '@/lib/constants' export const ComplianceConfig = () => { const { ref } = useParams() const { data: project } = useSelectedProjectQuery() const [isSensitive, setIsSensitive] = useState(false) const { can: canUpdateComplianceConfig } = useAsyncCheckPermissions( PermissionAction.UPDATE, 'projects', { resource: { project_id: project?.id }, } ) const { data: settings, error, isError, isPending: isLoading, isSuccess, } = useProjectSettingsV2Query({ projectRef: ref }) const initialIsSensitive = settings?.is_sensitive || false const { mutate: updateComplianceConfig, isPending: isSubmitting } = useComplianceConfigUpdateMutation({ onSuccess: () => { toast.success('Successfully updated project compliance configuration') }, onError: (error) => { setIsSensitive(initialIsSensitive) toast.error(`Failed to update project compliance configuration: ${error.message}`) }, }) const toggleIsSensitive = async () => { if (!ref) return console.error('Project ref is required') setIsSensitive(!isSensitive) updateComplianceConfig({ projectRef: ref, isSensitive: !isSensitive }) } useEffect(() => { if (!isLoading) setIsSensitive(initialIsSensitive) }, [isLoading]) return (
High Compliance Configuration For projects storing and processing sensitive data (HIPAA).

Apply additional compliance controls to project

Enable security warnings in the{' '} Security Advisor{' '} to enforce requirements for managing sensitive data.

{(isLoading || isSubmitting) && ( )} {isError && ( )} {isSuccess && ( {/* [Joshen] Added div as tooltip is messing with data state property of toggle */}
{!canUpdateComplianceConfig && ( You need additional permissions to update the compliance configuration for your project )}
)}
) }