import React, { useEffect, useState } from "react"; import { useHistory } from "react-router-dom"; import { useTranslation } from "react-i18next"; import { Controller, useForm } from "react-hook-form"; import { ActionGroup, AlertVariant, Button, ButtonVariant, ClipboardCopy, DropdownItem, DropdownSeparator, FormGroup, PageSection, Select, SelectOption, SelectVariant, Stack, StackItem, Switch, Tab, Tabs, TabTitleText, TextInput, } from "@patternfly/react-core"; import RealmRepresentation from "keycloak-admin/lib/defs/realmRepresentation"; import { getBaseUrl, toUpperCase } from "../util"; import { useConfirmDialog } from "../components/confirm-dialog/ConfirmDialog"; import { useAdminClient, asyncStateFetch } from "../context/auth/AdminClient"; import { useRealm } from "../context/realm-context/RealmContext"; import { ViewHeader } from "../components/view-header/ViewHeader"; import { useAlerts } from "../components/alert/Alerts"; import { FormAccess } from "../components/form-access/FormAccess"; import { HelpItem } from "../components/help-enabler/HelpItem"; import { FormattedLink } from "../components/external-link/FormattedLink"; type RealmSettingsHeaderProps = { onChange: (...event: any[]) => void; value: boolean; save: () => void; realmName: string; }; const RealmSettingsHeader = ({ save, onChange, value, realmName, }: RealmSettingsHeaderProps) => { const { t } = useTranslation("realm-settings"); const adminClient = useAdminClient(); const { addAlert } = useAlerts(); const history = useHistory(); const { setRealm } = useRealm(); const [toggleDisableDialog, DisableConfirm] = useConfirmDialog({ titleKey: "realm-settings:disableConfirmTitle", messageKey: "realm-settings:disableConfirm", continueButtonLabel: "common:disable", onConfirm: () => { onChange(!value); save(); }, }); const [toggleDeleteDialog, DeleteConfirm] = useConfirmDialog({ titleKey: "realm-settings:deleteConfirmTitle", messageKey: "realm-settings:deleteConfirm", continueButtonLabel: "common:delete", continueButtonVariant: ButtonVariant.danger, onConfirm: async () => { try { await adminClient.realms.del({ realm: realmName }); addAlert(t("deletedSuccess"), AlertVariant.success); setRealm("master"); history.push("/master"); } catch (error) { addAlert(t("deleteError", { error }), AlertVariant.danger); } }, }); return ( <> {}}> {t("partialImport")} , {}}> {t("partialExport")} , , {t("common:delete")} , ]} isEnabled={value} onToggle={(value) => { if (!value) { toggleDisableDialog(); } else { onChange(value); save(); } }} /> ); }; const requireSslTypes = ["all", "external", "none"]; export const RealmSettingsSection = () => { const { t } = useTranslation("realm-settings"); const adminClient = useAdminClient(); const { realm: realmName } = useRealm(); const { addAlert } = useAlerts(); const { register, control, getValues, setValue, handleSubmit } = useForm(); const [realm, setRealm] = useState(); const [activeTab, setActiveTab] = useState(0); const [open, setOpen] = useState(false); const baseUrl = getBaseUrl(adminClient); useEffect(() => { return asyncStateFetch( () => adminClient.realms.findOne({ realm: realmName }), (realm) => { setRealm(realm); setupForm(realm); } ); }, []); const setupForm = (realm: RealmRepresentation) => { Object.entries(realm).map((entry) => setValue(entry[0], entry[1])); }; const save = async (realm: RealmRepresentation) => { try { await adminClient.realms.update({ realm: realmName }, realm); setRealm(realm); addAlert(t("saveSuccess"), AlertVariant.success); } catch (error) { addAlert(t("saveError", { error }), AlertVariant.danger); } }; return ( <> ( save(getValues())} /> )} /> setActiveTab(key as number)} isBox > {t("general")}}> {realmName} } > } > ( )} /> } fieldId="kc-user-manged-access" > ( )} /> } fieldId="kc-endpoints" > ); };