import React, { useContext, useEffect, useState } from "react"; import { AlertVariant, ButtonVariant, Card, CardTitle, DropdownItem, Gallery, GalleryItem, PageSection, Split, SplitItem, Text, TextContent, TextVariants, } from "@patternfly/react-core"; import ComponentRepresentation from "keycloak-admin/lib/defs/componentRepresentation"; import { KeycloakCard } from "../components/keycloak-card/KeycloakCard"; import { useAlerts } from "../components/alert/Alerts"; import { ViewHeader } from "../components/view-header/ViewHeader"; import { DatabaseIcon } from "@patternfly/react-icons"; import { useTranslation } from "react-i18next"; import { RealmContext } from "../context/realm-context/RealmContext"; import { useAdminClient, asyncStateFetch } from "../context/auth/AdminClient"; import { useConfirmDialog } from "../components/confirm-dialog/ConfirmDialog"; import "./user-federation.css"; import { useHistory, useRouteMatch } from "react-router-dom"; export const UserFederationSection = () => { const [userFederations, setUserFederations] = useState< ComponentRepresentation[] >(); const { addAlert } = useAlerts(); const { t } = useTranslation("user-federation"); const { realm } = useContext(RealmContext); const adminClient = useAdminClient(); const [key, setKey] = useState(0); const refresh = () => setKey(new Date().getTime()); const { url } = useRouteMatch(); const history = useHistory(); useEffect(() => { return asyncStateFetch( () => { const testParams: { [name: string]: string | number } = { parentId: realm, type: "org.keycloak.storage.UserStorageProvider", // MF note that this is providerType in the output, but API call is still type }; return adminClient.components.find(testParams); }, (userFederations) => { setUserFederations(userFederations); } ); }, [key]); const ufAddProviderDropdownItems = [ history.push(`${url}/ldap/new`)}>LDAP, history.push(`${url}/kerberos/new`)}>Kerberos, ]; const learnMoreLinkProps = { title: t("common:learnMore"), href: "https://www.keycloak.org/docs/latest/server_admin/index.html#_user-storage-federation", }; let cards; const [currentCard, setCurrentCard] = useState(""); const [toggleDeleteDialog, DeleteConfirm] = useConfirmDialog({ titleKey: t("userFedDeleteConfirmTitle"), messageKey: t("userFedDeleteConfirm"), continueButtonLabel: "common:delete", continueButtonVariant: ButtonVariant.danger, onConfirm: async () => { try { await adminClient.components.del({ id: currentCard }); refresh(); addAlert(t("userFedDeletedSuccess"), AlertVariant.success); } catch (error) { addAlert(t("userFedDeleteError", { error }), AlertVariant.danger); } }, }); const toggleDeleteForCard = (id: string) => { setCurrentCard(id); toggleDeleteDialog(); }; if (userFederations) { cards = userFederations.map((userFederation, index) => { const ufCardDropdownItems = [ { toggleDeleteForCard(userFederation.id!); }} > {t("common:delete")} , ]; return ( ); }); } return ( <> 0 ? { lowerDropdownItems: ufAddProviderDropdownItems, lowerDropdownMenuTitle: "user-federation:addNewProvider", } : {})} /> {userFederations && userFederations.length > 0 ? ( <> {cards} ) : ( <> {t("getStarted")} {t("providers")}
{t("addKerberos")} {t("addLdap")} )}
); };