/* eslint-disable */ // @ts-nocheck import type FederatedIdentityRepresentation from "@keycloak/keycloak-admin-client/lib/defs/federatedIdentityRepresentation"; import type IdentityProviderRepresentation from "@keycloak/keycloak-admin-client/lib/defs/identityProviderRepresentation"; import type { IdentityProvidersQuery } from "@keycloak/keycloak-admin-client/lib/resources/identityProviders"; import { AlertVariant, Button, ButtonVariant, Label, PageSection, Text, TextContent, Spinner, } from "../../shared/@patternfly/react-core"; import { cellWidth } from "../../shared/@patternfly/react-table"; import { capitalize } from "lodash-es"; import { useState } from "react"; import { useTranslation } from "react-i18next"; import { Link } from "react-router-dom"; import { FormPanel } from "../../shared/keycloak-ui-shared"; import { useAdminClient } from "../admin-client"; import { useAlerts, useFetch } from "../../shared/keycloak-ui-shared"; import { useConfirmDialog } from "../components/confirm-dialog/ConfirmDialog"; import { KeycloakDataTable } from "../../shared/keycloak-ui-shared"; import { useRealm } from "../context/realm-context/RealmContext"; import { useServerInfo } from "../context/server-info/ServerInfoProvider"; import { toIdentityProvider } from "../identity-providers/routes/IdentityProvider"; import { emptyFormatter, upperCaseFormatter } from "../util"; import { UserIdpModal } from "./UserIdPModal"; import { useAccess } from "../context/access/Access"; type UserIdentityProviderLinksProps = { userId: string; }; export const UserIdentityProviderLinks = ({ userId, }: UserIdentityProviderLinksProps) => { const { adminClient } = useAdminClient(); const [key, setKey] = useState(0); const [linkedNames, setLinkedNames] = useState([]); const [isLoading, setIsLoading] = useState(true); const [federatedId, setFederatedId] = useState(""); const [isLinkIdPModalOpen, setIsLinkIdPModalOpen] = useState(false); const { realm } = useRealm(); const { addAlert, addError } = useAlerts(); const { t } = useTranslation(); const { hasAccess, hasSomeAccess } = useAccess(); const canQueryIDPDetails = hasSomeAccess( "manage-identity-providers", "view-identity-providers", ); useFetch( () => adminClient.users.listFederatedIdentities({ id: userId }), (linkedIdentities) => { setLinkedNames( linkedIdentities.map((identity) => identity.identityProvider!), ); setIsLoading(false); }, [userId, key], ); const refresh = () => { setKey(new Date().getTime()); setIsLoading(true); }; type WithProviderId = FederatedIdentityRepresentation & { providerId: string; }; const identityProviders = useServerInfo().identityProviders; const getFederatedIdentities = async () => { const allFedIds = (await adminClient.users.listFederatedIdentities({ id: userId, })) as WithProviderId[]; if (canQueryIDPDetails) { const allProviders = await adminClient.identityProviders.find(); for (const element of allFedIds) { element.providerId = allProviders.find( (item) => item.alias === element.identityProvider, )?.providerId!; } } return allFedIds; }; const linkedIdPsLoader = async () => { return getFederatedIdentities(); }; const availableIdPsLoader = async ( first?: number, max?: number, search?: string, ) => { const params: IdentityProvidersQuery = { first: first!, max: max!, realmOnly: false, capability: "USER_LINKING", }; if (search) { params.search = search; } return await adminClient.identityProviders.find(params); }; const [toggleUnlinkDialog, UnlinkConfirm] = useConfirmDialog({ titleKey: t("unlinkAccountTitle", { provider: capitalize(federatedId), }), messageKey: t("unlinkAccountConfirm", { provider: capitalize(federatedId), }), continueButtonLabel: "unlink", continueButtonVariant: ButtonVariant.primary, onConfirm: async () => { try { await adminClient.users.delFromFederatedIdentity({ id: userId, federatedIdentityId: federatedId, }); addAlert(t("idpUnlinkSuccess"), AlertVariant.success); refresh(); } catch (error) { addError("mappingDeletedError", error); } }, }); const idpLinkRenderer = (idp: WithProviderId) => { if (!canQueryIDPDetails) return {capitalize(idp.identityProvider)}; 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) => { if (!hasAccess("manage-users")) return ; return ( ); }; const linkRenderer = (idp: IdentityProviderRepresentation) => { if (linkedNames.includes(idp.alias!)) return ; return ( ); }; const linkedIdpColumns = () => { const columns = [ { name: "identityProvider", displayKey: "name", cellRenderer: idpLinkRenderer, transforms: [cellWidth(20)], }, { name: "userId", displayKey: "userID", cellFormatters: [emptyFormatter()], transforms: [cellWidth(30)], }, { name: "userName", displayKey: "username", cellFormatters: [emptyFormatter()], transforms: [cellWidth(20)], }, { name: "", cellRenderer: unlinkRenderer, transforms: [cellWidth(20)], }, ]; if (canQueryIDPDetails) columns.splice(1, 0, { name: "type", displayKey: "type", cellRenderer: badgeRenderer1, transforms: [cellWidth(10)], }); return columns; }; return ( <> {isLinkIdPModalOpen && ( setIsLinkIdPModalOpen(false)} onRefresh={refresh} /> )} {t("linkedIdPsText")} {t("noProvidersLinked")} } /> {hasAccess("manage-users") && canQueryIDPDetails && ( {t("availableIdPsText")} {isLoading ? ( ) : ( {t("noAvailableIdentityProviders")} } /> )} )} ); };