import { useState } from "react"; import { useTranslation } from "react-i18next"; import { Controller, FormProvider, useForm, useFormContext, } from "react-hook-form"; import { Button, ButtonVariant, Form, FormGroup, Modal, ModalVariant, Select, SelectOption, SelectVariant, Text, TextContent, } from "@patternfly/react-core"; import type KeyStoreConfig from "@keycloak/keycloak-admin-client/lib/defs/keystoreConfig"; import { HelpItem } from "../../components/help-enabler/HelpItem"; import { StoreSettings } from "./StoreSettings"; import { FileUpload } from "../../components/json-file-upload/patternfly/FileUpload"; import { useServerInfo } from "../../context/server-info/ServerInfoProvider"; type GenerateKeyDialogProps = { clientId: string; toggleDialog: () => void; save: (keyStoreConfig: KeyStoreConfig) => void; }; type KeyFormProps = { useFile?: boolean; isSaml?: boolean; hasPem?: boolean; }; const CERT_PEM = "Certificate PEM" as const; const extensions = new Map([ ["PKCS12", "p12"], ["JKS", "jks"], ["BCFKS", "bcfks"], ]); type FormFields = KeyStoreConfig & { file: string | File; }; export const getFileExtension = (format: string) => extensions.get(format); export const KeyForm = ({ isSaml = false, hasPem = false, useFile = false, }: KeyFormProps) => { const { t } = useTranslation("clients"); const [filename, setFilename] = useState(); const [openArchiveFormat, setOpenArchiveFormat] = useState(false); const { control, watch } = useFormContext(); const format = watch("format"); const { cryptoInfo } = useServerInfo(); const supportedKeystoreTypes = [ ...(cryptoInfo?.supportedKeystoreTypes ?? []), ...(hasPem ? CERT_PEM : []), ]; return (
} fieldId="archiveFormat" > ( )} /> {useFile && ( } fieldId="importFile" > ( { setFilename(filename); field.onChange(value); }} /> )} /> )} {format !== CERT_PEM && ( )} ); }; export const GenerateKeyDialog = ({ clientId, save, toggleDialog, }: GenerateKeyDialogProps) => { const { t } = useTranslation("clients"); const form = useForm({ defaultValues: { keyAlias: clientId }, mode: "onChange", }); const { handleSubmit, formState: { isValid }, } = form; return ( { handleSubmit((config) => { save(config); toggleDialog(); })(); }} > {t("generate")} , , ]} > {t("clients-help:generateKeysDescription")} ); };