import { Alert, AlertVariant, Form, FormGroup, ModalVariant, Select, SelectOption, SelectVariant, Stack, StackItem, TextArea, } from "@patternfly/react-core"; import FileSaver from "file-saver"; import React, { useEffect, useMemo, useState } from "react"; import { useTranslation } from "react-i18next"; import { useAdminClient, useFetch } from "../../context/auth/AdminClient"; import { useServerInfo } from "../../context/server-info/ServerInfoProvider"; import { prettyPrintJSON } from "../../util"; import { ConfirmDialogModal } from "../confirm-dialog/ConfirmDialog"; import { useHelp } from "../help-enabler/HelpHeader"; import { HelpItem } from "../help-enabler/HelpItem"; type DownloadDialogProps = { id: string; protocol?: string; open: boolean; toggleDialog: () => void; }; export const DownloadDialog = ({ id, open, toggleDialog, protocol = "openid-connect", }: DownloadDialogProps) => { const adminClient = useAdminClient(); const { t } = useTranslation("common"); const { enabled } = useHelp(); const serverInfo = useServerInfo(); const configFormats = serverInfo.clientInstallations![protocol]; const [selected, setSelected] = useState( configFormats[configFormats.length - 1].id ); const [snippet, setSnippet] = useState(""); const [openType, setOpenType] = useState(false); const selectedConfig = useMemo( () => configFormats.find((config) => config.id === selected) ?? null, [selected] ); const sanitizeSnippet = (snippet: string) => snippet.replace( /.*<\/PrivateKeyPem>/gs, `${t("clients:privateKeyMask")}` ); useFetch( async () => { const snippet = await adminClient.clients.getInstallationProviders({ id, providerId: selected, }); if (typeof snippet === "string") { return sanitizeSnippet(snippet); } else { return prettyPrintJSON(snippet); } }, (snippet) => setSnippet(snippet), [id, selected] ); // Clear snippet when selected config changes, this prevents old snippets from being displayed during fetch. useEffect(() => setSnippet(""), [id, selected]); return ( { const config = configFormats.find((config) => config.id === selected)!; FileSaver.saveAs( new Blob([snippet], { type: config.mediaType }), config.filename ); }} open={open} toggleDialog={toggleDialog} variant={ModalVariant.medium} >
{enabled && ( { configFormats.find( (configFormat) => configFormat.id === selected )?.helpText } )} } > {!selectedConfig?.downloadOnly && ( } >