protection.tsx73 lines · main
1import { PermissionAction } from '@supabase/shared-types/out/constants'
2import { useParams } from 'common'
3import { PageContainer } from 'ui-patterns/PageContainer'
4import {
5 PageHeader,
6 PageHeaderDescription,
7 PageHeaderMeta,
8 PageHeaderSummary,
9 PageHeaderTitle,
10} from 'ui-patterns/PageHeader'
11import { PageSection, PageSectionContent } from 'ui-patterns/PageSection'
12import { GenericSkeletonLoader } from 'ui-patterns/ShimmeringLoader'
13
14import { ProtectionAuthSettingsForm } from '@/components/interfaces/Auth/ProtectionAuthSettingsForm/ProtectionAuthSettingsForm'
15import AuthLayout from '@/components/layouts/AuthLayout/AuthLayout'
16import DefaultLayout from '@/components/layouts/DefaultLayout'
17import NoPermission from '@/components/ui/NoPermission'
18import { UnknownInterface } from '@/components/ui/UnknownInterface'
19import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions'
20import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled'
21import type { NextPageWithLayout } from '@/types'
22
23const ProtectionPage: NextPageWithLayout = () => {
24 const { ref } = useParams()
25 const showAttackProtection = useIsFeatureEnabled('authentication:attack_protection')
26
27 const { can: canReadAuthSettings, isSuccess: isPermissionsLoaded } = useAsyncCheckPermissions(
28 PermissionAction.READ,
29 'custom_config_gotrue'
30 )
31
32 if (!showAttackProtection) {
33 return <UnknownInterface urlBack={`/project/${ref}/auth/users`} />
34 }
35
36 if (isPermissionsLoaded && !canReadAuthSettings) {
37 return <NoPermission isFullPage resourceText="access your project's auth provider settings" />
38 }
39
40 return (
41 <>
42 <PageHeader size="default">
43 <PageHeaderMeta>
44 <PageHeaderSummary>
45 <PageHeaderTitle>Attack Protection</PageHeaderTitle>
46 <PageHeaderDescription>
47 Configure security settings to protect your project from attacks
48 </PageHeaderDescription>
49 </PageHeaderSummary>
50 </PageHeaderMeta>
51 </PageHeader>
52 <PageContainer size="default">
53 {!isPermissionsLoaded ? (
54 <PageSection>
55 <PageSectionContent>
56 <GenericSkeletonLoader />
57 </PageSectionContent>
58 </PageSection>
59 ) : (
60 <ProtectionAuthSettingsForm />
61 )}
62 </PageContainer>
63 </>
64 )
65}
66
67ProtectionPage.getLayout = (page) => (
68 <DefaultLayout>
69 <AuthLayout title="Attack Protection">{page}</AuthLayout>
70 </DefaultLayout>
71)
72
73export default ProtectionPage