import { useEffect, useState } from 'react'; import { ConnectedProps, connect } from 'react-redux'; import { useParams } from 'react-router-dom-v5-compat'; import { NavModelItem, getTimeZone } from '@grafana/data'; import { Trans, t } from '@grafana/i18n'; import { Button, ConfirmModal, IconButton, Stack } from '@grafana/ui'; import { Page } from 'app/core/components/Page/Page'; import { contextSrv } from 'app/core/core'; import { AccessControlAction, ApiKey, ServiceAccountDTO, StoreState } from 'app/types'; import { ServiceAccountPermissions } from './ServiceAccountPermissions'; import { CreateTokenModal, ServiceAccountToken } from './components/CreateTokenModal'; import { ServiceAccountProfile } from './components/ServiceAccountProfile'; import { ServiceAccountTokensTable } from './components/ServiceAccountTokensTable'; import { fetchACOptions } from './state/actions'; import { createServiceAccountToken, deleteServiceAccount, deleteServiceAccountToken, loadServiceAccount, loadServiceAccountTokens, updateServiceAccount, } from './state/actionsServiceAccountPage'; interface OwnProps { serviceAccount?: ServiceAccountDTO; tokens: ApiKey[]; isLoading: boolean; } function mapStateToProps(state: StoreState) { return { serviceAccount: state.serviceAccountProfile.serviceAccount, tokens: state.serviceAccountProfile.tokens, isLoading: state.serviceAccountProfile.isLoading, timezone: getTimeZone(state.user), }; } const mapDispatchToProps = { createServiceAccountToken, deleteServiceAccount, deleteServiceAccountToken, loadServiceAccount, loadServiceAccountTokens, updateServiceAccount, }; const connector = connect(mapStateToProps, mapDispatchToProps); export type Props = OwnProps & ConnectedProps; export const ServiceAccountPageUnconnected = ({ serviceAccount, tokens, timezone, isLoading, createServiceAccountToken, deleteServiceAccount, deleteServiceAccountToken, loadServiceAccount, loadServiceAccountTokens, updateServiceAccount, }: Props): JSX.Element => { const [newToken, setNewToken] = useState(''); const [isTokenModalOpen, setIsTokenModalOpen] = useState(false); const [isDeleteModalOpen, setIsDeleteModalOpen] = useState(false); const [isDisableModalOpen, setIsDisableModalOpen] = useState(false); const { id = '' } = useParams(); const tokenActionsDisabled = serviceAccount.isDisabled || serviceAccount.isExternal || !contextSrv.hasPermission(AccessControlAction.ServiceAccountsWrite); const ableToWrite = contextSrv.hasPermission(AccessControlAction.ServiceAccountsWrite); const canReadPermissions = contextSrv.hasPermissionInMetadata( AccessControlAction.ServiceAccountsPermissionsRead, serviceAccount! ); const pageNav: NavModelItem = { text: serviceAccount.name, img: serviceAccount.avatarUrl, subTitle: t( 'serviceaccounts.service-account-page-unconnected.page-nav.subTitle.manage-settings-individual-service-account', 'Manage settings for an individual service account.' ), }; useEffect(() => { loadServiceAccount(id); loadServiceAccountTokens(id); if (contextSrv.licensedAccessControlEnabled()) { fetchACOptions(); } }, [loadServiceAccount, loadServiceAccountTokens, id]); const onProfileChange = (serviceAccount: ServiceAccountDTO) => { updateServiceAccount(serviceAccount); }; const showDeleteServiceAccountModal = (show: boolean) => () => { setIsDeleteModalOpen(show); }; const showDisableServiceAccountModal = (show: boolean) => () => { setIsDisableModalOpen(show); }; const handleServiceAccountDelete = () => { deleteServiceAccount(serviceAccount.uid); }; const handleServiceAccountDisable = () => { updateServiceAccount({ ...serviceAccount, isDisabled: true }); setIsDisableModalOpen(false); }; const handleServiceAccountEnable = () => { updateServiceAccount({ ...serviceAccount, isDisabled: false }); }; const onDeleteServiceAccountToken = (key: ApiKey) => { deleteServiceAccountToken(serviceAccount?.uid, key.id!); }; const onCreateToken = (token: ServiceAccountToken) => { createServiceAccountToken(serviceAccount?.uid, token, setNewToken); }; const onTokenModalClose = () => { setIsTokenModalOpen(false); setNewToken(''); }; return (
{serviceAccount && !serviceAccount.isExternal && ( {serviceAccount.isDisabled ? ( ) : ( )} )} {serviceAccount && serviceAccount.isExternal && ( )} {serviceAccount && ( )}

Tokens

{!serviceAccount.isExternal && ( )}
{tokens && ( )} {!serviceAccount.isExternal && canReadPermissions && ( )}
); }; export default connector(ServiceAccountPageUnconnected);