@keycloakify/keycloak-admin-ui
Version:
Repackaged Keycloak Admin UI
74 lines • 4.25 kB
JavaScript
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
import { fetchWithError } from "@keycloak/keycloak-admin-client";
import { Language } from "@patternfly/react-code-editor";
import { ActionGroup, AlertVariant, Button, PageSection, } from "@patternfly/react-core";
import { useState } from "react";
import { FormProvider, useForm } from "react-hook-form";
import { useTranslation } from "react-i18next";
import { Link, useNavigate } from "react-router-dom";
import { FormSubmitButton, TextControl } from "../../ui-shared";
import { useAdminClient } from "../../admin-client";
import { useAlerts } from "../../ui-shared";
import { FormAccess } from "../../components/form/FormAccess";
import { FileUploadForm } from "../../components/json-file-upload/FileUploadForm";
import { ViewHeader } from "../../components/view-header/ViewHeader";
import { useRealm } from "../../context/realm-context/RealmContext";
import { addTrailingSlash, convertFormValuesToObject, convertToFormValues, } from "../../util";
import { getAuthorizationHeaders } from "../../utils/getAuthorizationHeaders";
import { ClientDescription } from "../../clients/ClientDescription";
import { CapabilityConfig } from "../../clients/add/CapabilityConfig";
import { toClient } from "../../clients/routes/Client";
import { toClients } from "../../clients/routes/Clients";
const isXml = (text) => text.match(/(<.[^(><.)]+>)/g);
export default function ImportForm() {
const { adminClient } = useAdminClient();
const { t } = useTranslation();
const navigate = useNavigate();
const { realm } = useRealm();
const form = useForm();
const { handleSubmit, setValue, formState } = form;
const [imported, setImported] = useState({});
const { addAlert, addError } = useAlerts();
const handleFileChange = async (contents) => {
try {
const parsed = await parseFileContents(contents);
convertToFormValues(parsed, setValue);
setImported(parsed);
}
catch (error) {
addError("importParseError", error);
}
};
async function parseFileContents(contents) {
if (!isXml(contents)) {
return JSON.parse(contents);
}
const response = await fetchWithError(`${addTrailingSlash(adminClient.baseUrl)}admin/realms/${realm}/client-description-converter`, {
method: "POST",
body: contents,
headers: getAuthorizationHeaders(await adminClient.getAccessToken()),
});
if (!response.ok) {
throw new Error(`Server responded with invalid status: ${response.statusText}`);
}
return response.json();
}
const save = async (client) => {
try {
const newClient = await adminClient.clients.create({
...imported,
...convertFormValuesToObject({
...client,
attributes: client.attributes || {},
}),
});
addAlert(t("clientImportSuccess"), AlertVariant.success);
navigate(toClient({ realm, clientId: newClient.id, tab: "settings" }));
}
catch (error) {
addError("clientImportError", error);
}
};
return (_jsxs(_Fragment, { children: [_jsx(ViewHeader, { titleKey: "importClient", subKey: "clientsExplain" }), _jsx(PageSection, { variant: "light", children: _jsx(FormAccess, { isHorizontal: true, onSubmit: handleSubmit(save), role: "manage-clients", children: _jsxs(FormProvider, { ...form, children: [_jsx(FileUploadForm, { id: "realm-file", language: Language.json, extension: ".json,.xml", helpText: t("helpFileUploadClient"), onChange: handleFileChange }), _jsx(ClientDescription, { hasConfigureAccess: true }), _jsx(TextControl, { name: "protocol", label: t("type"), readOnly: true }), _jsx(CapabilityConfig, { unWrap: true }), _jsxs(ActionGroup, { children: [_jsx(FormSubmitButton, { formState: formState, allowInvalid: true, allowNonDirty: true, children: t("save") }), _jsx(Button, { variant: "link", component: (props) => (_jsx(Link, { ...props, to: toClients({ realm }) })), children: t("cancel") })] })] }) }) })] }));
}
//# sourceMappingURL=ImportForm.js.map