import type UserConsentRepresentation from "@keycloak/keycloak-admin-client/lib/defs/userConsentRepresentation"; import { AlertVariant, ButtonVariant, Chip, ChipGroup, } from "@patternfly/react-core"; import { CubesIcon } from "@patternfly/react-icons"; import { cellWidth } from "@patternfly/react-table"; import { sortBy } from "lodash-es"; import { useState } from "react"; import { useTranslation } from "react-i18next"; import { adminClient } from "../admin-client"; import { useAlerts } from "../components/alert/Alerts"; import { useConfirmDialog } from "../components/confirm-dialog/ConfirmDialog"; import { ListEmptyState } from "../components/list-empty-state/ListEmptyState"; import { Action, KeycloakDataTable, } from "../components/table-toolbar/KeycloakDataTable"; import { emptyFormatter } from "../util"; import useFormatDate from "../utils/useFormatDate"; import { useParams } from "../utils/useParams"; export const UserConsents = () => { const [selectedClient, setSelectedClient] = useState(); const { t } = useTranslation("roles"); const { addAlert, addError } = useAlerts(); const formatDate = useFormatDate(); const [key, setKey] = useState(0); const { id } = useParams<{ id: string }>(); const alphabetize = (consentsList: UserConsentRepresentation[]) => { return sortBy(consentsList, (client) => client.clientId?.toUpperCase()); }; const refresh = () => setKey(new Date().getTime()); const loader = async () => { const getConsents = await adminClient.users.listConsents({ id }); return alphabetize(getConsents); }; const clientScopesRenderer = ({ grantedClientScopes, }: UserConsentRepresentation) => { return ( {grantedClientScopes!.map((currentChip) => ( {currentChip} ))} ); }; const [toggleDeleteDialog, DeleteConfirm] = useConfirmDialog({ titleKey: "users:revokeClientScopesTitle", messageKey: t("users:revokeClientScopes", { clientId: selectedClient?.clientId, }), continueButtonLabel: "common:revoke", continueButtonVariant: ButtonVariant.danger, onConfirm: async () => { try { await adminClient.users.revokeConsent({ id, clientId: selectedClient!.clientId!, }); refresh(); addAlert(t("deleteGrantsSuccess"), AlertVariant.success); } catch (error) { addError("roles:deleteGrantsError", error); } }, }); return ( <> createDate ? formatDate(new Date(createDate)) : "—", }, { name: "lastUpdatedDate", displayKey: "clients:lastUpdated", transforms: [cellWidth(10)], cellRenderer: ({ lastUpdatedDate }) => lastUpdatedDate ? formatDate(new Date(lastUpdatedDate)) : "—", }, ]} actions={[ { title: t("users:revoke"), onRowClick: (client) => { setSelectedClient(client); toggleDeleteDialog(); }, } as Action, ]} emptyState={ } /> ); };