diff --git a/apps/studio/components/interfaces/Auth/BasicAuthSettingsForm/BasicAuthSettingsForm.tsx b/apps/studio/components/interfaces/Auth/BasicAuthSettingsForm/BasicAuthSettingsForm.tsx index 7c461c69a3b..5ee44c4ba4b 100644 --- a/apps/studio/components/interfaces/Auth/BasicAuthSettingsForm/BasicAuthSettingsForm.tsx +++ b/apps/studio/components/interfaces/Auth/BasicAuthSettingsForm/BasicAuthSettingsForm.tsx @@ -41,7 +41,7 @@ const schema = object({ SITE_URL: string().required('Must have a Site URL'), }) -const BasicAuthSettingsForm = () => { +export const BasicAuthSettingsForm = () => { const { ref: projectRef } = useParams() const showManualLinking = useIsFeatureEnabled('authentication:show_manual_linking') @@ -333,5 +333,3 @@ const BasicAuthSettingsForm = () => { ) } - -export default BasicAuthSettingsForm diff --git a/apps/studio/components/interfaces/Auth/EmailTemplates/EmailTemplates.tsx b/apps/studio/components/interfaces/Auth/EmailTemplates/EmailTemplates.tsx index e37f390953d..82875d1ff7b 100644 --- a/apps/studio/components/interfaces/Auth/EmailTemplates/EmailTemplates.tsx +++ b/apps/studio/components/interfaces/Auth/EmailTemplates/EmailTemplates.tsx @@ -7,7 +7,7 @@ import { TEMPLATES_SCHEMAS } from '../AuthTemplatesValidation' import EmailRateLimitsAlert from '../EmailRateLimitsAlert' import TemplateEditor from './TemplateEditor' -const EmailTemplates = () => { +export const EmailTemplates = () => { const { ref: projectRef } = useParams() const { data: authConfig, @@ -68,5 +68,3 @@ const EmailTemplates = () => { ) } - -export default EmailTemplates diff --git a/apps/studio/components/interfaces/Auth/MfaAuthSettingsForm/MfaAuthSettingsForm.tsx b/apps/studio/components/interfaces/Auth/MfaAuthSettingsForm/MfaAuthSettingsForm.tsx index 34d3c2eb17d..678e91226f7 100644 --- a/apps/studio/components/interfaces/Auth/MfaAuthSettingsForm/MfaAuthSettingsForm.tsx +++ b/apps/studio/components/interfaces/Auth/MfaAuthSettingsForm/MfaAuthSettingsForm.tsx @@ -3,7 +3,7 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' import { useEffect, useState } from 'react' import { useForm } from 'react-hook-form' import { toast } from 'sonner' -import { number, object, string, boolean } from 'yup' +import { boolean, number, object, string } from 'yup' import { useParams } from 'common' import { ScaffoldSection, ScaffoldSectionTitle } from 'components/layouts/Scaffold' @@ -35,8 +35,8 @@ import { Switch, WarningIcon, } from 'ui' -import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import ConfirmationModal from 'ui-patterns/Dialogs/ConfirmationModal' +import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' function determineMFAStatus(verifyEnabled: boolean, enrollEnabled: boolean) { return verifyEnabled ? (enrollEnabled ? 'Enabled' : 'Verify Enabled') : 'Disabled' @@ -84,7 +84,7 @@ const securitySchema = object({ MFA_ALLOW_LOW_AAL: boolean().required(), }) -const MfaAuthSettingsForm = () => { +export const MfaAuthSettingsForm = () => { const { ref: projectRef } = useParams() const { data: authConfig, error: authConfigError, isError } = useAuthConfigQuery({ projectRef }) const { mutate: updateAuthConfig } = useAuthConfigUpdateMutation() @@ -572,5 +572,3 @@ const MfaAuthSettingsForm = () => { ) } - -export default MfaAuthSettingsForm diff --git a/apps/studio/components/interfaces/Auth/ProtectionAuthSettingsForm/ProtectionAuthSettingsForm.tsx b/apps/studio/components/interfaces/Auth/ProtectionAuthSettingsForm/ProtectionAuthSettingsForm.tsx index 8f9dae46e29..53bddf2acd9 100644 --- a/apps/studio/components/interfaces/Auth/ProtectionAuthSettingsForm/ProtectionAuthSettingsForm.tsx +++ b/apps/studio/components/interfaces/Auth/ProtectionAuthSettingsForm/ProtectionAuthSettingsForm.tsx @@ -67,7 +67,7 @@ const schema = object({ PASSWORD_HIBP_ENABLED: boolean(), }) -const ProtectionAuthSettingsForm = () => { +export const ProtectionAuthSettingsForm = () => { const { ref: projectRef } = useParams() const { data: authConfig, error: authConfigError, isError } = useAuthConfigQuery({ projectRef }) const { mutate: updateAuthConfig, isLoading: isUpdatingConfig } = useAuthConfigUpdateMutation({ @@ -287,5 +287,3 @@ const ProtectionAuthSettingsForm = () => { ) } - -export default ProtectionAuthSettingsForm diff --git a/apps/studio/components/interfaces/Auth/RateLimits/RateLimits.tsx b/apps/studio/components/interfaces/Auth/RateLimits/RateLimits.tsx index 7b8ea69e7c1..ade0bf24641 100644 --- a/apps/studio/components/interfaces/Auth/RateLimits/RateLimits.tsx +++ b/apps/studio/components/interfaces/Auth/RateLimits/RateLimits.tsx @@ -30,7 +30,7 @@ import { import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import { isSmtpEnabled } from '../SmtpForm/SmtpForm.utils' -const RateLimits = () => { +export const RateLimits = () => { const { ref: projectRef } = useParams() const { can: canUpdateConfig } = useAsyncCheckProjectPermissions( PermissionAction.UPDATE, @@ -505,5 +505,3 @@ const RateLimits = () => { ) } - -export default RateLimits diff --git a/apps/studio/components/interfaces/Auth/SessionsAuthSettingsForm/SessionsAuthSettingsForm.tsx b/apps/studio/components/interfaces/Auth/SessionsAuthSettingsForm/SessionsAuthSettingsForm.tsx index dfb4b224731..0074539a98c 100644 --- a/apps/studio/components/interfaces/Auth/SessionsAuthSettingsForm/SessionsAuthSettingsForm.tsx +++ b/apps/studio/components/interfaces/Auth/SessionsAuthSettingsForm/SessionsAuthSettingsForm.tsx @@ -59,7 +59,7 @@ const UserSessionsSchema = z.object({ SESSIONS_SINGLE_PER_USER: z.boolean(), }) -const SessionsAuthSettingsForm = () => { +export const SessionsAuthSettingsForm = () => { const { ref: projectRef } = useParams() const { data: authConfig, error: authConfigError, isError } = useAuthConfigQuery({ projectRef }) const { mutate: updateAuthConfig } = useAuthConfigUpdateMutation() @@ -370,5 +370,3 @@ const SessionsAuthSettingsForm = () => { ) } - -export default SessionsAuthSettingsForm diff --git a/apps/studio/components/interfaces/Auth/SmtpForm/SmtpForm.tsx b/apps/studio/components/interfaces/Auth/SmtpForm/SmtpForm.tsx index 4acf7b5cd90..70d041d7f3f 100644 --- a/apps/studio/components/interfaces/Auth/SmtpForm/SmtpForm.tsx +++ b/apps/studio/components/interfaces/Auth/SmtpForm/SmtpForm.tsx @@ -8,7 +8,7 @@ import { toast } from 'sonner' import * as yup from 'yup' import { useParams } from 'common' -import { ScaffoldContainer, ScaffoldSection } from 'components/layouts/Scaffold' +import { ScaffoldSection } from 'components/layouts/Scaffold' import NoPermission from 'components/ui/NoPermission' import { useAuthConfigQuery } from 'data/auth/auth-config-query' import { useAuthConfigUpdateMutation } from 'data/auth/auth-config-update-mutation' @@ -45,7 +45,7 @@ interface SmtpFormValues { ENABLE_SMTP: boolean } -const SmtpForm = () => { +export const SmtpForm = () => { const { ref: projectRef } = useParams() const { data: authConfig, error: authConfigError, isError } = useAuthConfigQuery({ projectRef }) const { mutate: updateAuthConfig, isLoading: isUpdatingConfig } = useAuthConfigUpdateMutation() @@ -192,285 +192,280 @@ const SmtpForm = () => { } return ( - - - -
- - - ( - - Emails will be sent using your custom SMTP provider. Email rate limits can - be adjusted{' '} - - here - - . -

- } - > - - - -
- )} - /> - - {enableSmtp && !isSmtpEnabled(form.getValues() as any) && ( -
- - - All fields below must be filled - - The following fields must be filled before custom SMTP can be properly - enabled - - -
+ + + + + + ( + + Emails will be sent using your custom SMTP provider. Email rate limits can + be adjusted{' '} + + here + + . +

+ } + > + + + +
)} -
+ /> - {enableSmtp && ( - <> - -
-
-

Sender details

-

- Configure the sender information for your emails. -

-
-
- ( - - - - - - )} - /> + {enableSmtp && !isSmtpEnabled(form.getValues() as any) && ( +
+ + + All fields below must be filled + + The following fields must be filled before custom SMTP can be properly enabled + + +
+ )} + - ( - - - - - - )} - /> -
+ {enableSmtp && ( + <> + +
+
+

Sender details

+

+ Configure the sender information for your emails. +

- - - -
-
-

SMTP Provider Settings

-

- Your SMTP Credentials will always be encrypted in our database. -

-
-
- {form.watch('SMTP_HOST')?.endsWith('.gmail.com') && ( - - - Check your SMTP provider - - Not all SMTP providers are designed for the email sending required by - Supabase Auth. It looks like the SMTP provider you entered is designed - for sending personal email messages and not for sending transactional - messages. Although you can ignore this warning, email deliverability - may be impacted. - - +
+ ( + + + + + )} + /> - ( - - - - - - )} - /> + ( + + + + + + )} + /> +
+
+ - ( - - - Port used by your SMTP server. Common ports include 25, 465, and - 587.{' '} - - - Avoid using port 25 as modern SMTP email clients shouldn't use - this port, it is traditionally blocked by residential ISPs and - Cloud Hosting Providers, to curb the amount of spam. - - - } - > - + +
+
+

SMTP Provider Settings

+

+ Your SMTP Credentials will always be encrypted in our database. +

+
+
+ {form.watch('SMTP_HOST')?.endsWith('.gmail.com') && ( + + + Check your SMTP provider + + Not all SMTP providers are designed for the email sending required by + Supabase Auth. It looks like the SMTP provider you entered is designed + for sending personal email messages and not for sending transactional + messages. Although you can ignore this warning, email deliverability may + be impacted. + + + )} + + ( + + + + + + )} + /> + + ( + + + Port used by your SMTP server. Common ports include 25, 465, and + 587.{' '} + + + Avoid using port 25 as modern SMTP email clients shouldn't use + this port, it is traditionally blocked by residential ISPs and + Cloud Hosting Providers, to curb the amount of spam. + + + } + > + + field.onChange(Number(e.target.value))} + placeholder="587" + disabled={!canUpdateConfig} + /> + + + )} + /> + + ( + + + field.onChange(Number(e.target.value))} - placeholder="587" disabled={!canUpdateConfig} /> - - - )} - /> + + + + )} + /> - ( - - - - field.onChange(Number(e.target.value))} - disabled={!canUpdateConfig} + ( + + + + + + )} + /> + + ( + + + setHidden(!hidden)} + icon={hidden ? : } /> - - - - )} - /> - - ( - - + } + > - - - )} - /> - - ( - - - setHidden(!hidden)} - icon={hidden ? : } - /> - } - > - - - - - )} - /> -
+ + + + )} + />
-
- - )} +
+
+ + )} - - {form.formState.isDirty && ( - - )} - - - - - - - + )} + + + + + + ) } - -export default SmtpForm diff --git a/apps/studio/components/interfaces/Auth/index.tsx b/apps/studio/components/interfaces/Auth/index.tsx deleted file mode 100644 index 4762496196c..00000000000 --- a/apps/studio/components/interfaces/Auth/index.tsx +++ /dev/null @@ -1,9 +0,0 @@ -export { AdvancedAuthSettingsForm } from './AdvancedAuthSettingsForm' -export { AuthProvidersForm } from './AuthProvidersForm/AuthProvidersForm' -export { default as BasicAuthSettingsForm } from './BasicAuthSettingsForm/BasicAuthSettingsForm' -export { default as EmailTemplates } from './EmailTemplates/EmailTemplates' -export { default as MfaAuthSettingsForm } from './MfaAuthSettingsForm/MfaAuthSettingsForm' -export { default as ProtectionAuthSettingsForm } from './ProtectionAuthSettingsForm/ProtectionAuthSettingsForm' -export { default as SessionsAuthSettingsForm } from './SessionsAuthSettingsForm/SessionsAuthSettingsForm' -export { default as SmtpForm } from './SmtpForm/SmtpForm' -export { ThirdPartyAuthForm } from './ThirdPartyAuthForm' diff --git a/apps/studio/pages/project/[ref]/auth/advanced.tsx b/apps/studio/pages/project/[ref]/auth/advanced.tsx index 1524a38b690..254e8c0721d 100644 --- a/apps/studio/pages/project/[ref]/auth/advanced.tsx +++ b/apps/studio/pages/project/[ref]/auth/advanced.tsx @@ -9,7 +9,7 @@ import { ScaffoldContainer, ScaffoldSection } from 'components/layouts/Scaffold' import NoPermission from 'components/ui/NoPermission' import { GenericSkeletonLoader } from 'components/ui/ShimmeringLoader' import { UnknownInterface } from 'components/ui/UnknownInterface' -import { useCheckPermissions, usePermissionsLoaded } from 'hooks/misc/useCheckPermissions' +import { useAsyncCheckProjectPermissions } from 'hooks/misc/useCheckPermissions' import { useIsFeatureEnabled } from 'hooks/misc/useIsFeatureEnabled' import type { NextPageWithLayout } from 'types' @@ -17,35 +17,37 @@ const AdvancedPage: NextPageWithLayout = () => { const { ref } = useParams() const showAdvanced = useIsFeatureEnabled('authentication:advanced') - const isPermissionsLoaded = usePermissionsLoaded() - const canReadAuthSettings = useCheckPermissions(PermissionAction.READ, 'custom_config_gotrue') + const { can: canReadAuthSettings, isSuccess: isPermissionsLoaded } = + useAsyncCheckProjectPermissions(PermissionAction.READ, 'custom_config_gotrue') if (!showAdvanced) { return } + if (isPermissionsLoaded && !canReadAuthSettings) { + return + } + return ( - - {isPermissionsLoaded && !canReadAuthSettings ? ( - + + {!isPermissionsLoaded ? ( + + + ) : ( - - {!isPermissionsLoaded ? ( - - - - ) : ( - - )} - + )} - + ) } AdvancedPage.getLayout = (page) => ( - {page} + + + {page} + + ) diff --git a/apps/studio/pages/project/[ref]/auth/hooks.tsx b/apps/studio/pages/project/[ref]/auth/hooks.tsx index 69db07029b0..ebea0d189d3 100644 --- a/apps/studio/pages/project/[ref]/auth/hooks.tsx +++ b/apps/studio/pages/project/[ref]/auth/hooks.tsx @@ -4,15 +4,16 @@ import { HooksListing } from 'components/interfaces/Auth/Hooks/HooksListing' import AuthLayout from 'components/layouts/AuthLayout/AuthLayout' import DefaultLayout from 'components/layouts/DefaultLayout' import { PageLayout } from 'components/layouts/PageLayout/PageLayout' -import { ScaffoldContainer } from 'components/layouts/Scaffold' -import NoPermission from 'components/ui/NoPermission' -import { useCheckPermissions, usePermissionsLoaded } from 'hooks/misc/useCheckPermissions' -import type { NextPageWithLayout } from 'types' +import { ScaffoldContainer, ScaffoldSection } from 'components/layouts/Scaffold' import { DocsButton } from 'components/ui/DocsButton' +import NoPermission from 'components/ui/NoPermission' +import { useAsyncCheckProjectPermissions } from 'hooks/misc/useCheckPermissions' +import type { NextPageWithLayout } from 'types' +import { GenericSkeletonLoader } from 'ui-patterns' const Hooks: NextPageWithLayout = () => { - const canReadAuthSettings = useCheckPermissions(PermissionAction.READ, 'custom_config_gotrue') - const isPermissionsLoaded = usePermissionsLoaded() + const { can: canReadAuthSettings, isSuccess: isPermissionsLoaded } = + useAsyncCheckProjectPermissions(PermissionAction.READ, 'custom_config_gotrue') if (isPermissionsLoaded && !canReadAuthSettings) { return @@ -20,7 +21,13 @@ const Hooks: NextPageWithLayout = () => { return ( - + {!isPermissionsLoaded ? ( + + + + ) : ( + + )} ) } diff --git a/apps/studio/pages/project/[ref]/auth/mfa.tsx b/apps/studio/pages/project/[ref]/auth/mfa.tsx index 84d75511655..30844c34b80 100644 --- a/apps/studio/pages/project/[ref]/auth/mfa.tsx +++ b/apps/studio/pages/project/[ref]/auth/mfa.tsx @@ -1,7 +1,7 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' import { useParams } from 'common' -import { MfaAuthSettingsForm } from 'components/interfaces/Auth' +import { MfaAuthSettingsForm } from 'components/interfaces/Auth/MfaAuthSettingsForm/MfaAuthSettingsForm' import AuthLayout from 'components/layouts/AuthLayout/AuthLayout' import DefaultLayout from 'components/layouts/DefaultLayout' import { PageLayout } from 'components/layouts/PageLayout/PageLayout' @@ -9,7 +9,7 @@ import { ScaffoldContainer, ScaffoldSection } from 'components/layouts/Scaffold' import NoPermission from 'components/ui/NoPermission' import { GenericSkeletonLoader } from 'components/ui/ShimmeringLoader' import { UnknownInterface } from 'components/ui/UnknownInterface' -import { useCheckPermissions, usePermissionsLoaded } from 'hooks/misc/useCheckPermissions' +import { useAsyncCheckProjectPermissions } from 'hooks/misc/useCheckPermissions' import { useIsFeatureEnabled } from 'hooks/misc/useIsFeatureEnabled' import type { NextPageWithLayout } from 'types' @@ -17,38 +17,40 @@ const MfaPage: NextPageWithLayout = () => { const { ref } = useParams() const showMFA = useIsFeatureEnabled('authentication:multi_factor') - const isPermissionsLoaded = usePermissionsLoaded() - const canReadAuthSettings = useCheckPermissions(PermissionAction.READ, 'custom_config_gotrue') + const { can: canReadAuthSettings, isSuccess: isPermissionsLoaded } = + useAsyncCheckProjectPermissions(PermissionAction.READ, 'custom_config_gotrue') if (!showMFA) { return } + if (isPermissionsLoaded && !canReadAuthSettings) { + return + } + return ( - - {isPermissionsLoaded && !canReadAuthSettings ? ( - + + {!isPermissionsLoaded ? ( + + + ) : ( - - {!isPermissionsLoaded ? ( - - - - ) : ( - - )} - + )} - + ) } MfaPage.getLayout = (page) => ( - {page} + + + {page} + + ) diff --git a/apps/studio/pages/project/[ref]/auth/policies.tsx b/apps/studio/pages/project/[ref]/auth/policies.tsx index e5e73f13189..c66c3b62ae9 100644 --- a/apps/studio/pages/project/[ref]/auth/policies.tsx +++ b/apps/studio/pages/project/[ref]/auth/policies.tsx @@ -20,7 +20,7 @@ import SchemaSelector from 'components/ui/SchemaSelector' import { GenericSkeletonLoader } from 'components/ui/ShimmeringLoader' import { useDatabasePoliciesQuery } from 'data/database-policies/database-policies-query' import { useTablesQuery } from 'data/tables/tables-query' -import { useCheckPermissions, usePermissionsLoaded } from 'hooks/misc/useCheckPermissions' +import { useAsyncCheckProjectPermissions } from 'hooks/misc/useCheckPermissions' import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import { useUrlState } from 'hooks/ui/useUrlState' import { useIsProtectedSchema } from 'hooks/useProtectedSchemas' @@ -98,8 +98,10 @@ const AuthPoliciesPage: NextPageWithLayout = () => { }) const filteredTables = onFilterTables(tables ?? [], policies ?? [], searchString) - const canReadPolicies = useCheckPermissions(PermissionAction.TENANT_SQL_ADMIN_READ, 'policies') - const isPermissionsLoaded = usePermissionsLoaded() + const { can: canReadPolicies, isSuccess: isPermissionsLoaded } = useAsyncCheckProjectPermissions( + PermissionAction.TENANT_SQL_ADMIN_READ, + 'policies' + ) if (isPermissionsLoaded && !canReadPolicies) { return diff --git a/apps/studio/pages/project/[ref]/auth/protection.tsx b/apps/studio/pages/project/[ref]/auth/protection.tsx index 2e621551171..6a18dee5f60 100644 --- a/apps/studio/pages/project/[ref]/auth/protection.tsx +++ b/apps/studio/pages/project/[ref]/auth/protection.tsx @@ -1,7 +1,7 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' import { useParams } from 'common' -import { ProtectionAuthSettingsForm } from 'components/interfaces/Auth' +import { ProtectionAuthSettingsForm } from 'components/interfaces/Auth/ProtectionAuthSettingsForm/ProtectionAuthSettingsForm' import AuthLayout from 'components/layouts/AuthLayout/AuthLayout' import DefaultLayout from 'components/layouts/DefaultLayout' import { PageLayout } from 'components/layouts/PageLayout/PageLayout' @@ -9,7 +9,7 @@ import { ScaffoldContainer, ScaffoldSection } from 'components/layouts/Scaffold' import NoPermission from 'components/ui/NoPermission' import { GenericSkeletonLoader } from 'components/ui/ShimmeringLoader' import { UnknownInterface } from 'components/ui/UnknownInterface' -import { useCheckPermissions, usePermissionsLoaded } from 'hooks/misc/useCheckPermissions' +import { useAsyncCheckProjectPermissions } from 'hooks/misc/useCheckPermissions' import { useIsFeatureEnabled } from 'hooks/misc/useIsFeatureEnabled' import type { NextPageWithLayout } from 'types' @@ -17,38 +17,40 @@ const ProtectionPage: NextPageWithLayout = () => { const { ref } = useParams() const showAttackProtection = useIsFeatureEnabled('authentication:attack_protection') - const isPermissionsLoaded = usePermissionsLoaded() - const canReadAuthSettings = useCheckPermissions(PermissionAction.READ, 'custom_config_gotrue') + const { can: canReadAuthSettings, isSuccess: isPermissionsLoaded } = + useAsyncCheckProjectPermissions(PermissionAction.READ, 'custom_config_gotrue') if (!showAttackProtection) { return } + if (isPermissionsLoaded && !canReadAuthSettings) { + return + } + return ( - - {isPermissionsLoaded && !canReadAuthSettings ? ( - + + {!isPermissionsLoaded ? ( + + + ) : ( - - {!isPermissionsLoaded ? ( - - - - ) : ( - - )} - + )} - + ) } ProtectionPage.getLayout = (page) => ( - {page} + + + {page} + + ) diff --git a/apps/studio/pages/project/[ref]/auth/providers.tsx b/apps/studio/pages/project/[ref]/auth/providers.tsx index 8c3db26924e..e4f2dfd6a99 100644 --- a/apps/studio/pages/project/[ref]/auth/providers.tsx +++ b/apps/studio/pages/project/[ref]/auth/providers.tsx @@ -1,4 +1,5 @@ -import { AuthProvidersForm, BasicAuthSettingsForm } from 'components/interfaces/Auth' +import { AuthProvidersForm } from 'components/interfaces/Auth/AuthProvidersForm/AuthProvidersForm' +import { BasicAuthSettingsForm } from 'components/interfaces/Auth/BasicAuthSettingsForm/BasicAuthSettingsForm' import { AuthProvidersLayout } from 'components/layouts/AuthLayout/AuthProvidersLayout' import DefaultLayout from 'components/layouts/DefaultLayout' import { ScaffoldContainer } from 'components/layouts/Scaffold' diff --git a/apps/studio/pages/project/[ref]/auth/rate-limits.tsx b/apps/studio/pages/project/[ref]/auth/rate-limits.tsx index 185c000bd4c..9c736babb4d 100644 --- a/apps/studio/pages/project/[ref]/auth/rate-limits.tsx +++ b/apps/studio/pages/project/[ref]/auth/rate-limits.tsx @@ -1,7 +1,7 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' import { useParams } from 'common' -import RateLimits from 'components/interfaces/Auth/RateLimits/RateLimits' +import { RateLimits } from 'components/interfaces/Auth/RateLimits/RateLimits' import AuthLayout from 'components/layouts/AuthLayout/AuthLayout' import DefaultLayout from 'components/layouts/DefaultLayout' import { PageLayout } from 'components/layouts/PageLayout/PageLayout' @@ -10,7 +10,7 @@ import { DocsButton } from 'components/ui/DocsButton' import NoPermission from 'components/ui/NoPermission' import { GenericSkeletonLoader } from 'components/ui/ShimmeringLoader' import { UnknownInterface } from 'components/ui/UnknownInterface' -import { useCheckPermissions, usePermissionsLoaded } from 'hooks/misc/useCheckPermissions' +import { useAsyncCheckProjectPermissions } from 'hooks/misc/useCheckPermissions' import { useIsFeatureEnabled } from 'hooks/misc/useIsFeatureEnabled' import type { NextPageWithLayout } from 'types' @@ -18,41 +18,43 @@ const RateLimitsPage: NextPageWithLayout = () => { const { ref } = useParams() const showRateLimits = useIsFeatureEnabled('authentication:rate_limits') - const isPermissionsLoaded = usePermissionsLoaded() - const canReadAuthSettings = useCheckPermissions(PermissionAction.READ, 'custom_config_gotrue') + const { can: canReadAuthSettings, isSuccess: isPermissionsLoaded } = + useAsyncCheckProjectPermissions(PermissionAction.READ, 'custom_config_gotrue') if (!showRateLimits) { return } + if (isPermissionsLoaded && !canReadAuthSettings) { + return + } + return ( - - } - > - {isPermissionsLoaded && !canReadAuthSettings ? ( - + + {!isPermissionsLoaded ? ( + + + ) : ( - - {!isPermissionsLoaded ? ( - - - - ) : ( - - )} - + )} - + ) } RateLimitsPage.getLayout = (page) => ( - {page} + + + } + > + {page} + + ) diff --git a/apps/studio/pages/project/[ref]/auth/sessions.tsx b/apps/studio/pages/project/[ref]/auth/sessions.tsx index 4c2fc2e834a..683b111196f 100644 --- a/apps/studio/pages/project/[ref]/auth/sessions.tsx +++ b/apps/studio/pages/project/[ref]/auth/sessions.tsx @@ -1,18 +1,18 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' -import { SessionsAuthSettingsForm } from 'components/interfaces/Auth' +import { SessionsAuthSettingsForm } from 'components/interfaces/Auth/SessionsAuthSettingsForm/SessionsAuthSettingsForm' import AuthLayout from 'components/layouts/AuthLayout/AuthLayout' import DefaultLayout from 'components/layouts/DefaultLayout' import { PageLayout } from 'components/layouts/PageLayout/PageLayout' -import { ScaffoldContainer } from 'components/layouts/Scaffold' +import { ScaffoldContainer, ScaffoldSection } from 'components/layouts/Scaffold' import NoPermission from 'components/ui/NoPermission' import { GenericSkeletonLoader } from 'components/ui/ShimmeringLoader' -import { useCheckPermissions, usePermissionsLoaded } from 'hooks/misc/useCheckPermissions' +import { useAsyncCheckProjectPermissions } from 'hooks/misc/useCheckPermissions' import type { NextPageWithLayout } from 'types' const SessionsPage: NextPageWithLayout = () => { - const isPermissionsLoaded = usePermissionsLoaded() - const canReadAuthSettings = useCheckPermissions(PermissionAction.READ, 'custom_config_gotrue') + const { can: canReadAuthSettings, isSuccess: isPermissionsLoaded } = + useAsyncCheckProjectPermissions(PermissionAction.READ, 'custom_config_gotrue') if (isPermissionsLoaded && !canReadAuthSettings) { return @@ -21,9 +21,9 @@ const SessionsPage: NextPageWithLayout = () => { return ( {!isPermissionsLoaded ? ( -
+ -
+ ) : ( )} diff --git a/apps/studio/pages/project/[ref]/auth/smtp.tsx b/apps/studio/pages/project/[ref]/auth/smtp.tsx index 96175fb6298..b6bd764a908 100644 --- a/apps/studio/pages/project/[ref]/auth/smtp.tsx +++ b/apps/studio/pages/project/[ref]/auth/smtp.tsx @@ -1,21 +1,33 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' -import { SmtpForm } from 'components/interfaces/Auth' +import { SmtpForm } from 'components/interfaces/Auth/SmtpForm/SmtpForm' import { AuthEmailsLayout } from 'components/layouts/AuthLayout/AuthEmailsLayout' import DefaultLayout from 'components/layouts/DefaultLayout' +import { ScaffoldContainer, ScaffoldSection } from 'components/layouts/Scaffold' import NoPermission from 'components/ui/NoPermission' -import { useCheckPermissions, usePermissionsLoaded } from 'hooks/misc/useCheckPermissions' +import { useAsyncCheckProjectPermissions } from 'hooks/misc/useCheckPermissions' import type { NextPageWithLayout } from 'types' +import { GenericSkeletonLoader } from 'ui-patterns' const SmtpPage: NextPageWithLayout = () => { - const canReadAuthSettings = useCheckPermissions(PermissionAction.READ, 'custom_config_gotrue') - const isPermissionsLoaded = usePermissionsLoaded() + const { can: canReadAuthSettings, isSuccess: isPermissionsLoaded } = + useAsyncCheckProjectPermissions(PermissionAction.READ, 'custom_config_gotrue') if (isPermissionsLoaded && !canReadAuthSettings) { return } - return + return ( + + {!isPermissionsLoaded ? ( + + + + ) : ( + + )} + + ) } SmtpPage.getLayout = (page) => ( diff --git a/apps/studio/pages/project/[ref]/auth/templates.tsx b/apps/studio/pages/project/[ref]/auth/templates.tsx index 35468f065c6..8ac5ec3aacd 100644 --- a/apps/studio/pages/project/[ref]/auth/templates.tsx +++ b/apps/studio/pages/project/[ref]/auth/templates.tsx @@ -1,15 +1,17 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' -import { EmailTemplates } from 'components/interfaces/Auth' + +import { EmailTemplates } from 'components/interfaces/Auth/EmailTemplates/EmailTemplates' import { AuthEmailsLayout } from 'components/layouts/AuthLayout/AuthEmailsLayout' import DefaultLayout from 'components/layouts/DefaultLayout' -import { ScaffoldContainer } from 'components/layouts/Scaffold' +import { ScaffoldContainer, ScaffoldSection } from 'components/layouts/Scaffold' import NoPermission from 'components/ui/NoPermission' -import { useCheckPermissions, usePermissionsLoaded } from 'hooks/misc/useCheckPermissions' +import { useAsyncCheckProjectPermissions } from 'hooks/misc/useCheckPermissions' import type { NextPageWithLayout } from 'types' +import { GenericSkeletonLoader } from 'ui-patterns' const TemplatesPage: NextPageWithLayout = () => { - const canReadAuthSettings = useCheckPermissions(PermissionAction.READ, 'custom_config_gotrue') - const isPermissionsLoaded = usePermissionsLoaded() + const { can: canReadAuthSettings, isSuccess: isPermissionsLoaded } = + useAsyncCheckProjectPermissions(PermissionAction.READ, 'custom_config_gotrue') if (isPermissionsLoaded && !canReadAuthSettings) { return @@ -17,7 +19,13 @@ const TemplatesPage: NextPageWithLayout = () => { return ( - + {!isPermissionsLoaded ? ( + + + + ) : ( + + )} ) } diff --git a/apps/studio/pages/project/[ref]/auth/third-party.tsx b/apps/studio/pages/project/[ref]/auth/third-party.tsx index fdfbcc79f4c..fac8db8e2a3 100644 --- a/apps/studio/pages/project/[ref]/auth/third-party.tsx +++ b/apps/studio/pages/project/[ref]/auth/third-party.tsx @@ -1,21 +1,21 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' import { useParams } from 'common' -import { ThirdPartyAuthForm } from 'components/interfaces/Auth' +import { ThirdPartyAuthForm } from 'components/interfaces/Auth/ThirdPartyAuthForm' import AuthLayout from 'components/layouts/AuthLayout/AuthLayout' import { AuthProvidersLayout } from 'components/layouts/AuthLayout/AuthProvidersLayout' import DefaultLayout from 'components/layouts/DefaultLayout' import { ScaffoldContainer } from 'components/layouts/Scaffold' import NoPermission from 'components/ui/NoPermission' import { UnknownInterface } from 'components/ui/UnknownInterface' -import { useCheckPermissions, usePermissionsLoaded } from 'hooks/misc/useCheckPermissions' +import { useAsyncCheckProjectPermissions } from 'hooks/misc/useCheckPermissions' import { useIsFeatureEnabled } from 'hooks/misc/useIsFeatureEnabled' import type { NextPageWithLayout } from 'types' const ThirdPartyPage: NextPageWithLayout = () => { const { ref } = useParams() - const canReadAuthSettings = useCheckPermissions(PermissionAction.READ, 'custom_config_gotrue') - const isPermissionsLoaded = usePermissionsLoaded() + const { can: canReadAuthSettings, isSuccess: isPermissionsLoaded } = + useAsyncCheckProjectPermissions(PermissionAction.READ, 'custom_config_gotrue') const showThirdPartyAuth = useIsFeatureEnabled('authentication:third_party_auth') diff --git a/apps/studio/pages/project/[ref]/auth/url-configuration.tsx b/apps/studio/pages/project/[ref]/auth/url-configuration.tsx index 04c97180f56..81df0a87cd9 100644 --- a/apps/studio/pages/project/[ref]/auth/url-configuration.tsx +++ b/apps/studio/pages/project/[ref]/auth/url-configuration.tsx @@ -5,15 +5,15 @@ import SiteUrl from 'components/interfaces/Auth/SiteUrl/SiteUrl' import AuthLayout from 'components/layouts/AuthLayout/AuthLayout' import DefaultLayout from 'components/layouts/DefaultLayout' import { PageLayout } from 'components/layouts/PageLayout/PageLayout' -import { ScaffoldContainer } from 'components/layouts/Scaffold' +import { ScaffoldContainer, ScaffoldSection } from 'components/layouts/Scaffold' import NoPermission from 'components/ui/NoPermission' import { GenericSkeletonLoader } from 'components/ui/ShimmeringLoader' -import { useCheckPermissions, usePermissionsLoaded } from 'hooks/misc/useCheckPermissions' +import { useAsyncCheckProjectPermissions } from 'hooks/misc/useCheckPermissions' import type { NextPageWithLayout } from 'types' const URLConfiguration: NextPageWithLayout = () => { - const isPermissionsLoaded = usePermissionsLoaded() - const canReadAuthSettings = useCheckPermissions(PermissionAction.READ, 'custom_config_gotrue') + const { can: canReadAuthSettings, isSuccess: isPermissionsLoaded } = + useAsyncCheckProjectPermissions(PermissionAction.READ, 'custom_config_gotrue') if (isPermissionsLoaded && !canReadAuthSettings) { return @@ -22,9 +22,9 @@ const URLConfiguration: NextPageWithLayout = () => { return ( {!isPermissionsLoaded ? ( -
+ -
+ ) : ( <>