import React from "react"; import { z } from "zod"; import { useForm, zodResolver } from "@mantine/form"; import { Box, Button, Group, Stack, Switch, Textarea, TextInput, } from "@mantine/core"; import { buildCallbackUrl, buildSamlEntityId, } from "@/ee/security/sso.utils.ts"; import classes from "@/ee/security/components/sso.module.css"; import { IAuthProvider } from "@/ee/security/types/security.types.ts"; import CopyTextButton from "@/components/common/copy.tsx"; import { useTranslation } from "react-i18next"; import { useUpdateSsoProviderMutation } from "@/ee/security/queries/security-query.ts"; const ssoSchema = z.object({ name: z.string().min(1, "Display name is required"), samlUrl: z.string().url(), samlCertificate: z.string().min(1, "SAML Idp Certificate is required"), isEnabled: z.boolean(), allowSignup: z.boolean(), }); type SSOFormValues = z.infer; interface SsoFormProps { provider: IAuthProvider; onClose?: () => void; } export function SsoSamlForm({ provider, onClose }: SsoFormProps) { const { t } = useTranslation(); const updateSsoProviderMutation = useUpdateSsoProviderMutation(); const form = useForm({ initialValues: { name: provider.name || "", samlUrl: provider.samlUrl || "", samlCertificate: provider.samlCertificate || "", isEnabled: provider.isEnabled, allowSignup: provider.allowSignup, }, validate: zodResolver(ssoSchema), }); const callbackUrl = buildCallbackUrl({ providerId: provider.id, type: provider.type, }); const samlEntityId = buildSamlEntityId(provider.id); const handleSubmit = async (values: SSOFormValues) => { const ssoData: Partial = { providerId: provider.id, }; if (form.isDirty("name")) { ssoData.name = values.name; } if (form.isDirty("samlUrl")) { ssoData.samlUrl = values.samlUrl; } if (form.isDirty("samlCertificate")) { ssoData.samlCertificate = values.samlCertificate; } if (form.isDirty("isEnabled")) { ssoData.isEnabled = values.isEnabled; } if (form.isDirty("allowSignup")) { ssoData.allowSignup = values.allowSignup; } await updateSsoProviderMutation.mutateAsync(ssoData); form.resetDirty(); onClose(); }; return (
} pointer readOnly /> } />