import { PermissionAction } from '@supabase/shared-types/out/constants' import { observer } from 'mobx-react-lite' import { useEffect } from 'react' import { AlertDescription_Shadcn_, AlertTitle_Shadcn_, Alert_Shadcn_, Form, IconAlertCircle, InputNumber, Toggle, } from 'ui' import { boolean, number, object } from 'yup' import { useParams } from 'common' import { FormActions, FormHeader, FormPanel, FormSection, FormSectionContent, FormSectionLabel, } from 'components/ui/Forms' import { useAuthConfigQuery } from 'data/auth/auth-config-query' import { useAuthConfigUpdateMutation } from 'data/auth/auth-config-update-mutation' import { useCheckPermissions, useStore } from 'hooks' const schema = object({ JWT_EXP: number() .max(604800, 'Must be less than 604800') .required('Must have a JWT expiry value'), REFRESH_TOKEN_ROTATION_ENABLED: boolean().required(), SECURITY_REFRESH_TOKEN_REUSE_INTERVAL: number() .min(0, 'Must be a value more than 0') .required('Must have a Reuse Interval value'), MFA_MAX_ENROLLED_FACTORS: number() .min(0, 'Must be be a value more than 0') .max(30, 'Must be a value less than 30'), }) const AdvancedAuthSettingsForm = observer(() => { const { ui } = useStore() const { ref: projectRef } = useParams() const { data: authConfig, error: authConfigError, isLoading, isError, isSuccess, } = useAuthConfigQuery({ projectRef }) const { mutate: updateAuthConfig, isLoading: isUpdatingConfig } = useAuthConfigUpdateMutation() const formId = 'auth-config-advanced-form' const canUpdateConfig = useCheckPermissions(PermissionAction.UPDATE, 'custom_config_gotrue') const INITIAL_VALUES = { SITE_URL: authConfig?.SITE_URL, JWT_EXP: authConfig?.JWT_EXP, REFRESH_TOKEN_ROTATION_ENABLED: authConfig?.REFRESH_TOKEN_ROTATION_ENABLED || false, SECURITY_REFRESH_TOKEN_REUSE_INTERVAL: authConfig?.SECURITY_REFRESH_TOKEN_REUSE_INTERVAL, MFA_MAX_ENROLLED_FACTORS: authConfig?.MFA_MAX_ENROLLED_FACTORS || 10, } const onSubmit = (values: any, { resetForm }: any) => { const payload = { ...values } updateAuthConfig( { projectRef: projectRef!, config: payload }, { onError: (error) => { ui.setNotification({ category: 'error', message: `Failed to update settings: ${error?.message}`, }) }, onSuccess: () => { ui.setNotification({ category: 'success', message: `Successfully updated settings`, }) resetForm({ values: values, initialValues: values }) }, } ) } if (isError) { return ( Failed to retrieve auth configuration {authConfigError.message} ) } return (
{({ handleReset, resetForm, values, initialValues }: any) => { const hasChanges = JSON.stringify(values) !== JSON.stringify(initialValues) // Form is reset once remote data is loaded in store useEffect(() => { if (isSuccess) resetForm({ values: INITIAL_VALUES, initialValues: INITIAL_VALUES }) }, [isSuccess]) return ( <> } > Access Tokens (JWT)}> seconds} disabled={!canUpdateConfig} /> Refresh Tokens}> {values.REFRESH_TOKEN_ROTATION_ENABLED && ( seconds} disabled={!canUpdateConfig} /> )} Multi-Factor Authentication (MFA)} > ) }} ) }) export default AdvancedAuthSettingsForm