import React, { useState } from "react";
import { useTranslation } from "react-i18next";
import {
AlertVariant,
Button,
ButtonVariant,
Label,
PageSection,
Text,
TextContent,
} from "@patternfly/react-core";
import { FormPanel } from "../components/scroll-form/FormPanel";
import { KeycloakDataTable } from "../components/table-toolbar/KeycloakDataTable";
import { cellWidth } from "@patternfly/react-table";
import { Link, useParams } from "react-router-dom";
import { useAdminClient } from "../context/auth/AdminClient";
import { emptyFormatter, upperCaseFormatter } from "../util";
import type IdentityProviderRepresentation from "@keycloak/keycloak-admin-client/lib/defs/identityProviderRepresentation";
import type FederatedIdentityRepresentation from "@keycloak/keycloak-admin-client/lib/defs/federatedIdentityRepresentation";
import { useRealm } from "../context/realm-context/RealmContext";
import { useServerInfo } from "../context/server-info/ServerInfoProvider";
import _ from "lodash";
import { useConfirmDialog } from "../components/confirm-dialog/ConfirmDialog";
import { useAlerts } from "../components/alert/Alerts";
import { UserIdpModal } from "./UserIdPModal";
import { toIdentityProvider } from "../identity-providers/routes/IdentityProvider";
export const UserIdentityProviderLinks = () => {
const [key, setKey] = useState(0);
const [federatedId, setFederatedId] = useState("");
const [isLinkIdPModalOpen, setIsLinkIdPModalOpen] = useState(false);
const adminClient = useAdminClient();
const { id } = useParams<{ id: string }>();
const { realm } = useRealm();
const { addAlert, addError } = useAlerts();
const { t } = useTranslation("users");
const refresh = () => setKey(new Date().getTime());
const handleModalToggle = () => {
setIsLinkIdPModalOpen(!isLinkIdPModalOpen);
};
type withProviderId = FederatedIdentityRepresentation & {
providerId: string;
};
const identityProviders = useServerInfo().identityProviders;
const getFederatedIdentities = async () => {
const allProviders = await adminClient.identityProviders.find();
const allFedIds = (await adminClient.users.listFederatedIdentities({
id,
})) as unknown as withProviderId[];
for (const element of allFedIds) {
element.providerId = allProviders.find(
(item) => item.alias === element.identityProvider
)?.providerId!;
}
return allFedIds;
};
const getAvailableIdPs = async () => {
return (await adminClient.realms.findOne({ realm })).identityProviders;
};
const linkedIdPsLoader = async () => {
return getFederatedIdentities();
};
const availableIdPsLoader = async () => {
const linkedNames = (await getFederatedIdentities()).map(
(x) => x.identityProvider
);
return (await getAvailableIdPs())?.filter(
(item) => !linkedNames.includes(item.alias)
)!;
};
const [toggleUnlinkDialog, UnlinkConfirm] = useConfirmDialog({
titleKey: t("users:unlinkAccountTitle", {
provider: _.capitalize(federatedId),
}),
messageKey: t("users:unlinkAccountConfirm", {
provider: _.capitalize(federatedId),
}),
continueButtonLabel: "users:unlink",
continueButtonVariant: ButtonVariant.primary,
onConfirm: async () => {
try {
await adminClient.users.delFromFederatedIdentity({
id,
federatedIdentityId: federatedId,
});
addAlert(t("common:mappingDeletedSuccess"), AlertVariant.success);
refresh();
} catch (error) {
addError("common:mappingDeletedError", error);
}
},
});
const idpLinkRenderer = (idp: withProviderId) => {
return (
{_.capitalize(idp.identityProvider)}
);
};
const badgeRenderer1 = (idp: FederatedIdentityRepresentation) => {
const groupName = identityProviders?.find(
(provider) => provider["id"] === idp.identityProvider
)?.groupName!;
return (
);
};
const badgeRenderer2 = (idp: IdentityProviderRepresentation) => {
const groupName = identityProviders?.find(
(provider) => provider["id"] === idp.providerId
)?.groupName!;
return (
);
};
const unlinkRenderer = (fedIdentity: FederatedIdentityRepresentation) => {
return (
);
};
const linkRenderer = (idp: IdentityProviderRepresentation) => {
return (
);
};
return (
<>
{isLinkIdPModalOpen && (
)}
{t("linkedIdPsText")}
{t("users:noProvidersLinked")}
}
/>
{t("availableIdPsText")}
{t("users:noAvailableIdentityProviders")}
}
/>
>
);
};